总结下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
五、spring整合mybatis
见博客:https://blog.csdn.net/qq_41055045/article/details/89155336