上一篇:16-Spring 基于注解的AOP编程、AOP总结https://blog.csdn.net/fsjwin/article/details/109482768

1.为什么Spring要与持久层框架进行整合

spring是一个优秀的框架,他的优秀支持就是能整合所有程序员想要让他整合的框架,这里所说的持久成也不例外。

  • JavaEE开发需要持久层进行数据库的访问操作,spring
    当然不让。
  • JDBC Hibernate MyBatis进行持久开发过程存在大量的代码冗余
  • Spring基于模板设计模式对于上述的持久层技术进行了封装

2.Spring要可以与那些持久层框架进行整合

  1. jdbc JdbcTemplate
  2. Hibernate (JPA) HibernateTemplate
  3. Mybatis SqlSessionFactoryBean、MapperScannerConfiger

3.Mybatis开发回顾,在Spring没有整合前

  1. 实体
  2. 实体别名
  3. 创建DAO接口
  4. 实现Mapper文件(对maper编程)
  5. 注册Mapper文件
  6. MyBatisApi调用

3.1 实体 User.java

package mybatis;import java.io.Serializable;/*** @author yuhl* @Date 2020/11/4 10:51* @Classname User* @Description 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;}@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +", password='" + password + '\'' +'}';}
}

3.2. 实体别名mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><typeAliases><!-- 2. 实体别名--><typeAlias alias="user" type="mybatis.User"/></typeAliases><environments default="mysql"><environment id="mysql"><transactionManager type="JDBC"></transactionManager><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/yuhl?useSSL=false"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><mappers></mappers>
</configuration>

3.3. 表


-- ----------------------------
-- Table structure for t_user
-- ----------------------------
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user`  (`id` int(0) NOT NULL AUTO_INCREMENT,`name` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,`password` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

3.4. 创建DAO接口 UserDao.java

package mybatis;/*** @author yuhl* @Date 2020/11/4 10:59* @Classname UserDao* @Description TODO*/
public interface UserDao {//保存用户public void save(User user);
}

3.5. 实现Mapper文件UserDAOMapper.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="mybatis.UserDao"> <!--接口名--><!--id:mybatis.UserDao接口中的方法面parameterType:面向对象的对象名字--><insert id="save" parameterType="user">insert into t_user(name,password) value (#{name},#{password})</insert>
</mapper>

3.6. 注册Mapper文件UserDAOMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><typeAliases><!-- 2. 实体别名--><typeAlias alias="user" type="mybatis.User"/></typeAliases><environments default="mysql"><environment id="mysql"><transactionManager type="JDBC"></transactionManager><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/yuhl?useSSL=false"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><mappers><!--注册mapper.xml到mybatis--><mapper resource="UserDAOMapper.xml"/></mappers>
</configuration>

3.7. MyBatisApi调用

import mybatis.User;
import mybatis.UserDao;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;import java.io.IOException;
import java.io.InputStream;/*** @author yuhl* @Date 2020/11/4 11:06* @Classname MybatisTest* @Description 测试*/
public class MybatisTest {@Testpublic void test1(){try {//通过流加载mybatis的主配置文件:mybatis-config.xmlInputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");//SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();UserDao userDao = sqlSession.getMapper(UserDao.class);userDao.save(new User("yuhl", "222222"));sqlSession.commit();sqlSession.close();} catch (IOException e) {e.printStackTrace();}}
}

插入成功:

3.单纯的Mybatis编程存在的问题

  1. 配置繁琐 第2步和第7步
    如果有9999个类该怎办?
  2. 代码冗余
    主要指的是API代码冗余 。

    由于以上两个原因,我们不会使用mybatis单独做开发,会使用spring对于mybatis的整合,下面看对于整合后的mybitis的使用是不是更为丝滑呢!
    即spring可以积极2.6.7三个步骤的问题。

4.Spring的Mybatis整合

1. 实体
2. 实体别名(<property name="typeAliasesPackage" value="com.yuhl.entity"/>)
3. 表
4. 创建DAO接口
5. 实现Mapper文件(对maper编程)
6. 注册Mapper文件(<value>classpath:com.yuhl.mapper/*DAOMapper.xml</value>)
7. MyBatisApi调用(被优化了直接从factory.getBean("userDAO"))
以上步在使用spring整合后1. 实体2. 表3. 创建DAO接口4. 实现Mapper文件(对maper编程)

引入jar包:pom.xml 特别注意与mybatis整合是使用druid连接池

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>spring5_20201031</artifactId><groupId>org.yuhl</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>Spring_mybatis</artifactId><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>5.1.14.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.1.14.RELEASE</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>2.0.2</version></dependency><!--阿里巴巴连接池--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.18</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.48</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.6</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-context --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.1.4.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>5.1.14.RELEASE</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjrt</artifactId><version>1.8.8</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.8.3</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.25</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency></dependencies></project>

4.1在mybatis-config.xml中的有所东西均可以在applicationContex.xml配置消灭mybatis-config.xml



至此可以完全消灭mybatis-config.xml文件。仅使用applicationContex.xml

4.1 代码如下

  1. 实体User .java
package com.yuhl.entity;import java.io.Serializable;/*** @author yuhl* @Date 2020/11/4 10:51* @Classname User* @Description 1. 实体*/
public class User implements Serializable {private Integer id;private String name;private String password;public User() {}public User(String name, String password) {this.name = name;this.password = password;}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;}@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +", password='" + password + '\'' +'}';}
}
  1. 表t_user 复用之前的表
-- ----------------------------
-- Table structure for t_user
-- ----------------------------
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user`  (`id` int(0) NOT NULL AUTO_INCREMENT,`name` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,`password` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

3 创建DAO接口UserDAO.java

package com.yuhl.dao;import com.yuhl.entity.User;/*** @author yuhl* @Date 2020/11/4 10:59* @Classname UserDao* @Description TODO*/
public interface UserDAO {//保存用户public void save(User user);
}
  1. 实现Mapper文件(对maper编程)com.yuhl.mapper/UserDAOMapper.xml
    特别注意:com.yuhl.mapper是一个文件集,不是三级包
<?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.yuhl.dao.UserDAO"> <!--接口名--><!--id:mybatis.UserDao接口中的方法面parameterType:面向对象的对象名字--><insert id="save" parameterType="user">insert into t_user(name,password) value (#{name},#{password})</insert>
</mapper>
  1. 测试
import com.yuhl.dao.UserDAO;
import com.yuhl.entity.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** @author yuhl* @Date 2020/11/4 11:06* @Classname MybatisTest* @Description 测试*/
public class MybatisTest2 {@Testpublic void test1() {ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");UserDAO userDao = (UserDAO) ctx.getBean("userDAO");userDao.save(new User("zhangsan","ddd"));}
}
  1. 结果

5.Mybatis和spring整合事务控制


这句话告诉我们spring并没有提交事务,我们的事务是被谁提交的呢?
前面我们单独使用mybatis的时候手动提交了了事务
session.commint;
这里直接给出答案,是我们引入的第三方数据源druid控制了事务的提交。
但是在实战中我们不会让他控制我们的事务,我们会把事务的控制权交给spring,让spring来控制事务。
下一篇:18-Spring事务控制@Transactional https://blog.csdn.net/fsjwin/article/details/109497305

17-Spring持久层框架整合相关推荐

  1. mybatis和spring jdbc持久层框架事务支持分析

    mybatis和spring jdbc持久层框架事务支持分析 ​ 持久层框架中的事务支持指的是持久层框架如何支持数据库事务,我们先梳理出原生数据库事务操作的主线脉络,它是通过java.sql 包下的C ...

  2. SSM持久层框架MyBatis,看这一篇就够了

    前言: 此篇仅为个人初期学习笔记,如有错误,请xd们指正 你这么好看,还.... MyBatis 前言 一.MyBatis简介 二.搭建MyBatis项目 1. 开发环境 2. 创建maven工程 3 ...

  3. mysql高可用 持久层_MyBatis持久层框架使用总结 转载

    MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis . 2 ...

  4. 基于持久层框架hibernate用SpringMVC增删功能

    接Spring MVC框架(1)的方法 Hibernate:持久层全自动化的框架 hibernate 用的少了 因为现在mybatis用的多 接下来 hibernate框架要链接数据库blog /* ...

  5. Mybatis持久层框架MBGExample类详解

    Mybatis 1. 概念 1.1 什么是Mybatis 是一个持久层框架: 所谓持久层,也就是数据访问层.又称为DAL层,有时候也称为是持久层,其功能主要是负责数据库的访问. 我的理解就是Mybai ...

  6. Hibernate持久层框架详解

    本博文是本人原创,观点是本人自己提出的,如有雷同,不甚荣幸! 一.hibernate框架的前世今生 1.前世:2001年,Gavin King开始开发hibernate框架.两年之后,Gavin Ki ...

  7. java开源持久层框架集

    原文链接:http://www.open-open.com/3_18.htm Hibernate Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Ja ...

  8. 酷帅狂拽吊炸天——一统江湖的持久层框架之SpringData

    一.SpringData概述 1.1 现有问题 ​ 随着互联网的发展,互联网产品的复杂度越来越高,在开发中使用到的数据存储产品不再仅限于关系型数据库,还会使用到Redis.MongoDB.Elasti ...

  9. Java软件开发:自定义MyBatis持久层框架

    自定义MyBatis持久层框架 1 框架概述 1.1 什么是框架 1.2 框架要解决的问题 1.3 软件开发的分层的重要性 2 MyBatis框架 3 JDBC编程 3.1 JDBC程序的回顾 3.2 ...

  10. JavaEE持久层框架对比与hibernate主键生成策略总结

    一.持久层框架对比 ORM框架:即对象关系映射.它把数据库表映射到pojo类,然后通过对类的操作来实现对数据库的增删改查,sql语句自动生成. 对于代码开发者来说,就是在代码里先创建数据库连接对象,然 ...

最新文章

  1. 【ACM】UVa 489 刽子手游戏(自顶向下)
  2. pcm 采样率转换_Cool Audio Video Converter(音视频格式转换工具)V2.18 最新版 - 绿色先锋下载 -...
  3. 清楚linux缓存文件,Linux删除文件 清除缓存
  4. netty心跳过程中 发送消息失败_Netty 4.0 实现心跳检测和断线重连
  5. Guayadeque成为音乐爱好者的开源播放器的6个原因
  6. 普通人赚大钱,做好这一点,才是真正的捷径
  7. 21复变函数的积分(七)
  8. [转载] python numpy np.finfo()函数 eps
  9. 点集求最小包围盒OBB算法
  10. php登陆飞信,用PHP模拟登录WAP飞信实现飞信发送_PHP教程
  11. 1.2. Linear and Quadratic Discriminant Analysis(线性判别和二次判别分析)(一)
  12. 有些段子,外行人根本看不懂,只有程序员看了会狂笑不止
  13. 推荐几个财富自由大佬的公众号
  14. 使用g++创建动态库和静态库及其相关探索
  15. vs code远程连接阿里云(SSH)
  16. JavaScript进阶
  17. Flink 实战 | 贝壳找房基于Flink的实时平台建设
  18. 《卓有成效的管理者》评语
  19. 《写给大家看的设计书》读后记录
  20. 【QA02】云技术交流群一周知识汇总

热门文章

  1. Python 爬虫对链家网广州二手房源信息的处理与可视化分析
  2. 【教学类-10-02】20221025《空心图案4*2-不重复》( 随机图案拼贴)(大班主题《动物花花衣》)
  3. Python官方开发文档(中文版)
  4. r9270公版bios_换个BIOS再来一次
  5. 《计算传播学导论》读书笔记:第五章 网络传播与传播网络
  6. 802.11无线WIFI协议学习笔记(一)
  7. Linux下使用nohup部署java 后台程序
  8. 光纤OTDR测试是端到端损耗原理
  9. SHELL 脚本检测FTP连接
  10. “暖男”经济学:创业者最后的增长红利?