Spring整合Mybatis和Junit (注解开发) 手把手讲解

Spring整合

只想看Mybatis整合移步观看第二节, 手把手教

Mybatis核心分析

既然Spring是用来管理bean的, 那么我们来分析一下Mybatis是有那些bean是应该由Spring管理的

Mybatis核心程序如下:

// 1. 创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 2. 加载SqlMapConfig.xml配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
// 3. 创建SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
// 4. 获取SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 5. 获取mapper对象
AccountDao accountMapper = sqlSession.getMapper(AccountDao.class);

// 调用方法
Account ac = accountMapper.findById(2);
System.out.println(ac);
// 6. 释放资源
sqlSession.close();
  • 我们可以将Mybatis的核心程序拆解为下面几部分

初始化SqlSessionFactory对象

// 1. 创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 2. 加载SqlMapConfig.xml配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
// 3. 创建SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);

获取连接, 获取实现

// 4. 获取SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 5. 执行SqlSession对象执行查询,获取结果User
AccountDao accountMapper = sqlSession.getMapper(AccountDao.class);

调用数据层接口

// 调用方法
Account ac = accountMapper.findById(2);
System.out.println(ac);

关闭连接

// 6. 释放资源
sqlSession.close();

在Mybatis的核心程序中, 我们可以发现最核心的的其实是初始化SqlSessionFactory对象的三行代码

SqlSessionFactory对象又来自于Mybatis的配置文件, 我们可以将配置文件下面三部分

  • 其中初始化映射配置是根据业务需求不断变化的, 因此该配置文件中的核心部分是初始化类型别名和初始化dataSource两部分

在这里插入图片描述

整合Mybatis步骤

为了方便阅读, 目录结构给到大家

在这里插入图片描述

pom.xml文件中导入需要使用的依赖:

<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.chenyq</groupId>
  <artifactId>spring_09_spring_mybatis</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>spring_09_spring_mybatis Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <!--spring依赖-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.2.10.RELEASE</version>
    </dependency>

    <!--mybatis依赖-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.5</version>
    </dependency>

    <!--mysql驱动-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.46</version>
    </dependency>

    <!--druid-->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.1.0</version>
    </dependency>

    <!--Spring操作数据库的依赖-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>5.2.10.RELEASE</version>
    </dependency>

    <!--spring整合mybatis依赖-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>1.3.0</version>
    </dependency>
  </dependencies>
</project>

创建jdbc.properties配置文件

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/db1?useSSL=false
jdbc.username=root
jdbc.password=r123456789

创建Spring核心配置类:

@Configuration
@ComponentScan("com.chenyq") //扫描配置路径下包
@PropertySource("classpath:jdbc.properties") //加载jdbc.properties配置文件
public class SpringConfig {
    
    
}

创建独立配置文件类JdbcConfig, 注入jdbc.properties文件中的变量, 返回一个dataSource对象

public class JdbcConfig {
    
    
    @Value("${jdbc.driver}")
    private String driver;
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.username}")
    private String username;
    @Value("${jdbc.password}")
    private String password;

    @Bean
    public DataSource dataSource() {
    
    
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName(driver);
        ds.setUrl(url);
        ds.setUsername(username);
        ds.setPassword(password);
        return ds;
    }
}

核心配置中导入独立配置类

@Configuration
@ComponentScan("com.chenyq") //扫描配置路径下包
@PropertySource("classpath:jdbc.properties") //加载jdbc.properties配置文件
@Import(JdbcConfig.class) // 导入独立配置类
public class SpringConfig {
    
    
}

到这里准备工作就做完了, 下面我们要配置SqlSessionFactory对应的bean, 单独创建一个独立配置类MybatisConfig

public class MybatisConfig {
    
    
    // 创建SqlSession的bean
    @Bean
    public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) {
    
    
        SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();

        ssfb.setTypeAliasesPackage("com.chenyq.pojo"); // 设置别名的包
        ssfb.setDataSource(dataSource); // 注入引用类型

        return ssfb;
    }

    // 初始化映射的bean
    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer() {
    
    
        MapperScannerConfigurer msc = new MapperScannerConfigurer();

        msc.setBasePackage("com.chenyq.dao"); // 配置映射文件在哪个包下

        return msc;
    }
}

核心配置文件SpringConfig中在引入独立配置类MybatisConfig

@Configuration
@ComponentScan("com.chenyq") //扫描配置路径下包
@PropertySource("classpath:jdbc.properties") //加载jdbc.properties配置文件
@Import({
    
    JdbcConfig.class, MybatisConfig.class}) // 导入独立配置类
public class SpringConfig {
    
    
}

到这里整合Mybatis的步骤就完成了, 下面使用Spring的方式我们来编写测试一下吧

首先是将数据层UserDao定义为bean

public interface UserDao {
    
    
    @Select("select * from tb_user where id=#{id}")
    User selectById(int id);
}

然后将Service层, UserServiceImpl定义为bean, 并将UserDao注入进来使用

@Service
public class UserServiceImpl implements UserService {
    
    
    @Autowired
    private UserDao userDao;

    public User selectById(int id) {
    
    

        User user = userDao.selectById(id);

        return user;
    }
}

在App类中测试使用

public class App {
    
    
    public static void main(String[] args) {
    
    
        // 初始化容器
        ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
        // 获取bean
        UserService userService = ctx.getBean(UserService.class);
        // 调用方法
        User user = userService.selectById(1);
        System.out.println(user);
    }
}

整合Junit步骤

首先导入左边, Junit依赖坐标, 和Spring整合Junit的坐标:

<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.chenyq</groupId>
  <artifactId>spring_09_spring_mybatis</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>spring_09_spring_mybatis Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <!--junit依赖-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>

    <!--spring整合Junit依赖-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>5.2.10.RELEASE</version>
    </dependency>
  </dependencies>
</project>

第一步: 通过@RunWith注解设置测试类加载器, 通过@ContextConfiguration注解配置Spring运行环境(固定格式)

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfig.class)
public class UserServiceTest {
    
    
}

第二步: 依赖注入, 自动装配注入要测试的bean, 调用bean方法测试即可

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfig.class)
public class UserServiceTest {
    
    
    @Autowired
    public UserService userService;

    @Test
    public void testSelectById() {
    
    
        System.out.println(userService.selectById(2));
    }
}

猜你喜欢

转载自blog.csdn.net/m0_71485750/article/details/127959960