Mybatis
1、概念
1)ORM( Object/Relation Mapping 对象关系映射)
持久化类与数据库表之间的映射关系,即 对持久化对象的操作自动转换成对关系数据库操作。
2)Mybatis ( Object/Relation Mapping 对象关系映射)
对象操作方法到SQL语句间的映射技术。
使用XML或注解配置。能够映射基本数据元素、接口、Java对象到数据库。
2、工作流机制
1) 工作流
加载配置文件
--应用配置文件、关联映射文件
获取sqlSession
--生成SqlSessionFactory,获取SqlSession
执行查询操作
--Session执行SQL
2)具体实现
(a)创建配置config.xml/映射userMapper文件
(b)构造User对象和操作数据接口GetUserInfo.java
(c)完成数据库操作查询
mybatis流程原理解析
※:(1)Environment环境类,是单例类,在MyBatis运行开启后只会存在一个唯一的环境实例。
虽然在Configuration配置文件中配置多个环境,但是项目运行中只会存在其中的一个,一般项目会存在开发环境和测 试环境、生产环境三大环境,其是否可以设置到配置文件中,在开发时使用开发环境,测试时使用测试环境,正式运 营时可以使用生产环境
(2)jdbc默认事务关闭(自动提交),需手动开启(事务手动提交)。
Mybatis默认事务开启(事务手动提交),设置为true(数据库操作自动提交)。
3、API
mybatis组件:mybatis-3.2.3..jar mysql-connector-java-5.1.12.jar
(1)加载配置方式 -xml、注解
xml文件
config.xml
userMapper.xml
注解方式
config.xml
userMapper
(2)配置 config.xml-SqlSessionFactory
获取session(对象操作转换为数据库操作)
session - 通过sqlSessionFactory获取session(对象操作转换为数据库操作)
dataSource- 数据源,使用连接池
transactionManager - 事务管理器,type=jdbc,managed
type=jdbc: 表示mybatis的事务控制直接使用jdbc的提交回滚设置的,
mybatis依赖从数据库源获得的数据库连接来管理事物的范围。实际使用jdbc实现事务控制
type=managed: mybatis事务控制其本身不做任何控制,不会调用jdbc事务控制,事务控制交给外部容器,比如spring方式
MyBatis的事务模块采用的是工厂模式
org.apache.ibatis.transaction
--org.apache.ibatis.transaction.jdbc
--JdbcTransaction.java
org.apache.ibatis.transaction.managed
--ManagedTransaction.java
--ManagedTransactionFactory.java
--Transaction.java
--TransactionException.java
--TransactionFactory.java
具体参照:https://www.cnblogs.com/V1haoge/p/6634151.html
(3)事务
commit()-事务提交
rollBack()-事务回滚
close()-关闭数据库连接
getConnection()-获取数据库连接
4、ResultMap - 复杂数据库操作
ResultMap可实现复杂查询结果到复杂对象关联关系的转换
(1)复杂E-R图
(2)Java对象配置
//User对象
public class User {
private Integer id;
private String userName;
private String corp;
private List<Course> courses;
public User() {}
public User(Integer id,String userName,String corp) {
this.id=id;
this.userName=userName;
this.corp=corp;
}
}
//Course
public class Course {
private Integer id;
private String courseName;
private Teacher teacher;
}
//Teacher
public class Teacher{
private Integer id;
private String teacherName;
}
(3)映射文件userMapper.xml
标签:Constructor、Collection、Association
Constructor:类在实例化时,用来注入结果到构造方法中
idArg - ID参数,标记结果作为ID可以帮助提高整体效能
arg - 注入到构造方法的一个普通结果
Collection:实现一对多的关联
id - 一个ID结果;标记结果作为ID可以提高整体效能
result - 注入到字段或JavaBean 属性的普通结果
Association:复杂类型间的关联
id - 一个ID结果;标记结果作为ID可以提高整体效能
result - 注入到字段或JavaBean 属性的普通结果
userMapp.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.micro.profession.mybatis.UserOp">
<select id="getUser" parameterType="int"
resultMap="UserMap">
select
u.id as userId,u.username as userName,u.corp as corp,
c.id as courseId,c.coursename as couserName,
t.id as teacherId,t.teachername as teacherName
from user u
left join usercourse uc
on u.id=uc.user_id
left join course c
on uc.course_id=c.id
left join teacher t
on c.teacher_id=t.id
where u.id=#{id}
</select>
<resultMap type="com.micro.profession.mybatis.User" id="UserMap">
<constructor>
<idArg column="userId" javaType="int"/>
<arg column="userName" javaType="String"/>
<arg column="corp" javaType="String"/>
</constructor>
<collection property="courses" ofType="com.micro.profession.mybatis.Course">
<id property="id" column="courseId"/>
<result property="courseName" column="couserName"/>
<association property="teacher" column="teacher_id"
javaType="com.micro.profession.mybatis.Teacher">
<id property="id" column="teacherId"/>
<result property="teacherName" column="teachername"/>
</association>
</collection>
</resultMap>
</mapper>
(4)数据库操作
5、mybatis 内置数据库 - Mybatis 3.0
config.xml dataSource type=POOLED 启用连接池
连接池常用参数:
1)poolMaximumActiveConnections
- 数据库最大活跃连接数
- 考虑到随着连接数增加,性能可能达到拐点,不建议设置过大
2)poolMaximumIdleConnections
- 最大空闲连接数
- 经验值建议=poolMaximum
3)poolMaximumActiveCheckoutTime
- 获取连接时若没有idleConnection同时activeConnection达到最大值,则从activeConnections列表第一个开始,检查是否超过poolMaximumCheckoutTime,若超过则强制使其失效,返回该连接。
- 由于SQL执行时间受服务器配置、表结构不同,建议设置为预期最大SQL执行时间。
4)poolTimeToWait
- 获取服务器端数据库连接的超时时间,若超过该时间则打印日志同时重新获取。
- 建议使用默认值20s。
5)poolPingEnabled
- 启用连接侦测,检查连接池中连接是否有效。
- 默认关闭,建议启用,防止服务器端异常关闭导致客户端错误。
6)poolPingQuery
- 侦测SQL,建议使用select 1 ,开销小。
7)poolPingConnectionsNotUsedFor
- 侦测时间,建议小于服务端超时时间,MySQL默认超时时间8小时。