学习笔记-Mybatis
1、快速使用2、全局配置3、Mapper映射文件配置4、获取参数的几种方式
1、${}2、#{} 5、ResultType 和 ResultMap6、一对多、多对一 关联查询映射的几种方式
1、一对多:2、多对一 7、分布查询(嵌套查询)8、动态SQL8、一级缓存和二级缓存
1、快速使用介绍 :mybatis是一个半自动化的(需要自己写sql)的orm框架,灵活的写sql,便于修改。
1、引入pom文件
junit junit 4.12 test org.mybatis mybatis 3.4.6 org.projectlombok lombok 1.18.4 mysql mysql-connector-java 8.0.13 log4j log4j 1.2.17
2、创建全局配置文件
3、配置log4j
log4j.rootLogger=debug, stdout, R log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout # Pattern to output the caller's file name and line number. log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n log4j.appender.R=org.apache.log4j.RollingFileAppender log4j.appender.R.File=./log/mblog.log log4j.appender.R.MaxFileSize=100KB # Keep one backup file log4j.appender.R.MaxBackupIndex=5 log4j.appender.R.layout=org.apache.log4j.PatternLayout log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
4、创建实体类 mapper接口 Mapper配置文件
package com.lee.entity;
import lombok.Data;
import java.util.List;
@Data
public class Dep {
private Integer id;
private String name;
private List empList;
}
package com.lee.mapper;
import com.lee.entity.Dep;
import java.util.List;
public interface DepMapper {
List getAllDep();
Dep getDepByid(Integer id);
}
select * from dep
注意:xml配置文件的namespace要和mapper接口的全限定名一致
5、进行测试
epMapper mapper;
public void setUp() throws Exception {
String resource = "mybatis-config.xml";
final InputStream resourceAsStream = App.class.getClassLoader().getResourceAsStream(resource);
//创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//创建sqlsession
final SqlSession sqlSession = sqlSessionFactory.openSession();
//获取mapper接口
mapper = sqlSession.getMapper(DepMapper.class);
}
@Test
public void testGetAllDep() {
mapper.getAllDep().forEach(System.out::println);
}
2、全局配置
配置全局影响mysql的行为 常用的有别名配置等
参见mybatis – MyBatis 3 | 配置
3、Mapper映射文件配置映射文件要注意namespace要和mapper接口的全限定名一致
mybatis – MyBatis 3 | XML 映射器
4、获取参数的几种方式 1、${}字符串拼接,mybatis不会解析里面的占位符 直接拿来执行
常见场景: 模糊查询 like ‘%${operation}%’ 或者这样("%"#{operation}"%")
2、#{}mybatis会对sql进行预编译 采用占位符的方式执行sql
mysql默认会用 arg0 args1 param1 param2 作为key
建议:为mapper接口方法中每个参数都加上@param注解 这样就可以在xml里面使用(见名思义)
5、ResultType 和 ResultMapResultType 表示的是结果类型,当数据库字段名和实体的属性名一致的时候(驼峰命名在全局配置中开开启的话除外),可以成功映射
ResultMap 可以对结果集进行自定义映射(ResultType其实也是ResultMap的一种),可以配置一对多,多对一的映射关系
6、一对多、多对一 关联查询映射的几种方式 1、一对多:1、关联查询
2、嵌套查询(分布查询)优点:可以配置懒加载 需要的时候再查询 缺点就是:主查询数据量太大 查询数据库的次数过多
2、多对一
1、关联查询
select e.id,e.name,e.depId,d.id as dId,d.name as dName from emp e left join dep d on e.depid=d.id
2、嵌套查询
7、分布查询(嵌套查询)select * from emp where id=#{param1} select * from dep where id=#{depId}
查询数据,利用查询数据的结果作为参数 传给其他的查询 可以配置懒加载 使用到这个属性的时候查询
缺点就是:主查询数据量太大 查询数据库的次数过多
8、动态SQL1、if test
select * from emp where 1=1 and name like '%${emp.name}%' and sex = #{emp.sex} and email = #{emp.email}
2、where 去除前面多余的and (name是null 其他的不是)
select * from emp name like '%${emp.name}%' and sex = #{emp.sex} and email = #{emp.email}
3、trim
select * from emp
name like '%${emp.name}%' and
sex = #{emp.sex} and
email = #{emp.email} and
4、choose when ohther
select * from emp
name like '%${emp.name}%'
and sex = #{emp.sex}
and email = #{emp.email}
and depId=1
5、foreach
delete from emp where id in
#{id}
6、sql
8、一级缓存和二级缓存id,`name`,sex,email,depId selectfrom emp
一级缓存:默认开启
级别:SqlSession级别 同一个sqlSession内 多次查询同一个数据 只会执行一次
失效情况(同一个SqlSession内):中间执行了任意增删改 手动清除缓存 sqlsession变化
二级缓存 级别:SqlSessionFactory级别 失效情况:中间执行了任意增删改
全局配置:
mapper配置:
实体实现Seribale接口
关闭sqlSession或者提交sqlSession



