MyBatis
1.为什么要使用MyBatis - Dao层开发,增删改查
-
代替JDBC,减少代码冗余
-
不在java代码中将sql语句写死
2.如何使用MyBatis?如何在springboot中使用?
-
建库建表
-
创建springboot项目,导入mysql、MyBatis-start
-
创建实体类
-
Mapper接口(定义了一些抽象方法)
-
Mapper映射配置文件 - 定义了和抽象方法对应的sql语句(.xml)
-
namespace和mapper接口的全接口名一致
-
id和mapper接口的抽象方法名一致
-
parameterType和mapper接口抽象方法参数的返回值类型一致
-
resultType和mapper接口抽象方法返回值类型一致
-
mapper映射配置文件在resource目录下的相对位置和mapper接口在java目录下的相对位置保持一致
-
-
配置MyBatis(application\properties\启动类上添加@MapperScann注解)
- properties
-
测试
3.配置:lombok、mybatisframework(???????
)
4.参数绑定
-
序号参数绑定:如果抽象方法有多个参数,则
-
第一个参数:arg0,param1
-
第二个参数:arg1,param2
-
-
注解参数绑定:在抽象方法前添加@Param注解
- @Param("参数名") - 表示给方法的参数起了一个别名
-
map参数绑定
- #{}中的占位符和map中的key对应,获取key对应的value作为参数值
5.模糊查询
sql
concat('%,#{username},'%')
6.主键回填 - 获取自增主键
-
useGeneratedKeys设置为true,keyColumn - 主键的列名 keyProperty - 主键对应的属性名
-
last_insert_id()
,order=AFTER/BEFORE -
通过uuid()查询主键 - 雪花算法
7.动态SQL
- if/where
sql
<select id="selectByCondition" resultType="user">
SELECT * FROM `user` WHERE 1=1
<if test="username!=null and username.length>0">
AND `username`=#{username}
</if>
<if test="age!=null">
AND `age`=#{age}
</if>
<if test="gender!=null and gender.length>0">
AND `gender`=#{gender}
</if>
<if test="addr!=null and addr.length>0">
AND `addr`=#{addr}
</if>
</select>
sql
// where标签
<select id="selectByCondition" resultType="user">
SELECT * FROM `user`
<where>
<if test="username!=null and username.length>0">
AND `username`=#{username}
</if>
<if test="age!=null">
AND `age`=#{age}
</if>
<if test="gender!=null and gender.length>0">
AND `gender`=#{gender}
</if>
<if test="addr!=null and addr.length>0">
AND `addr`=#{addr}
</if>
</where>
</select>
-
set
sql<update id="uodate" parameterType="user"> UPDATE `user` <set> <if test="username!=null and username.length>0"> AND `username`=#{username} </if> <if test="age!=null"> AND `age`=#{age} </if> <if test="gender!=null and gender.length>0"> AND `gender`=#{gender} </if> <if test="addr!=null and addr.length>0"> AND `addr`=#{addr} </if> </set> WHERE `id`=#{id} </update>
sql
trim
<update id="uodate" parameterType="user">
UPDATE `user`
<trim prefix="SET" suffixOverrides=",">
<if test="username!=null and username.length>0">
AND `username`=#{username}
</if>
<if test="age!=null">
AND `age`=#{age}
</if>
<if test="gender!=null and gender.length>0">
AND `gender`=#{gender}
</if>
<if test="addr!=null and addr.length>0">
AND `addr`=#{addr}
</if>
</trim>
WHERE `id`=#{id}
</update>
-
foreach
sql<select closet id="selectBuIds" resultType="user"> SELECT * FROM `user` <where> <foreach collection="list" item="id" open="id IN (" close")" separator=","> #{id} </foreach> </where> </select>
8.列名和属性名不一致时如何映射
1)起别名:别名和属性名一致
2)resultMap - 结果映射
-
定义resultMap
-
id:resultMap的名字,resultMap在当前映射配置文件中的标识
-
type:映射的类的全名/别名
-
id标签:设置主键列映射
-
result:设置非主键列映射
-
column:列名
-
property:属性名
-
-
使用resultMap
9.SQL片段抽取:将重复的SQL提取出来,使用时用include引用即可,最终达到SQL重用的目的,减少代码冗余
sql
<sql id="selectAll">
SELECT * FROM user
</sql>
<select id="findAll" resultType="user">
<include refid="selectAll" />
</select>
<select id="findByCondition" resultType="user">
<include refid="selectAll" />
<where>
<if test="age!=null">
and age=#{age}
</if>
<if test="gender!=null">
and gender=#{gender}
</if>
</where>
</select>
10.分页查询
如何使用分页插件:
-
导入对应的starter
-
设置分页信息
javaPageHelper.startPage(1,5);
-
查询
javaList<User> userlist = userMapper.selectAll();
-
创建封装查询结果的对象
javaPageInfo<User> pageInfo = new PageInfo<>(userlise); sout(pageInfo.getPages());