Mybatis
发展史
最早叫iBatis(internet abatis)
2001年 Clinton Begin发起一个开源项目 iBatis1.0
2005年 iBatis2.0 2010年 iBatis3.0
iBatis在这之前都是Apache组织管理
2010.6 交给谷歌公司管理 Mybatis
2013.11 整个项目迁移至github
2019.10 MyBatis3.5.3
层面(作用)
是一个持久层框架(DAO与数据库交互)
半自动ORM框架 Object Ralational Mapping 表 <->
半自动指需要写sql语句
基本应用
写好的代码交给用户 .jar
在项目中配置一个文件 dbconfig.properties
driver url user password
获取jar包中的对象 SqlSession
执行数据库操作 insert update delete selectOne selectList
调用如上方法 提供sql 提供sql上的问号信息 如果是查询 提供返回对象类型
使用步骤:
1.导包
百度搜索 MyBatis官网 点链接进入github下载
MyBatis3.5.3
2.参读一下mybatis-3.5.3.pdf 手册
基本配置
JDBC
导包,加载驱动类
创建连接
创建状态参数(相当于一个流,可读/可写)
执行操作
增删改 int = excuteUpdate DML(写,更新)
查询 Result = excuteQuery DQL(读,数据库内容不变,要结果)
关闭所有对象
缺点
1.连接用完一次就销毁
2.DAO层中的好多JDBC流程都一样(冗余,只有sql差异)
SqlSession类 帮我们执行所有一样的流程
insert update delete 只需要提供sql和sql上的问号信息
配置
1.导包
2.核心配置文件 configuration.xml(存储数据库关联信息)
3.给我们提供了SqlSession对象 去做事
4.传递一些信息 sql 问号 是查询还需要告诉结果类型
使用
导包 mybatis3.5.3.jar
jdbc-mysql-driver.jar
放入lib
配置文件
configuration.xml 工程下
dtd规则
settings //全局设置
setting name= value=
lazyLoadingEnabled //懒加载,默认false
agreesiveLazyLoading //侵略性加载
environments
environment
transmanager //连接数据库种类
dataSource //连接参数
mappers
mapper resource = “xxxmapper.xml”
XXXmapper.xml namespace = “” 一般跟dao一样
resultMap id = xxxx type =
id property = column = //主键列
result property = column = //非主键列
result
result
association property = “idcard” javaType = “domain.IDCard” select = "selectIDCcarForPerson" column = "cardID"
//对象
select id = "selectIDCcarForPerson"
select id = selectOne.. resultMap = xxxx
sql传参数
${} 纯字符串
#{} 字符串和参数/变量
联表查询
一对一
一个公共属性是对象 配置额外sql//执行两次,存在n+1问题
联合语句查询
resultMap id = xxxx type =
id property = column = //主键列
result property = column = //非主键列
association property = “idcard” javaType = “domain.IDCard”
id property = "cardID" column = "cardID"
Result property = "address" column = "address"
因为一条语句全出来,也没什么懒加载一说
性能会高点
一对多
与1对1基本一致,多端对象的一端实例是List
collection property = "xxxList" javaType = "list" oftype = "domain.xxx" select = "" column = ""
left out join
多对多
两边都是集合,中间表没有体现在domain
inner join
常用标签
标签有先后顺序问题,错了会报错
xml由配置文件引入(便于框架更新/切换/并行/适配)
(配置文件的数据驱动,从和数据库中获取)
*typeAliases
typeAlias type = alias =
为xml配置文件中的value起别名
一般是全部字母小写
*settings
设置一些属性信息如懒加载等
plugins
插件
typeHandler
返回值控制器
environments default=""
environment
transactionManager type = "JDBC"
JDBC 用JDBC管理提交 回滚功能
type也可以用managed 配置上 什么都不做 让容器帮忙做
dataSource type = "POOLDE"
type
UNPOOLED 每次都需要简单的创建连接,再关闭
需要设置几个链接数据库的属性 property
driver
url
username
password
defaultTransactionIsoilationLevel
隔离级别
Serializable 避免所有读取问题,性能慢
Repeatable-Read 避免脏读,不可重复读
Read-Committed 避免脏读
Read-UnCommitted无法避免
POOLED 实现连接缓存,连接复用
poolMaximumActioveConnection Mybatis默认10
poolTimeToWait 默认20秒
JNDI 这个数据源的配置 是为了准备与外部应用一起使用
Java Naming and Directory Interface
Java命名和目录接口
C3P0 性能比较差 早些年
DBCP Apache组织的开源
Druid 阿里开源项目 fast json dubbo 看监控sql的执行
XXXMapper.xml
根标记
子标记
insert
id
parameterType 类型 基本类型 map 对象
update
delete
select
property name = "driver" value = "oracle.jdbc.OracleDriver"
url "jdbc:oracle:thin:@localhost:1521:orcl"
动态SQL
根据参数、条件不同,让sql变化
原生 判断参数是否为空 拼串
框架
ps: linkedHashMap 有序集合
1.参数包装成map集合 (service中)
2.xml语句标签中 用 if switch trim for each等语法标签进行操作拼串
and deptno = #{deptno}
order by sal
${orderFlag}
asc
//when..
//
// asc
//
update cmp set job = 'xxx' where empno in
#{empno}
基于Mapper的执行
模式1
1.dao是类
2.Dao层有方法 --> Mapper文件
3.调用sqlsession执行
模式2
基于Mapper执行
1.dao是接口
2.Sevice调用sqlsession做事
private StudentDao dao = MyUtil.getSqlSession(true).
getMapper(StudentDao.class);
/* 只要mapper namespace 与dao类名一致 标签的id与dao方法一致
什么都不用改
*/
模式3
DAO+注解
动态代理
静态代理 代理对象
动态代理 代理方法
底层 new一个代理对象,代理对象实现接口,根据方法名找到sql
根据sql标签确定需要调的方法 然后代替dao调用sqlsession
注解开发
为了弥补XML文件的不好方式
1.写在方法上面(sql+dao方法 绑定在一起 开发者写起来方便)
2.注解通常就一行(比XML简单 一对多 一对一 多对多也不是很简单)
注意
注解本身是我们调用不到的--底层需要通过反射来解析
如果想要使用注解方式执行--必须依托于Mapper代理
在configuration.xml中告知扫描注解
基于xml
基于注解
UPDate
#{param1},#{param2}
....按顺序
update(@Param("sid")Integer sid,...)
对应关系
1.namespace -- 类名
2.id -- 方法名
3.

浙公网安备 33010602011771号