- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章mybatis教程之resultmap_动力节点Java学院整理由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
SQL 映射XML 文件是所有sql语句放置的地方。需要定义一个workspace,一般定义为对应的接口类的路径。写好SQL语句映射文件后,需要在MyBAtis配置文件mappers标签中引用,例如:
1
2
3
4
5
6
|
<
mappers
>
<
mapper
resource
=
"com/bjpowernode/manager/data/mappers/UserMapper.xml"
/>
<
mapper
resource
=
"com/bjpowernode/manager/data/mappers/StudentMapper.xml"
/>
<
mapper
resource
=
"com/bjpowernode/manager/data/mappers/ClassMapper.xml"
/>
<
mapper
resource
=
"com/bjpowernode/manager/data/mappers/TeacherMapper.xml"
/>
</
mappers
>
|
当Java接口与XML文件在一个相对路径下时,可以不在myBatis配置文件的mappers中声明。 。
SQL 映射XML 文件一些初级的元素:
1. cache – 配置给定模式的缓存 2. cache-ref – 从别的模式中引用一个缓存 3. resultMap – 这是最复杂而却强大的一个元素了,它描述如何从结果集中加载对象 4. sql – 一个可以被其他语句复用的SQL 块 5. insert – 映射INSERT 语句 6. update – 映射UPDATE 语句 7. delete – 映射DELEETE 语句 8. select - 映射SELECT语句 。
2.1 resultMap 。
resultMap 是MyBatis 中最重要最强大的元素了。你可以让你比使用JDBC 调用结果集省掉90%的代码,也可以让你做许多JDBC 不支持的事。现实上,要写一个等同类似于交互的映射这样的复杂语句,可能要上千行的代码。ResultMaps 的目的,就是这样简单的语句而不需要多余的结果映射,更多复杂的语句,除了只要一些绝对必须的语句描述关系以外,再也不需要其它的.
resultMap属性:type为java实体类;id为此resultMap的标识.
resultMap可以设置的映射:
1. constructor – 用来将结果反射给一个实例化好的类的构造器 。
a) idArg – ID 参数;将结果集标记为ID,以方便全局调用 b) arg –反射到构造器的通常结果 。
2. id – ID 结果,将结果集标记为ID,以方便全局调用 。
3. result – 反射到JavaBean 属性的普通结果 。
4. association – 复杂类型的结合;多个结果合成的类型 。
a) nested result mappings – 几resultMap 自身嵌套关联,也可以引用到一个其它上 。
5. collection –复杂类型集合a collection of complex types 。
6. nested result mappings – resultMap 的集合,也可以引用到一个其它上 。
7. discriminator – 使用一个结果值以决定使用哪个resultMap 。
a) case – 基本一些值的结果映射的case 情形 。
i. nested result mappings –一个case 情形本身就是一个结果映射,因此也可以包括一些相同的元素,也可以引用一个外部resultMap.
id、result 。
id、result是最简单的映射,id为主键映射;result其他基本数据库表字段到实体类属性的映射.
最简单的例子:
1
2
3
4
5
6
7
|
<
resultMap
type
=
"bjpowernodestudentmanagerdatamodelStudentEntity"
id
=
"studentResultMap"
>
<
id
property
=
"studentId"
column
=
"STUDENT_ID"
javaType
=
"String"
jdbcType
=
"VARCHAR"
/>
<
result
property
=
"studentName"
column
=
"STUDENT_NAME"
javaType
=
"String"
jdbcType
=
"VARCHAR"
/>
<
result
property
=
"studentSex"
column
=
"STUDENT_SEX"
javaType
=
"int"
jdbcType
=
"INTEGER"
/>
<
result
property
=
"studentBirthday"
column
=
"STUDENT_BIRTHDAY"
javaType
=
"Date"
jdbcType
=
"DATE"
/>
<
result
property
=
"studentPhoto"
column
=
"STUDENT_PHOTO"
javaType
=
"byte[]"
jdbcType
=
"BLOB"
typeHandler
=
"orgapacheibatistypeBlobTypeHandler"
/>
</
resultMap
>
|
id、result语句属性配置细节:
属性 描述 。
。
属性
|
描述
|
|
property
|
需要映射到JavaBean 的属性名称。
|
|
column
|
数据表的列名或者标签别名。
|
|
javaType
|
一个完整的类名,或者是一个类型别名。如果你匹配的是一个JavaBean,那MyBatis 通常会自行检测到。然后,如果你是要映射到一个HashMap,那你需要指定javaType 要达到的目的。
|
|
jdbcType
|
数据表支持的类型列表。这个属性只在insert,update 或delete 的时候针对允许空的列有用。JDBC 需要这项,但MyBatis 不需要。如果你是直接针对JDBC 编码,且有允许空的列,而你要指定这项。
|
|
typeHandler
|
使用这个属性可以覆写类型处理器。这项值可以是一个完整的类名,也可以是一个类型别名。
|
|
。
支持的JDBC类型 。
为了将来的引用,MyBatis 支持下列JDBC 类型,通过JdbcType 枚举:
BIT,FLOAT,CHAR,TIMESTAMP,OTHER,UNDEFINED,TINYINT,REAL,VARCHAR,BINARY,BLOB,NVARCHAR,SMALLINT,DOUBLE,LONGVARCHAR,VARBINARY,CLOB,NCHAR,INTEGER,NUMERIC,DATE,LONGVARBINARY,BOOLEAN,NCLOB,BIGINT,DECIMAL,TIME,NULL,CURSOR 。
constructor 。
我们使用id、result时候,需要定义java实体类的属性映射到数据库表的字段上。这个时候是使用JavaBean实现的。当然我们也可以使用实体类的构造方法来实现值的映射,这个时候是通过构造方法参数的书写的顺序来进行赋值的.
使用construcotr功能有限(例如使用collection级联查询).
上面使用id、result实现的功能就可以改为:
1
2
3
4
5
6
7
8
|
<
resultMap
type
=
"StudentEntity"
id
=
"studentResultMap"
>
<
constructor
>
<
idArg
javaType
=
"String"
column
=
"STUDENT_ID"
/>
<
arg
javaType
=
"String"
column
=
"STUDENT_NAME"
/>
<
arg
javaType
=
"String"
column
=
"STUDENT_SEX"
/>
<
arg
javaType
=
"Date"
column
=
"STUDENT_BIRTHDAY"
/>
</
constructor
>
</
resultMap
>
|
当然,我们需要定义StudentEntity实体类的构造方法: 。
1
2
3
4
5
6
|
public
StudentEntity(String studentID, String studentName, String studentSex, Date studentBirthday){
this
.studentID = studentID;
this
.studentName = studentName;
this
.studentSex = studentSex;
this
.studentBirthday = studentBirthday;
}
|
association联合 。
联合元素用来处理“一对一”的关系。需要指定映射的Java实体类的属性,属性的javaType(通常MyBatis 自己会识别)。对应的数据库表的列名称。如果想覆写的话返回结果的值,需要指定typeHandler.
不同情况需要告诉MyBatis 如何加载一个联合。MyBatis 可以用两种方式加载:
1. select: 执行一个其它映射的SQL 语句返回一个Java实体类型。较灵活; 。
2. resultsMap: 使用一个嵌套的结果映射来处理通过join查询结果集,映射成Java实体类型.
例如,一个班级对应一个班主任.
首先定义好班级中的班主任属性:
1
|
private
TeacherEntity teacherEntity;
|
使用select实现联合 。
例:班级实体类中有班主任的属性,通过联合在得到一个班级实体时,同时映射出班主任实体。 这样可以直接复用在TeacherMapper.xml文件中定义好的查询teacher根据其ID的select语句。而且不需要修改写好的SQL语句,只需要直接修改resultMap即可.
ClassMapper.xml文件部分内容:
1
2
3
4
5
6
7
8
9
10
11
|
<
resultMap
type
=
"ClassEntity"
id
=
"classResultMap"
>
<
id
property
=
"classID"
column
=
"CLASS_ID"
/>
<
result
property
=
"className"
column
=
"CLASS_NAME"
/>
<
result
property
=
"classYear"
column
=
"CLASS_YEAR"
/>
<
association
property
=
"teacherEntity"
column
=
"TEACHER_ID"
select
=
"getTeacher"
/>
</
resultMap
>
<
select
id
=
"getClassByID"
parameterType
=
"String"
resultMap
=
"classResultMap"
>
SELECT * FROM CLASS_TBL CT
WHERE CTCLASS_ID = #{classID};
</
select
>
|
TeacherMapper.xml文件部分内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<
resultMap
type
=
"TeacherEntity"
id
=
"teacherResultMap"
>
<
id
property
=
"teacherID"
column
=
"TEACHER_ID"
/>
<
result
property
=
"teacherName"
column
=
"TEACHER_NAME"
/>
<
result
property
=
"teacherSex"
column
=
"TEACHER_SEX"
/>
<
result
property
=
"teacherBirthday"
column
=
"TEACHER_BIRTHDAY"
/>
<
result
property
=
"workDate"
column
=
"WORK_DATE"
/>
<
result
property
=
"professional"
column
=
"PROFESSIONAL"
/>
</
resultMap
>
<
select
id
=
"getTeacher"
parameterType
=
"String"
resultMap
=
"teacherResultMap"
>
SELECT *
FROM TEACHER_TBL TT
WHERE TT.TEACHER_ID = #{teacherID}
</
select
>
|
使用resultMap实现联合 。
与上面同样的功能,查询班级,同时查询器班主任。需在association中添加resultMap(在teacher的xml文件中定义好的),新写sql(查询班级表left join教师表),不需要teacher的select.
修改ClassMapper.xml文件部分内容:
1
2
3
4
5
6
7
8
9
10
11
12
|
<
resultMap
type
=
"ClassEntity"
id
=
"classResultMap"
>
<
id
property
=
"classID"
column
=
"CLASS_ID"
/>
<
result
property
=
"className"
column
=
"CLASS_NAME"
/>
<
result
property
=
"classYear"
column
=
"CLASS_YEAR"
/>
<
association
property
=
"teacherEntity"
column
=
"TEACHER_ID"
resultMap
=
"teacherResultMap"
/>
</
resultMap
>
<
select
id
=
"getClassAndTeacher"
parameterType
=
"String"
resultMap
=
"classResultMap"
>
SELECT *
FROM CLASS_TBL CT LEFT JOIN TEACHER_TBL TT ON CT.TEACHER_ID = TT.TEACHER_ID
WHERE CT.CLASS_ID = #{classID};
</
select
>
|
其中的teacherResultMap请见上面TeacherMapper.xml文件部分内容中.
collection聚集 。
聚集元素用来处理“一对多”的关系。需要指定映射的Java实体类的属性,属性的javaType(一般为ArrayList);列表中对象的类型ofType(Java实体类);对应的数据库表的列名称; 。
不同情况需要告诉MyBatis 如何加载一个聚集。MyBatis 可以用两种方式加载:
1. select: 执行一个其它映射的SQL 语句返回一个Java实体类型。较灵活; 。
2. resultsMap: 使用一个嵌套的结果映射来处理通过join查询结果集,映射成Java实体类型.
例如,一个班级有多个学生.
首先定义班级中的学生列表属性:
1
|
private
List<StudentEntity> studentList;
|
使用select实现聚集 。
用法和联合很类似,区别在于,这是一对多,所以一般映射过来的都是列表。所以这里需要定义javaType为ArrayList,还需要定义列表中对象的类型ofType,以及必须设置的select的语句名称(需要注意的是,这里的查询student的select语句条件必须是外键classID).
ClassMapper.xml文件部分内容:
1
2
3
4
5
6
7
8
9
10
11
12
|
<
resultMap
type
=
"ClassEntity"
id
=
"classResultMap"
>
<
id
property
=
"classID"
column
=
"CLASS_ID"
/>
<
result
property
=
"className"
column
=
"CLASS_NAME"
/>
<
result
property
=
"classYear"
column
=
"CLASS_YEAR"
/>
<
association
property
=
"teacherEntity"
column
=
"TEACHER_ID"
select
=
"getTeacher"
/>
<
collection
property
=
"studentList"
column
=
"CLASS_ID"
javaType
=
"ArrayList"
ofType
=
"StudentEntity"
select
=
"getStudentByClassID"
/>
</
resultMap
>
<
select
id
=
"getClassByID"
parameterType
=
"String"
resultMap
=
"classResultMap"
>
SELECT * FROM CLASS_TBL CT
WHERE CT.CLASS_ID = #{classID};
</
select
>
|
StudentMapper.xml文件部分内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<!-- java属性,数据库表字段之间的映射定义 -->
<
resultMap
type
=
"StudentEntity"
id
=
"studentResultMap"
>
<
id
property
=
"studentID"
column
=
"STUDENT_ID"
/>
<
result
property
=
"studentName"
column
=
"STUDENT_NAME"
/>
<
result
property
=
"studentSex"
column
=
"STUDENT_SEX"
/>
<
result
property
=
"studentBirthday"
column
=
"STUDENT_BIRTHDAY"
/>
</
resultMap
>
<!-- 查询学生list,根据班级id -->
<
select
id
=
"getStudentByClassID"
parameterType
=
"String"
resultMap
=
"studentResultMap"
>
<
include
refid
=
"selectStudentAll"
/>
WHERE STCLASS_ID = #{classID}
</
select
>
|
使用resultMap实现聚集 。
使用resultMap,就需要重写一个sql,left join学生表.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<
resultMap
type
=
"ClassEntity"
id
=
"classResultMap"
>
<
id
property
=
"classID"
column
=
"CLASS_ID"
/>
<
result
property
=
"className"
column
=
"CLASS_NAME"
/>
<
result
property
=
"classYear"
column
=
"CLASS_YEAR"
/>
<
association
property
=
"teacherEntity"
column
=
"TEACHER_ID"
resultMap
=
"teacherResultMap"
/>
<
collection
property
=
"studentList"
column
=
"CLASS_ID"
javaType
=
"ArrayList"
ofType
=
"StudentEntity"
resultMap
=
"studentResultMap"
/>
</
resultMap
>
<
select
id
=
"getClassAndTeacherStudent"
parameterType
=
"String"
resultMap
=
"classResultMap"
>
SELECT *
FROM CLASS_TBL CT
LEFT JOIN STUDENT_TBL ST
ON CT.CLASS_ID = ST.CLASS_ID
LEFT JOIN TEACHER_TBL TT
ON CT.TEACHER_ID = TT.TEACHER_ID
WHERE CT.CLASS_ID = #{classID};
</
select
>
|
其中的teacherResultMap请见上面TeacherMapper.xml文件部分内容中。studentResultMap请见上面StudentMapper.xml文件部分内容中.
discriminator鉴别器 。
有时一个单独的数据库查询也许返回很多不同(但是希望有些关联)数据类型的结果集。鉴别器元素就是被设计来处理这个情况的,还有包括类的继承层次结构。鉴别器非常容易理解,因为它的表现很像Java语言中的switch语句.
定义鉴别器指定了column和javaType属性。列是MyBatis查找比较值的地方。JavaType是需要被用来保证等价测试的合适类型(尽管字符串在很多情形下都会有用).
下面这个例子为,当classId为20000001时,才映射classId属性.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<
resultMap
type
=
"bjpowernodestudentmanagerdatamodelStudentEntity"
id
=
"resultMap_studentEntity_discriminator"
>
<
id
property
=
"studentId"
column
=
"STUDENT_ID"
javaType
=
"String"
jdbcType
=
"VARCHAR"
/>
<
result
property
=
"studentName"
column
=
"STUDENT_NAME"
javaType
=
"String"
jdbcType
=
"VARCHAR"
/>
<
result
property
=
"studentSex"
column
=
"STUDENT_SEX"
javaType
=
"int"
jdbcType
=
"INTEGER"
/>
<
result
property
=
"studentBirthday"
column
=
"STUDENT_BIRTHDAY"
javaType
=
"Date"
jdbcType
=
"DATE"
/>
<
result
property
=
"studentPhoto"
column
=
"STUDENT_PHOTO"
javaType
=
"byte[]"
jdbcType
=
"BLOB"
typeHandler
=
"orgapacheibatistypeBlobTypeHandler"
/>
<
result
property
=
"placeId"
column
=
"PLACE_ID"
javaType
=
"String"
jdbcType
=
"VARCHAR"
/>
<
discriminator
column
=
"CLASS_ID"
javaType
=
"String"
jdbcType
=
"VARCHAR"
>
<
case
value
=
"20000001"
resultType
=
"bjpowernodestudentmanagerdatamodelStudentEntity"
>
<
result
property
=
"classId"
column
=
"CLASS_ID"
javaType
=
"String"
jdbcType
=
"VARCHAR"
/>
</
case
>
</
discriminator
>
</
resultMap
>
|
最后此篇关于mybatis教程之resultmap_动力节点Java学院整理的文章就讲到这里了,如果你想了解更多关于mybatis教程之resultmap_动力节点Java学院整理的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
1.概述 转载:MyBatis 二级缓存全详解 上一篇文章中我们介绍到了 MyBatis 一级缓存其实就是 SqlSession 级别的缓存,什么是 SqlSession 级别的缓存呢?一级缓存的本质
1.概述 转载:核心配置综述之StatementHandler 2.MyBatis 四大组件之StatementHandler StatementHandler 是四大组件中最重要的一个对象,负责操作
1.概述 转载:MyBatis 启动流程 MyBatis 是第一个支持自定义 SQL、存储过程和高级映射的类持久框架。MyBatis 消除了大部分 JDBC 的样板代码、手动设置参数以及检索结果。My
1.概述 转载:MyBatis 基础搭建及架构概述 2.MyBatis 是什么? MyBatis是第一个支持自定义SQL、存储过程和高级映射的类持久框架。MyBatis消除了大部分JDBC的样板代码、
1.概述 转载:核心配置综述之 ParameterHandler MyBatis 四大核心组件我们已经了解到了两种,一个是 Executor ,它是MyBatis 解析SQL请求首先会经过的第一道关卡
1.概述 转载:核心配置综述之 ResultSetHandler 我们之前介绍过了MyBatis 四大核心配置之 Executor、StatementHandler、 ParameterHandler
如果我使用mybatis,我可以很容易地得到更新的行数,就像 update table set desc = 'xxx' where name = ? 但是,如果我想获取更新的行数,而不是计数,我该如
如何在MyBatis 3中使用小于等于 SELECT * FROM( SELECT * FROM TABLE1 WHERE COL1 =#{COL1,jdbc
我将 mybatis3.0.6 与 java 一起使用 哪个性能更好? [select id="getData" parameterType="Integer" resultType="Integer
我无法在 mybatis 中使用动态排序类型创建 SQL,如下例 select user_profile.user_profile_id, user_profile.first_name
这是一个流行的例子。 insert into ACCOUNT ( ACC_ID, ACC_FIRST_NAME, ACC_LAST_NAME, ACC_EMAIL )values (
我下载了MyBatis,文件夹中有一个mybatis-3.0.4-javadoc.jar,我解压并打开它,但它几乎是空的。 哪里可以找到MyBatis的API文档? 最佳答案 http://repo1
我正在尝试为 ArrayList 编写类型处理程序,但这给了我错误,任何人都可以帮助我。 我想将 ArrayList 作为 VARCHAR 存储在数据库中并将其检索为 ArrayList。 packa
目录 依赖 配置 CodeGenerator mybatis-plus-generator + clickhouse 自动生成代码 依赖
目录 三者实现对比 使用fluent mybatis 来实现上面的功能 换成mybatis原生实现效果 换成mybatis plus
例如,我有查询从员工中选择 ID、姓名、年龄、地址,而不是拥有员工对象列表。我希望有一个 map 列表,如 list{ map{ ("id", 123), ("name","jac
我在使 MyBatis (3.4.6) 工作时遇到一些麻烦。 我已将 mybatis-config.xml 文件放置在项目的 src/main/resources 文件夹中,但是当我运行单元测试时,出
我现在使用 Mybatis 和 spring-boot。我没有添加mybatis-config.xml。我根据说明通过 application.properties 为数据源和 mybatis 进行所
这是我的第一篇文章,用我糟糕的英语...... 我使用的是MyBatis3.0 在查询中,我使用 SqlBuilder 的方法如下: public class DataStatisticSqlBuil
主题:MyBatis:Boolean Paraeter:MyBatis 正在使用 Getter 内容: 大家好, 我一直在寻找解决我近乎简单的 MyBatis 问题的方法: 给定代码(仅必要部分):
我是一名优秀的程序员,十分优秀!