注意细节
<insert id="addUser" parameterType="map"> 传递map的key
insert into user(id,name) values (#(userid),#(password))
假如,我们的实体类,或数据库中的表,字段或参数过多,我们应当使用map!
Map传递参数,直接在sql中取出key 【parameterType="map"】
对象传递参数,直接在sql中取对象的属性即可 【parameterType="Object"】
只有一个基本类型的情况下,可以直接在sql中取到
模糊查询
1,java代码执行的时候,传递通配符 String value = "%李%"
2,在sql中拼接通配符 like "%"#{value}"%"
配置解析:mybatis-config.xml
https://mybatis.org/mybatis-3/zh/configuration.html
映射器(mappers)
MapperRegistry : 注册绑定我们的Mapper文件
1.每一个Mapper.xml 都需要在Mybatis核心配置文件中注册
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>
<mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
2.使用class文件绑定注册
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper"/>
<mapper class="org.mybatis.builder.BlogMapper"/>
<mapper class="org.mybatis.builder.PostMapper"/>
</mappers>
注意:接口和他的Mapper配置文件必须同名
接口和他的Mapper配置文件必须在同一个包下
3.使用扫描包进行注入绑定
<mappers>
<package name="org.mybatis.builder"/>
</mappers>
SqlSessionFactoryBuilder
一旦创建SqlSessionFactory 就不再需要他了
局部变量
SqlSessionFactory
说白了就是数据库连接池
SqlSessionFactory一旦被创建就应该在应用期间一直存在,没有任何理由丢弃他或重新创建
因此 SqlSessionFactory 最佳作用域是应用作用域
最简单的就是使用单例模式和静态单例模式
SqlSession
连接到连接池的一个请求
SqlSession实例不安全的,因此不能被共享,最佳作用域是请求或方法作用域
用完之后关闭,否则资源被占用
分页
减少数据的处理量
1.使用limit分页
select * from user limit 2,-1 bug已修复
limit (n-1)*pageSize,pageSize
2.使用mybatis 分页 ,核心sql
① 本质是写sql,没有面向对象编程
② RowBounds 通过java代码层面实现分页,不在使用sql实现分页
RowBounds rowBounds = new RowBounds(1,2); offset limit
sqlSession.selectList("接口的全限定名加方法名",null,rowBounds)
分页插件
mybatis 执行流程
String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
Resources获取加载全局配置文件
实例化SqlSessionFactoryBuilder的构造器 【build(inputStream)里面 new XMLConfigBuilder】
解析配置文件流XMLConfigBuilder 【把解析后的信息传给Configuration对象】
Configuration 所有的配置信息
SqlSessionFactory实例化
transactionl事务管理
创建executor执行器
创建sqlSession
实现crud
执行成功
提交事务
多对一:查询所有的学生信息,以及对应的老师 【多个学生对应一个老师,因此在学生的实体类这样定义 private Teacher teacher;】
按照结果嵌套处理 关联 联表查询
一对多: 一个老师对应多个学生 【对老师而言,就是一对多的关系,因此在老师的实体类这样定义 private List<Student> studentList;】
Mybatis缓存原理
永远保持学徒的心