MyBatis-jar包
核心包下载
中文官网:http://www.mybatis.cn
英文官网:http://www.mybatis.org/mybatis-3/zh/index/html
htt
依赖包:
配置文件
主配置文件
主配置文件中可以有多个environment,更改开发(dev)或者线上模式(online)
分离主配置文件中的四大参数
- 创建配置文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///mybatis-base(当ip为本机,端口为3306时,可以使用 "/" 代替)
jdbc.username=root
jdbc.password=123
- 在主配置文件中关联
<properties resource="mysqljdbc.properties"/>
映射文件
namespace的作用
每个映射文件namespace的名字不能相同。不同的命名空间,有相同id的sql语句,执行方法要使用命名空间.方法
但不建议如此使用。
映射别名
<typeAliases>
<package name="com.woniuxy.entity"/>
</typeAliases>
resultType的可以使用别名和类全名,在使用别名前,需要在主配置文件设置typeAliases。
sql语句的占位符$和#
使用$在执行时是使用Statement
使用#在执行时是使用PreparedStatement
日志文件
Log4j
log4j使用properties作为配置文件
log4j.logger.命名空间,指定显示执行该命名空间相关信息
#log4j.rootLogger=TRACE,console,f1
log4j.logger.com.woniuxy.dao.StudentDao=DEBUG,console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%p] %m [%t] %c [%l]%n
log4j.appender.f1.File=d:/file.log
log4j.appender.f1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.f1.layout=org.apache.log4j.PatternLayout
log4j.appender.f1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%p] %m [%t] %c [%l]%n
数据库中表的字段与定义的实体属性名不一致时
不影响增删改,但要注意sql语句的参数名
查询语句是要给字段定义相同的属性名
或者使用resultMap接收查询结果,再转换成需要的实体
使用mapper的动态代理
自动生成接口实现类
- 没有Dao接口的实现类,mapper映射文件放在接口包中
- namesapce必须是接口的类全名(全限定名)
- sql语句的id必须是要调用的方法名
动态代理不支持selectMap
查询操作底层只会调用selectOne()和selectList()
由于没有加入Spring,需要使用test进行测试
单表查询
模糊查询 '%' 值 '%'
%与值之间的空格不可省略
多参数查询
- 使用数字区分参数的位置
- 使用@Param设置参数名字
在定义接口方法是使用@Param设置参数名字
List<Student> seleteStudentParameter1(@Param("name")String name,@Param("student")Student student);
在mapper的sql语句中直接使用#{名字}
select * from student where name like '%' #{name} '%' and id=#{student.id}
动态参数
-
if
-
where(推荐)
对if进行了优化没有前置条件 where 1 = 1
-
choose
当前一条不满足,执行下一条
-
foreach
MyBatis中对数据类型等已经做了定义。,可以直接使用左图中的对应名字
数组
集合<Internet>
集合<实体类>
多表查询
关系模型数据库,在程序中即为对象模型,即在建立实体时,为外键的字段,用属性表示为该字段对应的实体。
如上图,学生属性中并没有建立一个老师id的属性,而是建立老师对象的属性。
一对多
分步查询
在需要查询对象属性的时候,使用resultMap转换器进行一次转换,告诉程序,怎么进行赋值。
多对一
分步查询
多对多
至少有是三个表
多对多查询,其实就是多步骤的多对一或者一对多。
逆向工程
MyBatis官方提供一个代码生成器,可以生成单表的实体类,Dao接口和映射文件
官方文档地址:http://www.mybatis.org/generator/
官方工程地址:https://github.com/mybatis/generator/releases
修改配置文件
jdbc四大参数
实体类+映射文件+接口的包名和位置
、
指定表
生成实体,Dao接口,映射文件
运行主方法。
延迟加载 setting
为了降低服务器开销建议使用延迟加载
使用延迟加载的前提:多表的关联查询,查询语句是分步查询。
在帮助文档中
lazyLoadingEnabled为直接加载
直接加载
查询语句分步查询,执行方法时,分步查询按先后顺序一起执行
侵入式延迟
执行查询方法的时候只执行第一个查询,当使用对象属性的时候,会查询关联表(不管这个属性是否存在于这个关联表)
深度延迟
当使用关联表属性的时候才会执行查询
缓存
缓存以Map保存,情况缓存,其实是清空值,保留键
一级缓存(默认开启,不能禁用)
第二次执行同一个查询方法时,并没有执行查询语句,而是直接使用了缓存中的数据
一级缓存作用于SqlSession,当SqlSession关闭时,会清空缓存中的数据
当执行增删改操作的时候也会清空缓存,无论是否提交
二级缓存
与SqlSession无关,可以在映射文件中配置是否开启,底层是基于序列化的,使用二级缓存保存的实体需要实现序列化接口
主配置文件
映射文件
缓存命中率:Cache Hit Ratio
增删改操作也会清空缓存。
在这里就是将缓存中Map的值清空,只保留了键,所有会出现一次缓存命中率为0.5但还是执行了查询语句的情况
第三方的二级缓存--ehcache
配置文件
指定使用的文件位置