Mybatis深入

总结下mybatis比较实用的知识点。

一、传递参数

输入参数

1、传递简单类型:parameterType="包装类的基本数据类型",#{}占位符 或者 ${}进行sql拼接
2、传递pojo对象:parameterType="别名",#{}或者${}括号中的值为pojo属性,例如插入:#{username} username是pojo的属性值
3、传递包装的pojo对象
    一个类里面设置了private User user;还有它的set、get方法,就是包装了pojo,当然里面可以包装n个pojo对象
    parameterType="包装类名"
    `${user.username}`

输出参数

1、简单的数据类型
    resultType="Integer"      Integer String ....
2、pojo对象
    resultType="类名" (已经配置了别名,否则要全路径)selectOne查询单个pojo,selectList多个pojo
3、resultMap
    resultMap可以指定将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功
    如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系,resultMap实质上还需要将查询结果映射到pojo对象中
    resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一和一对多查询
resultMap应用场景1:当数据库表字段和pojo不一样时
解决方案:
(1)、改数据库字段名,或者改pojo属性名(不可取,数据库修改麻烦,pojo属性修改不遵循了命名规范)
(2)、select语句时给别名,别名和pojo属性名一致即可。可取但不方便,每个地方都要取别名。 例如:select user_id userId from user;
(3)、使用resultMap
resultMap入门/定义
<resultMap type="order" id="order_list_map">
    id用于映射主键 property为pojo,column为表的字段
    <id property="id" column="id"/>
普通字段用result映射,习惯性全部映射写全比较好,虽然type指定了order,写一个表的一个字段和pojo映射也不会错,但是多表查询就会出错
    <result property="userId" column="user_id"/>
</resultMap>
使用resultMap
<select id="xxx" resultMap="order_list_map">
    select user_id userId from user;
</select>
 

二、sql灵活使用

1、sql-if语句:改造sql使得更灵活,满足各种应用场景

使用:<if test="条件">条件成立后执行的sql语句体</if>
    例如:where 1 = 1 <if test="username != null and username != ''""> and username LIKE '%{username}%' </if>
    <if test="sex != null and sex != ''">and sex=#{sex} </if>
    1 = 1是让where永远成立,解决不让单个and出现导致 where and语句错误

 

 

 

 

2、sql-where

<where>标签自动补上where关键字,同时处理多余and,解决不让单个and出现导致 where and语句错误的另一个方法,不用每次写1 = 1
用了where标签不能再手动加where不然会出错
<where>
    <if test="username != null and username != ''"> username LIKE '%{username}%' </if>
    <if test="sex != null and sex != ''">and sex=#{sex} </if>
</where>

 

 

 

 

 

3、sql-sql片段

<sql id="user_sql">username</sql>
<select id="xx" >
select 
refid引用定义好的sql片段id
<include refid="user_sql"></include> 
from user</select>

 

 

 

 

 

4、sql-foreach

<foreach>是一个循环标签 collection是要遍历的集合 open循环开始之前输出的内容 item设置循环遍历 separator分隔符 close循环结束之后输出的内容
目的,拼装id IN(1,25,29,30,35)<foreach collection="ids" open=“id IN(”item="uId" separator="," close=")">  #{uId} </foreach>

 

 

 

三、表的查询

1、一对一关联查询
方法一、使用resultType
新建orderUser的pojo,继承自order(就是要把两张关联表要查询的属性都弄到一个类上)
select o.id,u.username from order o left join user u on u.id = o.userid

2、第一种方法不符合面向对象 所以用resultMap
<resultMap type="order" id="order_user_map">
...order表
<association property="user" javaType="com.xxx.pojo.User"> association 用于配置一对一关系,property:order里面的User属性,javaType:user的数据类型,支持别名
...user表
</association>

3、一对多查询(collection与ofType和一对一查询不一样,其他一样)
<resultMap type="user" id="order_user_map">
...user表
<collection property="orders" ofType="com.xxx.pojo.Order"> collection用于配置一对多关系,property:User里面的order的属性,ofType:orders的数据类型,支持别名
...order表
</collection>

 

四、mybatis的逆向工程

见博客逆向工程说明及使用:https://blog.csdn.net/qq_41055045/article/details/89218096

 

五、mybatis整合spring

见博客:https://blog.csdn.net/qq_41055045/article/details/89155336

 

 

上一篇:java – 龙目岛建设者模式与杰克逊JsonProperty


下一篇:Spring Boot 2.x 编写 RESTful API (三) 程序层次 & 数据传输