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 实现,该类是使用修饰者模实现的

七、参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值