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);

 

 

 

 

 

posted @ 2023-02-12 16:03  sugarstar  阅读(35)  评论(0)    收藏  举报