1.JavaEE开发需要持久层进行数据库访问操作
2.JDBC Mybatis进行持久层开发过程存在大量的代码冗余
3.Spring基于模板设计模式对于上述的持久层技术进行封装
1.JDBC
|- JDBCTemplate
2.Hibernate(JPA)
|- HibernateTemplate
3.Mybatis
|- SqlSessionFactoryBean MapperScannerConfigure
1.实体
public class User implements Serializable {
private Integer id;
private String name;
private String password;public User() {
}public User(Integer id, String name, String password) {
this.id = id;
this.name = name;
this.password = password;
}public Integer getId() {
return id;
}public void setId(Integer id) {
this.id = id;
}public String getName() {
return name;
}public void setName(String name) {
this.name = name;
}public String getPassword() {
return password;
}public void setPassword(String password) {
this.password = password;
}
}
2.实体别名
PUBLIC "-//mybatis.org//DTD Confi 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
3.表
create table t_users values (
id int(11) primary key auto_increment,
name varchar(12),
password varchar(12)
);
4.创建DAO接口
public interface UserDAO {
public void save(User user);
}
5.实现Mapper文件
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
insert into t_users(name, password) values (#{name}, #{password})
6.注册Mapper文件
7.MybatisAPI调用
public class TestMyBatis {
public static void main(String[] args) throws IOException {
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession session = sqlSessionFactory.openSession();
UserDAO userDAO = session.getMapper(UserDAO.class);User user = new User();
user.setName("liulei");
user.setPassword("1234562");
userDAO.save(user);session.commit();
}
}
问题:配置繁琐,代码冗余
1.配置文件 (ApplicationContext.xml)进行相关配置(只需配置一次)
1.配置文件 (ApplicationContext.xml)进行相关配置(只需配置一次)
创建SqlSessionFactory
指定实体类所在的包 com.liulei.mybatis
指定 配置文件(映射文件)的路径 还有通用配置
com.liulei.mapper/*Mapper.xml
DAO接口的实现类
指定DAO接口放置的包
2.编码
没有整合前:
整合后:
1.实体类
2.表
3.创建DAO接口
4.Mapper文件配置
搭建开发环境(jar)
org.springframework
spring-jdbc
5.2.6.RELEASE
org.mybatis
mybatis-spring
2.0.4
com.alibaba
druid
1.1.12
org.mybatis
mybatis
3.5.5
mysql
mysql-connector-java
5.1.48
Spring配置文件的配置
classpath:com.liulei.mapper/*Mapper.xml
编码
1.实体
public class User implements Serializable {
private Integer id;
private String name;
private String password;public User() {
}public User(Integer id, String name, String password) {
this.id = id;
this.name = name;
this.password = password;
}public Integer getId() {
return id;
}public void setId(Integer id) {
this.id = id;
}public String getName() {
return name;
}public void setName(String name) {
this.name = name;
}public String getPassword() {
return password;
}public void setPassword(String password) {
this.password = password;
}
}
2.表
create table t_users values (
id int(11) primary key auto_increment,
name varchar(12),
password varchar(12)
);
3.DAO接口
public interface UserDAO {
public void save(User user);
}
4.Mapper文件配置
insert into t_users(name, password) values (#{name}, #{password})
在运行整段代码时,一定要记住配置日志文件(log4j.properties),负责会报错
6.Spring与Mybatis整合的细节
问题:Spring与Mybatis整合后,为什么DAO不提交事务,但是数据能够插入数据库中?
Mybatis 提供的连接池对象 —> 创建 Connection
Connection.setAutoCommit(false) 手工的控制了事务,操作完成后,需要手工提交。
Druid(C3P0、DBCP)作为连接池 —> 创建 Connection
Connection.setAutoCommit(true) 默认值为 true,保持自动控制事务,一条 sql 自动提交。
答案:因为 Spring 与 Mybatis 整合时,引入了外部连接池对象,保持自动的事务提交这个机制Connection.setAutoCommit(true),不需要手工进行事务的操作,也能进行事务的提交。
注意:实战中,还是会手工控制事务(多条SQL一起成功,一起失败),后续 Spring 通过 事务控制 解决这个问题 。