Mybatis
# Mybatis
# 1.Mybatis<where>标签
Mybatis的<where>标签结合<if>标签使用(替代1=1,优化过滤需要MySQL做,减轻压力):①子句开头为and或者or时,where标签会自动把它剔除。②至少一个if标签有内容才会插入where子句。
好处:sql语句复用,涵盖指定条件查询和全表查询(查所有)两种查询情况,repository层不需要做null判断。
<where>
<if test="data != null and data.systemId != ''">
and system_id = #{data.systemId}
</if>
<if test="data != null and data.interfaceId != ''">
and interface_id = #{data.interfaceId}
</if>
</where>
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 2.mybatis<foreach>标签
mybatis实现可以通过<foreach>标签,实现把dao形参里的list集合插入到表中。好处在于高效,只用从连接池获取一次连接执行一条sql语句。
<insert id="insertList" parameterType="java.util.List">
INSERT INTO award(award_id, award_type, award_name, award_content, create_time, update_time)
VALUES
<foreach collection="list" item="item" index="index" separator=",">
(
#{item.awardId},
#{item.awardType},
#{item.awardName},
#{item.awardContent},
NOW(),
NOW()
)
</foreach>
</insert>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 3.Mybatis拦截器
Mybatis可以拦截的四大对象如下:
- Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)拦截执行器(查询缓存,数据库操作,事务管理)
- ParameterHandler (getParameterObject, setParameters)拦截sql语句参数处理(给sql语句动态赋值具体实现,也就是#{}里面的参数)
- ResultSetHandler (handleResultSets, handleOutputParameters)拦截结果集处理和组装(resulttype将结果映射成响应的结果对象)
- StatementHandler (prepare, parameterize, batch, update, query)拦截sql语法构建的处理(创建封装statement对象。parameterize调用parameterhandler类方法对sql站位符进行赋值。prepare方法根据Connection连接获取statement对象)
MappedStatement:对mapper.xml某个sql方法的封装,相当于一个sql语句,通过Invocation 对象的 getArgs() 方法获取到,getArgs()[1]表示传入sql语句第二个参数。
delegate.mappedStatement:存储映射语句信息。映射语句定义了该执行哪个curd操作,以及sql语句与java对象如何映射。
# 4.Mybatis驼峰与lombok
- Mybatis中的配置文件只能指定一份,要么在spring的yml中configuration下添加所有的配置,要么在资源文件下创建mybatis-config.xml文件,所有配置添加里面,并用config-location指明位置。否则会报错
- uId字段使用lombok@Data注解后,mybatis开启驼峰导致数据库接收不到数据。原因是当使用@Data注解时,自动生成的setter,getter方法为getUId,不符合javaBean规范。 解决方法是遇到第二个字母大写的字段一定要重写getter,setter方法。
编辑 (opens new window)
上次更新: 2023/12/15, 15:49:57