1.resultType
当返回值类型为基本数据类型时(增删改 返回int),指定不指定都可以。
当返回值类型为引用数据类型时(查询 返回集合或对象),要指定返回类型。
2.sql映射的xml文件
01.MyBatis真正的力量实在映射语句中,专注于SQL,功能强大,SQL映射的配置确实相当简单。
02.SQL映射文件的几个顶级元素(按照定义的顺序)
001.cache---配置给定命名空间的缓存
002.cache-ref----从其他命名空间引用缓存配置
003.resultMap----用来描述数据库结果集和对象的对应关系
004.sql----可以重用的SQL块,也可以被其他语句引用
005.insert----映射插入语句
006.update----映射更新语句
007.delete----映射删除语句
008.select----映射查询语句
3.MyBatis基本知识
01.select
a.select是MyBatis中最常用的元素之一。
b.select语句有很多属性可以详细配置每一条语句。
c.代码:
别名的使用:
<typeAliases>
<!--只要是在mapper.xml文件中使用了cn.pb.bean包下面的任意类的时候,无需再用全类名
使用简写的类名
之前应该 cn.pb.bean.Student
现在 Student
-->
<package name="cn.pb.bean"/>
<!--
规定指定类的别名 但是如果有多个类 使用不方便
<typeAlias type="cn.pb.bean.Student" alias="s"></typeAlias>
-->
</typeAliases>
<mapper namespace="cn.pb.dao.StudentDao">
<!--根据指定的id查询对象 传递一个id不是一个对象 所以我们在sql语句中就可以用占位符-->
<select id="selectStudentById" parameterType="int" resultType="Student">
select id,name,age from student where id=#{xxx}
</select>
</mapper>
d.#{}中可以存放什么内容
01.参数对象的属性 02.任意内容,此时的#{}只是一个占位符 03.map的key 04.如果key所对应的value是对象,则存放的是对象的属性 05.参数的索引号!从0开始
02.resultMap
001.resultMap:描述如何将结果集映射到java对象
002.resultMap属性:id type
003.resultMap子元素:id result association collection
a.association:实体类中有其他类型的属性,例如user中有Role属性
实体类属性:
private Integer id;//主键
private Integer age;//年龄
private String name;//名字
private Role role;//用户类型
mapper中的代码:
<resultMap type="User" id="userMap">
<result property="id" column="id"/>
<result property="userCode" column="userCode"/>
<result property="userName" column="userName"/>
<association property="role" javaType="Role">
<result property="id" column="id"/>
<result property="roleCode" column="roleCode"/>
<result property="roleName" column="roleName"/>
</assoiation>
</resultMap>
<select id="getUserListByRoleId" parameterType="Role" resultMap="userMap">
sql语句
</select>
b.collection:实体类中有集合属性,例如user中有list<Address>属性
private List<Address> list;
004.代码:
<!--查询所有的student 返回值是map
如果我们写的是resultType="map"
那么mybatis在底层会把我们的每个字段当成key
字段对象的值 是value! 这样不可行!
我们是想把某一个字段当成key!
整行数据(对象)当成value!
这时候就需要把resultType换成resultMap(结果映射)="映射的resultMap名称"
mybatis底层会进行拦截ResultSet!
然后根据我们在resultMap中的配置,
把对应的key和value封装到map集合中!
-->
<select id="selectAllByMap" resultMap="studentMap">
select id,age,NAME from student
</select>
<!--
必须使用resultMap的三种情况
01.数据库字段名和我们实体类属性名不一致 必须使用
02.返回结果是map集合时 必须使用
03.关联映射 以及延迟加载 必须使用
-->
<resultMap id="studentMap" type="Student">
<id property="id" column="id"/><!--只针对于主键的设置-->
<result property="age" column="age"/> <!--设置除了主键,集合,对象之外的属性-->
<result property="name" column="name"/>
</resultMap>
property:对应type中的Student类中的属性名称
column:对应数据库中查询出来的字段名
03.resultType和resultMap区别:
MyBatis的每一个查询映射的返回类型都是ResultMap,只是当我们提供的返回类型属性是resultType的时候,MyBatis对自动的给我们把对应的值赋给resultType所指定对象的属性,而当我们提供的返回类型是resultMap的时候,将数据库中列数据复制到对象的相应属性上,可以用于复制查询,两者不能同时用。
resultType:当使用resultType做SQL语句返回结果类型处理时,对于SQL语句查询出的字段在相应的pojo中必须有和它相同的字段对应,而resultType中的内容就是pojo在本项目中的位置。因此对于单表查询的话用resultType是最合适的。但是,如果在写pojo时,不想用数据库表中定义的字段名称,也是可以使用resultMap进行处理对应的。多表连接查询时,若是一对一的连接查询,那么需要新建一个pojo,pojo中包括两个表中需要查询出的所有的字段,这个地方的处理方式通常为创建一个继承一个表字段的pojo,再在里面添加另外一个表内需要查询出的字段即可。若是一对多查询时,若是使用内连接查询,则很可能出现查询出的字段有重复。使用双重for循环嵌套处理即可。
resultMap:当使用resultMap做SQL语句返回结果类型处理时,通常需要在mapper.xml中定义resultMap进行pojo和相应表字段的对应。
001.数据库字段名和我们实体类属性名不一致的时候,必须使用resultMap,不能使用resultType
002.返回结果是map集合时,必须使用resultMap,不能使用resultType
003.关联映射,以及延迟加载,必须使用resultMap,不能使用resultType,例如数据表中字段特别多的时候,但是我们需要用到的只有个别几个的时候。