MyBatis笔记02

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,例如数据表中字段特别多的时候,但是我们需要用到的只有个别几个的时候。


 





原文地址:https://www.cnblogs.com/lyb0103/p/7530155.html