Mybatis 笔记
一、sql
1、mybatis中的#和$的区别
- 1、# 会转译,将传入的参数作为字符串使用,而 $ 只是替换,例:
// 当传入 table 为 test 时两种符号的替换结果如下
selec * from #{table};
select * from "test";
select * from ${table};
select * from test;
-
2、在预编译阶段不同,$为直接替换,#为使用占位符 “?” 替换,例:select * from student where id = ?,真实值采用 prepareStatement 的 set 方法注入
-
⚠️ 能使用#{}的地方应尽量使用#{},这样能有效的防止sql注入
-
⚠️ 但像order by #{colum} 若使用此种用法会 出现 order by “id”,导致错误
2、sql语法
<select id="getUserById" parameterType ="int" resultType ="com.fsky.pojo.User">
select * for user where id = #{id}
</select>
<update> </update>
<delete> </delete>
<insert> </insert>
-
id:接口写的函数名
-
parameterType:函数参数的名字
-
resultType:函数返回对象的名字,如果返回的是一个list只需要其中泛型的名字
-
SqlSession.commit():提交事务;(新建session的时候课以设置自动提交为true)
-
只有一个基本类型参数的时候可以省略,map可以在有多个参数的时候使用
二、配置XML
1、环境配置
<environments default="development">
<enviroment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver">
<property name="url" value="***">
<property name="username" value="root">
<property name="password" value="123456">
</dataSource>
<enviroment>
</enviroments>
- 数据源:dbcp、c3p0
- type:POOLED,存在连接池,跟线程池差不多,避免销毁重建的开销;还有UNPOOLED
- xml中标签是有顺序的
2、别名
<typeAliases>
<typeAliases type="com.fsky.pojo.User" alias="User" />
</typeAliases>
<!--或者自动扫描包-->
<typeAliases>
<package name="com.fsky.pojo.User" />
</typeAliases>
<!--自动以小写首字母作为别名,可以使用@Alias注解在类上取定制化的别名-->
3、映射器
<mappers>
<!--方法一-->
<mapper resourse="com/fsky/dao/UserMapper.xml"/>
<!--方法二:接口和Mapper.xml必须在同一个文件加下,并且要同名-->
<mapper class="com.fsky.dao.UserMapper"/>
<!--方法三:接口和Mapper.xml必须在同一个文件加下,并且要同名-->
<package name="com.fsky.dao">
</mappers>
4、设置
介绍其中的一个:
<settings>
<setting name="logIml" value="STDOUT_LOGGING">
</settings>
5、生命周期和作用域
- SqlSessionFactoryBuilder:只用一次,设置为局部变量就好
- SqlSessionFactory:整个应用期间只有一个,只创建一次,使用单例模式
- SqlSession:是线程不安全的,所以最好放在请求请求方法中,用完之后关闭
6、结果映射——数据库字段与类属性字段匹配
三种映射方法
6.1、别名映射,直接在 sql 语句中使用as
6.2、自动下划线到驼峰的映射
6.3、resultMap映射
<resultMap id="映射的数据类型" type="实体类">
<result column="db中的字段名" property="实体类的属性名">
</resultMap>
三、其他
1、日志:log4j:Apache的一个开源项目
2、分页:limit pageStart pageSize (主要是sql支持)
四、注解
可以直接在接口函数定义上使用注解表明接口实现的sql语句
@select("select * from user")
List<User> getUser();
// 方法存在多个参数是一定要加@param
@select("select * from user where id = #{id}")
User getUserById(@param("id") int id);
五、动态SQL
1、 if
2、choose(when,otherwise)
3、trim(where, set)
4、foreach
六、缓存
1、 分为一级缓存和二级缓存
- 一级缓存默认开启
- 二级缓存开启需要手动开启
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/> <!--使用cache的type属性自定义缓存 一个第三方缓存实现:ehcahe --> <cache type="com.domain.something.MyCustomCache"/>
- 二级缓存需要实体类实现序列化
- 缓存替换策略:LRU、FIFO、SOFT、WEAK
2、缓存执行流程
- 先查二级缓存再查一级缓存
- 一级缓存是 SqlSession 级别额,二级缓存是 应用 级别的。
- Mybatis的缓存实现流程图
- 一级缓存使用 BaseExecutor 实现
- 二级缓存使用 CachingExecutor 实现,该类是使用修饰者模实现的