mybatis
是一个优秀的持久化框架
四大对象
Executor(发起sql任务的入口)
StatementHandler(进行sql的预编译,BandSql可以拿到sql)
ParameterHandler(设置参数,利用typeHandler进行参数的转换)
ResultSetHandler(进行结果的组装,也是利用typeHandler进行参数的转换)
jdbc=>Dbutils=》JdbcTemplate:发送sql的工具
编写sql=》预编译=》设置参数=》执行sql=》封装结果
功能简单:sql语句编写在java代码里面;硬编码高耦合的方式在任何地方都不推荐
Hibernate:全自动ORM(Object Relation Mapping)框架:消除sql的编写,HQL(定制sql)
javaBean=>编写sql=》预编译=》设置参数=》执行sql=》封装结果=>映射为数据库纪录
希望:sql语句交给开发人员编写,希望sql不失去灵活性;
mybatis:半自动框架,轻量级的框架
sql与java编码分离:sql由开发人员控制
1、根据xml配置文件(全局配置文件)创建一个sqlSessionFactory对象
有数据源的一些运行环境信息
2、sql映射文件:配置了每一个sql,以及sql的封装规则等
3、将sql映射文件注册在全局配置文件中
4、写代码:
1)、根据全局配置文件得到SqlSessionFactory
2)、使用SqlSession工厂,获取到SqlSession对象使用他来执行增删改查
一个SqlSession就是代表和数据库的一次会话,用完关闭
3)、使用sql的唯一标识来告诉mybatis来执行哪一个sql,sql都是保存在sql映射文件中
使用接口式编程规范了出参和入参、以及绑定映射文件的namespace和SQL语句
mapper ===> xxMapper.xml
SqlSession代表和数据库的异常会话;用完必须关闭
SqlSession和connection一样是非线程安全的,不能写为全局变量,每次使用必须去获取新的对象
mapper 接口没有实现类,但是mybatis会为这个接口生成一个代理对象
两个重要的配置文件
①mybatis的全局配置文件、事务管理器、数据库连接池等
②sql映射文件:保存了每一个sql语句的映射信息
将sql抽取了出来
配置文件的属性
mapUnderscoreToCamelCase
mapUnderscoreToCamelCase:数据库是 last_name,自动映射为 lastName
environments
可以配置多种环境
environments:可以配置多种环境,default指定使用环境
environment:环境信息,id代表当前环境的唯一标识
transactionManager:事务管理器
type(了解,我们现在都是用spring控制事务):事务管理器类型(JDBC/MANAGED)
dataSource:数据源类型
JNDI、POOLED、UNPOOLED
自定义实现DataSourceFactory接口,type是全类名
支持多数据库厂商
作用就是得到数据库厂商标识(驱动),mybatis就能根据数据库厂商标识来执行不同的sql
MYSQL、Oracle
databaseIdProvider
<select id="getEmpById" resultType="com.mybatis.bean.Employee" databaseId="mysql">
<select id="getEmpById" resultType="com.mybatis.bean.Employee" databaseId="oracle">
根据不同的数据源默认id,切换到不同的sql映射上
主键返回
mybatis允许增删改自定义返回值 integer、boolean、Long
mysql支持自增主键,mybatis也是利用statement.getGenreatedKeys()
useGeneratedKeys="true" keyProperty="id"使用自增主键获取;获取到主键值以后封装给javaBean哪个属性
oracle不支持自增,oracle使用序列来模拟自增
<selectKey keyProperty="id" order="BEFORE" resultType="integer">
select EMPLOYEES_SEQ.nextval from dual
</selectKey>
insert into EMPLOYEE(EMPLOYEE_NUMBER,last_name,email,gender)
values (#{id},#{lastName},#{email},#{gender})
参数处理
单个参数
mybatis不做处理,直接赋值
可以使用param1和param2来指定参数位置,不推荐
用@Param("id")明确指定参数
如果多个参数我们可以直接传入POJO属性值或者传入map
public Employee getEmp(@Param("id") Integer id, @Param("lastName") String lastName);
id===>#{id}/#{param1} lastName==>#{lastName}/#{param2}
public Employee getEmp(Integer id,@param("e")Employee e )
取值:id===>#{param1} lastName==>#{param2.lastName} / #{e.lastName}
如果是Collection或者数组,如果是List===>#{list[0]} 数组(array)
public Employee getEmp(List<Integer>ids)
参数的获取
#{}
${}
区别:#{}是以预编译的形式,将参数设置到sql语句中PreparedStatement
${}取出的值直接拼装在sql语句中;会有安全问题
大多情况下,我们都应该使用#{}
分表/排序情况,按照年份分表拆分:
select * from ${year}_salary;
select * from salary order by ${order_name}
mybatis 中 #{}和 ${}的区别是什么?
#{}带引号,${}不带引号;
#{}可以防止SQL注入;
${}常用于数据库表名、order by子句;
一般能用#{}就不要使用${};
mybatis 的一级缓存和二级缓存?
https://blog.csdn.net/TreeShu321/article/details/127162387
一级缓存是SqlSession级别。一级缓存的作用域是 SqlSession , Mabits 默认开启一级缓存。 在同一个SqlSession中,执行相同的SQL查询时;第一次会去查询数据库,并写在缓存中,第二次会直接从缓存中取。 当执行SQL时候两次查询中间发生了增删改的操作,则SqlSession的缓存会被清空。
一级缓存 Mybatis的内部使用一个HashMap,key为hashcode+statementId+sql语句。Value为查询出来的结果集映射成的java对象。 Sqlsession执行insert、update、delete等操作commit后会清空该SqlSession缓存。
二级缓存是Mapper级别的缓存,多个SqlSession去操作同一个Mapper中的sql语句,则这些SqlSession可以共享二级缓存,即二级缓存是跨SqlSession的。简单说就是同一个namespace 下的 mapper 映射文件中,用相同的sql去查询数据,会去对应的二级缓存内取结果。
mybatis-plus.configuration.cache-enabled=true # 开启二级缓存
mybatis 有哪些执行器(Executor)
SimpleExecutor:
每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象。
PauseExecutor:
执行update或select,以sql做为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象,而且放置于Map内,供下一次使用。简言之,就是重复使用Statement对象。
BatchExecutor:
执行update,将所有sql通过addBatch()都添加到批处理中,等待统一执行executeBatch(),它缓存了多个Statement对象,每个Statement对象都是addBatch()完毕后,等待逐一执行executeBatch()批处理。与JDBC批处理相同。
2、作用范围:Executor的这些特点,都严格限制在SqlSession生命周期范围内。
3、Mybatis中如何指定使用哪一种Executor执行器?在mybatis的配置文件中,可以指定默认的ExecutorType执行器类型,也可以手动给DefaultSqlSessionFactory的创建SqlSession的方法传递ExecutorType类型参数。
mybatis 和 hibernate 的区别有哪些
mybatis要手动编写sql语句和resultMap,而hibernate有良好的映射机制;
开发难度对比:hibernate > mybatis (对开发者的sql要求苛刻)
hibernate有自己的日志统计功能,而mybatis需要借助log4j来记录日志。
数据库扩展比较:hibernate(api的方式生成的sql) > mybatis (不同数据库语法不同)
对于性能要求不太苛刻的系统,比如管理系统、ERP等推荐hibernate;对于性能要求高、响应快、灵活的系统,比如电商系统,推荐使用mybatis;
myBatis查询多个id、myBatis常用属性
@Param("ids")来指定多个属性
Page getUserListByIds(@Param("ids") List ids);

浙公网安备 33010602011771号