目录
1.Mybatis框架
1.1理解
Mybatis是一款优秀的持久层框架,内部封装了JDBC,可以使用简单的XML或注解来配置和
映射基本类型、接口和java的POJO为数据库中的记录
1.2Mybatis的使用配置
(1) #yml文件配置数据库:
spring:
datasource:
username=root
password=root
url=jdbc:mysql://localhost:3306/cscharacterEncoding=utf8&serverTimezone=Asia
/Shanghai&useSSL=false
(2) xml中配置抽象方法(mapper),映射SQL语句:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- 此文件必须使用mapper作为根级节点 namespace属性:必须的,用于指定此XML文件对应的接口,取值为接口的全限定名 --> <mapper namespace="cn.tedu.mybatis.mapper.AdminMapper"> <!-- 根据要执行的数据操作的类型来选择insert/delete/update/select节点 --> 节点的id是抽象方法(mapper)接口的名称(仅名称) 节点的内部编写SQL语句 SQL语句中的参数值使用#{}格式的占位符 --> <select id="findAll" reslutType="com.jt.pojo.User"> select * from user <select> <mapper>
(2) 配置类
(3) POJO类的注解
@Data:生成动态get/set/toString/equals/hashCode等方法
@Accessors(chain=true):开启链式加载,重写set方法
@NoArgsConstructor:无参构造
@AllArgsConstructor:全参构造
(4) mapper抽象方法
如果方法参数超过一个,需要@Param指定名称
int updatePasswordById(@Param("id") Long id, @Param("password") String password);
1.3MyBatis编程步骤
1、创建SqlSessionFactory
2、通过SqlSessionFactory创建SqlSession
3、通过sqlSession对数据库进行操作
4、调用SqlSession.commit()
1.4 resultType和resultMap
1、数据库中的列名和封装实体的属性名一致时用resultType,不一致用resultMap。
<resultMap id="BaseResultMap" type="cn.tedu.mybatis.Admin">
<id column="id" property="id">
<result column="is_enable" property="isEnable" />
<result column="gmt_modified" property="gmtModified" />
</resultMap>
1.5 动态SQL
Mybatis中的动态SQL表现为:根据参数不同进行判断,判断结果不同,生成不同的SQL语句,如果参数值可遍历的,还可以遍历此参数来生成部分SQL片段
1. <foreach> :用于遍历集合或数组类型的参数对象
<!-- int deleteByIds(List<Long> ids); -->
<delete id="deleteByIds">
delete from ams_admin where id in (
<foreach collection="list" item="id" separaor=",">
#{id}
<foreach>
)
</delete>
如果是数组,用collection="array"获取,如果有@param,用属性中配置的值
2. <if>if 是为了判断传入的值是否符合某种规则,比如是否不为空.
<if test="判断条件”> id = #{id}</if>
<include refid="DetailsQueryFields"/>
<sql id="DetailsQueryFields">
<if test="true">
ams_admin.id,
ams_admin.username,
</if>
</sql>
<!--
*如果name有值则根据name查询,
name无值则根据age查询,都没有则根据sex查询
!-->
<select id="findChoose" resultType="User">
select*from demo_user
<where>
<choose>
<when test="name!=null">name=#{name}</when>
<when test="age!=null">age=#{age}</when>
<otherwise>sex=#{sex}</otherwise>
</choose>
</where>
<select>
1.6关于#{}和${}格式的占位符
使用#{}时,Mybatis在处理时会使用预编译的做法,所以不存在SQL注入风险。
使用${}时会先将参数值带入到SQL,然后再执行编译相关过程,所以存在SQL风险,优点是可以表示SQL语句中任何片段
1.7Mybatis的缓存机制
Mybatis有两级缓存,一级缓存是SqlSession级别的,默认开启,无法关闭,二级缓存是Mapper级别的,需要手动开启
1、一级缓存:基础PerpetualCache的HashMap本地缓存,其存储作用域为Session,当Session flush或close之后,Session中的Cache就将清空
2、二级缓存其存储作用域为Mapper(Namespace),使用二级缓存属性类需要实现Serializable序列化接口
3、对于缓存数据更新机制,当某一个作用域进行了 C(增加)/U(更新)/D(删除)操作后,默认该作用域下所有 select 中 的缓存将被 clear.
需要在setting全局参数中配置开启二级缓存,如下conf.xml配置
<settings>
<setting name="cacheEnable" value="true"/>默认是false;关闭二级缓存
<settings>