一、Spring整合Mybatis思路分析

1.1 环境准备

步骤1:准备数据库表

Mybatis是来操作数据库表,所以先创建一个数据库及表

  1. create database spring_db character set utf8;
  2. use spring_db;
  3. create table tbl_account(
  4.   id int primary key auto_increment,
  5.   name varchar(35),
  6.   money double
  7. );

插入测试数据如下

步骤2:创建项目导入jar包

项目的pom.xml添加相关依赖

  1. <dependencies>
  2.    <dependency>
  3.        <groupId>org.springframework</groupId>
  4.        <artifactId>spring-context</artifactId>
  5.        <version>5.2.10.RELEASE</version>
  6.    </dependency>
  7.    <dependency>
  8.        <groupId>com.alibaba</groupId>
  9.        <artifactId>druid</artifactId>
  10.        <version>1.1.16</version>
  11.    </dependency>
  12.    <dependency>
  13.        <groupId>org.mybatis</groupId>
  14.        <artifactId>mybatis</artifactId>
  15.        <version>3.5.6</version>
  16.    </dependency>
  17.    <dependency>
  18.        <groupId>mysql</groupId>
  19.        <artifactId>mysql-connector-java</artifactId>
  20.        <version>5.1.47</version>
  21.    </dependency>
  22. </dependencies>
步骤3:根据表创建模型类
  1. public class Account implements Serializable {

  2.    private Integer id;
  3.    private String name;
  4.    private Double money;
  5. //setter...getter...toString...方法略    
  6. }
步骤4:创建Dao接口
  1. public interface AccountDao {

  2.    @Insert("insert into tbl_account(name,money)values(#{name},#{money})")
  3.    void save(Account account);

  4.    @Delete("delete from tbl_account where id = #{id} ")
  5.    void delete(Integer id);

  6.    @Update("update tbl_account set name = #{name} , money = #{money} where id = #{id} ")
  7.    void update(Account account);

  8.    @Select("select * from tbl_account")
  9.    List<Account> findAll();

  10.    @Select("select * from tbl_account where id = #{id} ")
  11.    Account findById(Integer id);
  12. }
步骤5:创建Service接口和实现类
  1. public interface AccountService {

  2.    void save(Account account);

  3.    void delete(Integer id);

  4.    void update(Account account);

  5.    List<Account> findAll();

  6.    Account findById(Integer id);

  7. }

  8. @Service
  9. public class AccountServiceImpl implements AccountService {

  10.    @Autowired
  11.    private AccountDao accountDao;

  12.    public void save(Account account) {
  13.        accountDao.save(account);
  14.   }

  15.    public void update(Account account){
  16.        accountDao.update(account);
  17.   }

  18.    public void delete(Integer id) {
  19.        accountDao.delete(id);
  20.   }

  21.    public Account findById(Integer id) {
  22.        return accountDao.findById(id);
  23.   }

  24.    public List<Account> findAll() {
  25.        return accountDao.findAll();
  26.   }
  27. }
步骤6:添加jdbc.properties文件

resources目录下添加,用于配置数据库连接四要素

  1. jdbc.driver=com.mysql.jdbc.Driver
  2. jdbc.url=jdbc:mysql://localhost:3306/spring_db?useSSL=false
  3. jdbc.username=root
  4. jdbc.password=123456

useSSL:关闭MySQL的SSL连接

步骤7:添加Mybatis核心配置文件
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE configuration
  3.        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4.        "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6.    <!--读取外部properties配置文件-->
  7.    <properties resource="jdbc.properties"></properties>
  8.    <!--别名扫描的包路径-->
  9.    <typeAliases>
  10.        <package name="com.itheima.domain"/>
  11.    </typeAliases>
  12.    <!--数据源-->
  13.    <environments default="mysql">
  14.        <environment id="mysql">
  15.            <transactionManager type="JDBC"></transactionManager>
  16.            <dataSource type="POOLED">
  17.                <property name="driver" value="${jdbc.driver}"></property>
  18.                <property name="url" value="${jdbc.url}"></property>
  19.                <property name="username" value="${jdbc.username}"></property>
  20.                <property name="password" value="${jdbc.password}"></property>
  21.            </dataSource>
  22.        </environment>
  23.    </environments>
  24.    <!--映射文件扫描包路径-->
  25.    <mappers>
  26.        <package name="com.itheima.dao"></package>
  27.    </mappers>
  28. </configuration>
步骤8:编写应用程序
  1. public class App {
  2.    public static void main(String[] args) throws IOException {
  3.        // 1. 创建SqlSessionFactoryBuilder对象
  4.        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
  5.        // 2. 加载SqlMapConfig.xml配置文件
  6.        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
  7.        // 3. 创建SqlSessionFactory对象
  8.        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
  9.        // 4. 获取SqlSession
  10.        SqlSession sqlSession = sqlSessionFactory.openSession();
  11.        // 5. 执行SqlSession对象执行查询,获取结果User
  12.        AccountDao accountDao = sqlSession.getMapper(AccountDao.class);

  13.        Account ac = accountDao.findById(1);
  14.        System.out.println(ac);

  15.        // 6. 释放资源
  16.        sqlSession.close();
  17.   }
  18. }
步骤9:运行程序

1.2 整合思路分析

Mybatis的基础环境我们已经准备好了,接下来就得分析下在上述的内容中,哪些对象可以交给Spring来管理?

  • Mybatis程序核心对象分析

    从图中可以获取到,真正需要交给Spring管理的是SqlSessionFactory

  • 整合Mybatis,就是将Mybatis用到的内容交给Spring管理,分析下配置文件

    说明:

    • 第一行读取外部properties配置文件,Spring有提供具体的解决方案@PropertySource,需要交给Spring

    • 第二行起别名包扫描,为SqlSessionFactory服务的,需要交给Spring

    • 第三行主要用于做连接池,Spring之前我们已经整合了Druid连接池,这块也需要交给Spring

    • 第四行是Mapper接口和映射文件[如果使用注解就没有该映射文件],这个是在获取到SqlSession以后执行具体操作的时候用,所以它和SqlSessionFactory创建的时机都不在同一个时间,可能需要单独管理。

二、Spring整合Mybatis

前面我们已经分析了Spring与Mybatis的整合,大体需要做两件事,

第一件事是:Spring要管理MyBatis中的SqlSessionFactory

第二件事是:Spring要管理Mapper接口的扫描

具体该如何实现,具体的步骤为:

步骤1:项目中导入整合需要的jar包

  1. <dependency>
  2.    <!--Spring操作数据库需要该jar包-->
  3.    <groupId>org.springframework</groupId>
  4.    <artifactId>spring-jdbc</artifactId>
  5.    <version>5.2.10.RELEASE</version>
  6. </dependency>
  7. <dependency>
  8.    <!--
  9. Spring与Mybatis整合的jar包
  10. 这个jar包mybatis在前面,是Mybatis提供的
  11. -->
  12.    <groupId>org.mybatis</groupId>
  13.    <artifactId>mybatis-spring</artifactId>
  14.    <version>1.3.0</version>
  15. </dependency>

步骤2:创建Spring的主配置类

  1. //配置类注解
  2. @Configuration
  3. //包扫描,主要扫描的是项目中的AccountServiceImpl类
  4. @ComponentScan("com.itheima")
  5. public class SpringConfig {
  6. }

步骤3:创建数据源的配置类

在配置类中完成数据源的创建

  1. public class JdbcConfig {
  2.    @Value("${jdbc.driver}")
  3.    private String driver;
  4.    @Value("${jdbc.url}")
  5.    private String url;
  6.    @Value("${jdbc.username}")
  7.    private String userName;
  8.    @Value("${jdbc.password}")
  9.    private String password;

  10.    @Bean
  11.    public DataSource dataSource(){
  12.        DruidDataSource ds = new DruidDataSource();
  13.        ds.setDriverClassName(driver);
  14.        ds.setUrl(url);
  15.        ds.setUsername(userName);
  16.        ds.setPassword(password);
  17.        return ds;
  18.   }
  19. }

步骤4:主配置类中读properties并引入数据源配置类

  1. @Configuration
  2. @ComponentScan("com.itheima")
  3. @PropertySource("classpath:jdbc.properties")
  4. @Import(JdbcConfig.class)
  5. public class SpringConfig {
  6. }

步骤5:创建Mybatis配置类并配置SqlSessionFactory

  1. public class MybatisConfig {
  2.    //定义bean,SqlSessionFactoryBean,用于产生SqlSessionFactory对象
  3.    @Bean
  4.    public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource){
  5.        SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();
  6.        //设置模型类的别名扫描
  7.        ssfb.setTypeAliasesPackage("com.itheima.domain");
  8.        //设置数据源
  9.        ssfb.setDataSource(dataSource);
  10.        return ssfb;
  11.   }
  12.    //定义bean,返回MapperScannerConfigurer对象
  13.    @Bean
  14.    public MapperScannerConfigurer mapperScannerConfigurer(){
  15.        MapperScannerConfigurer msc = new MapperScannerConfigurer();
  16.        msc.setBasePackage("com.itheima.dao");
  17.        return msc;
  18.   }
  19. }

说明:

  • 使用SqlSessionFactoryBean封装SqlSessionFactory需要的环境信息

    • SqlSessionFactoryBean是前面我们讲解FactoryBean的一个子类,在该类中将SqlSessionFactory的创建进行了封装,简化对象的创建,我们只需要将其需要的内容设置即可。

    • 方法中有一个参数为dataSource,当前Spring容器中已经创建了Druid数据源,类型刚好是DataSource类型,此时在初始化SqlSessionFactoryBean这个对象的时候,发现需要使用DataSource对象,而容器中刚好有这么一个对象,就自动加载了DruidDataSource对象。

  • 使用MapperScannerConfigurer加载Dao接口,创建代理对象保存到IOC容器中

    • 这个MapperScannerConfigurer对象也是MyBatis提供的专用于整合的jar包中的类,用来处理原始配置文件中的mappers相关配置,加载数据层的Mapper接口类

    • MapperScannerConfigurer有一个核心属性basePackage,就是用来设置所扫描的包路径

步骤6:主配置类中引入Mybatis配置类

  1. @Configuration
  2. @ComponentScan("com.itheima")
  3. @PropertySource("classpath:jdbc.properties")
  4. @Import({JdbcConfig.class,MybatisConfig.class})
  5. public class SpringConfig {
  6. }

步骤7:编写运行类

在运行类中,从IOC容器中获取Service对象,调用方法获取结果

  1. public class App2 {
  2.    public static void main(String[] args) {
  3.        ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);

  4.        AccountService accountService = ctx.getBean(AccountService.class);

  5.        Account ac = accountService.findById(1);
  6.        System.out.println(ac);
  7.   }
  8. }

步骤8:运行程序

至此Spring与Mybatis的整合就已经完成了,其中主要用到的两个类分别是:

  • SqlSessionFactoryBean

  • MapperScannerConfigurer

三、Spring整合Junit

整合Junit与整合Druid和MyBatis差异比较大,为什么呢?Junit是一个搞单元测试用的工具,它不是我们程序的主体,也不会参加最终程序的运行,从作用上来说就和之前的东西不一样,它不是做功能的,看做是一个辅助工具就可以了。

3.1 环境准备

这块环境,大家可以直接使用上面的环境即可。

3.2 整合Junit步骤

步骤1:引入依赖

pom.xml

  1. <dependency>
  2.    <groupId>junit</groupId>
  3.    <artifactId>junit</artifactId>
  4.    <version>4.12</version>
  5.    <scope>test</scope>
  6. </dependency>

  7. <dependency>
  8.    <groupId>org.springframework</groupId>
  9.    <artifactId>spring-test</artifactId>
  10.    <version>5.2.10.RELEASE</version>
  11. </dependency>
步骤2:编写测试类

在test\java下创建一个AccountServiceTest,这个名字任意

  1. //设置类运行器
  2. @RunWith(SpringJUnit4ClassRunner.class)
  3. //设置Spring环境对应的配置类
  4. @ContextConfiguration(classes = {SpringConfig.class}) //加载配置类
  5. //@ContextConfiguration(locations={"classpath:applicationContext.xml"})//加载配置文件
  6. public class AccountServiceTest {
  7.    //支持自动装配注入bean
  8.    @Autowired
  9.    private AccountService accountService;
  10.    @Test
  11.    public void testFindById(){
  12.        System.out.println(accountService.findById(1));

  13.   }
  14.    @Test
  15.    public void testFindAll(){
  16.        System.out.println(accountService.findAll());
  17.   }
  18. }

注意:

  • 单元测试,如果测试的是注解配置类,则使用@ContextConfiguration(classes = 配置类.class)

  • 单元测试,如果测试的是配置文件,则使用@ContextConfiguration(locations={配置文件名,...})

  • Junit运行后是基于Spring环境运行的,所以Spring提供了一个专用的类运行器,这个务必要设置,这个类运行器就在Spring的测试专用包中提供的,导入的坐标就是这个东西SpringJUnit4ClassRunner

  • 上面两个配置都是固定格式,当需要测试哪个bean时,使用自动装配加载对应的对象。

知识点1:@RunWith

名称 @RunWith
类型 测试类注解
位置 测试类定义上方
作用 设置JUnit运行器
属性 value(默认):运行所使用的运行期

知识点2:@ContextConfiguration

名称 @ContextConfiguration
类型 测试类注解
位置 测试类定义上方
作用 设置JUnit加载的Spring核心配置
属性 classes:核心配置类,可以使用数组的格式设定加载多个配置类 locations:配置文件,可以使用数组的格式设定加载多个配置文件名称

Java开发学习(十四)----Spring整合Mybatis及Junit的更多相关文章

  1. Spring学习笔记:Spring整合Mybatis(mybatis-spring.jar)(二:mybatis整合spring)

    http://blog.csdn.net/qq598535550/article/details/51703190 二.Spring整合mybatis其实是在mybatis的基础上实现Spring框架 ...

  2. OSGI企业应用开发(十四)整合Spring、Mybatis、Spring MVC

    作为一个企业级的Web应用,MVC框架是必不可少的.Spring MVC目前使用也比较广泛,本文就来介绍一下如何在OSGI应用中实现Spring.Mybatis.Spring MVC框架的整合,其中S ...

  3. Java开发学习(十六)----AOP切入点表达式及五种通知类型解析

    一.AOP切入点表达式 对于AOP中切入点表达式,总共有三个大的方面,分别是语法格式.通配符和书写技巧. 1.1 语法格式 首先我们先要明确两个概念: 切入点:要进行增强的方法 切入点表达式:要进行增 ...

  4. Java开发学习(十五)----AOP入门案例及其工作流程解析

    一.AOP简介 1.1 什么是AOP AOP(Aspect Oriented Programming)面向切面编程,一种编程范式,指导开发者如何组织程序结构. OOP(Object Oriented ...

  5. Spring学习十四----------Spring AOP实例

    © 版权声明:本文为博主原创文章,转载请注明出处 实例 1.项目结构 2.pom.xml <project xmlns="http://maven.apache.org/POM/4.0 ...

  6. Java开发学习(十)----基于注解开发定义bean 已完成

    一.环境准备 先来准备下环境: 创建一个Maven项目 pom.xml添加Spring的依赖 <dependencies>    <dependency>        < ...

  7. Spring学习笔记:Spring整合Mybatis(mybatis-spring.jar)(一:知识点回顾)

    一.知识点回顾 1.Mybatis环境搭建(DAO层的实现)(使用maven项目管理工具) 需要引入的依赖包: <!-- 单元测试junit --> <dependency> ...

  8. Java开发学习(一)----初识Spring及其核心概念

    一. Spring系统架构 1.1 系统架构图 Spring Framework是Spring生态圈中最基础的项目,是其他项目的根基. Spring Framework的发展也经历了很多版本的变更,每 ...

  9. java web 学习十四(JSP原理)

    一.什么是JSP? JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于,写jsp就像在写h ...

随机推荐

  1. 2003031121——浦娟——Python数据分析第七周作业——MySQL的安装及使用

    项目 要求 课程班级博客链接 20级数据班(本) 作业要求链接 Python第七周作业 博客名称 2003031121--浦娟--Python数据分析第七周作业--MySQL的安装及使用 要求 每道题 ...

  2. css的flex布局调试

    学习经验-css的flex布局 今天遇到一个小问题 在给三个div布局时,设置父元素display:flex 此时三个div的宽度均为50%,他们并没有超出屏幕的宽度,还是撑满了父元素. 为什么呢? ...

  3. Spring Ioc源码分析系列--Ioc源码入口分析

    Spring Ioc源码分析系列--Ioc源码入口分析 本系列文章代码基于Spring Framework 5.2.x 前言 上一篇文章Spring Ioc源码分析系列--Ioc的基础知识准备介绍了I ...

  4. .NET性能优化-使用ValueStringBuilder拼接字符串

    前言 这一次要和大家分享的一个Tips是在字符串拼接场景使用的,我们经常会遇到有很多短小的字符串需要拼接的场景,在这种场景下及其的不推荐使用String.Concat也就是使用+=运算符. 目前来说官 ...

  5. 记录一次用宝塔部署微信小程序Node.js后端接口代码的详细过程

    一直忙着写毕设,上一次写博客还是元旦,大半年过去了.... 后面会不断分享各种新项目的源码与技术.欢迎关注一起学习哈! 记录一次部署微信小程序Node.js后端接口代码的详细过程,使用宝塔来部署. 我 ...

  6. Sentinel Dashboard 规则 持久化到Nacos

    本篇文章基于sentinel1.8.4版本进行改造的.本篇主要记录改造步骤 1.下载源码 https://github.com/alibaba/Sentinel 2.打开下载的sentinel,到se ...

  7. 自增特性,外键,级联更新与级联删除,表间关系,SELECT用法,GROUP BY

    自增特性 自动增长的作用: 问题:为数据表设置主键约束后,每次插入记录时,如果插入的值已经存在,会插入失败. 如何解决:为主键生成自动增长的值. 自动增长的语法: 字段名 数据类型 AUTO_INCR ...

  8. GB/T 25000.51-2016 系统与软件工程、系统与软件质量要求和评价 第51部分

    中科软测认证中心(软件测评) 1.支持GB/T 25000.51的质量特性 (1)产品质量模型及特性 功能性 功能完备性 功能正确性 功能适合性 功能性的依从性 性能效率 时间特性 资源利用率 容量 ...

  9. 揭秘华为云GaussDB(for Influx):数据直方图

    摘要:本文带您了解直方图在不同产品中的实现,以及GaussDB(for Influx)中直方图的使用方法. 本文分享自华为云社区<华为云GaussDB(for Influx)揭秘第九期:最佳实践 ...

  10. TinyMCE简介

    TinyMCE是一款开源.易用.UI时新的富文本编辑器. 插件丰富,自带插件基本满足要求 可扩展性强,可自定义功能 界面好看,符合现代审美 提供经典.内联.沉浸无干扰三种模式 官网:https://w ...