• Mybatis深入:整合框架


    整合Mybatis框架

    通过了解数据源,我们已经清楚,Mybatis实际上是在使用自己编写的数据源(数据源有很多,之后我们再聊其他的)默认使用的是池化的数据源,它预先存储了很多的连接对象。

    那么我们来看一下,如何将Mybatis与Spring更好的结合呢,比如我们现在希望将SqlSessionFactory交给IoC容器进行管理,而不是我们自己创建工具类来管理(我们之前一直都在使用工具类管理和创建会话)

    首先导入依赖:

    1. <dependency>
    2. <groupId>mysqlgroupId>
    3. <artifactId>mysql-connector-javaartifactId>
    4. <version>8.0.25version>
    5. dependency>
    6. <dependency>
    7. <groupId>org.mybatisgroupId>
    8. <artifactId>mybatisartifactId>
    9. <version>3.5.7version>
    10. dependency>
    11. <dependency>
    12. <groupId>org.mybatisgroupId>
    13. <artifactId>mybatis-springartifactId>
    14. <version>2.0.6version>
    15. dependency>
    16. <dependency>
    17. <groupId>org.springframeworkgroupId>
    18. <artifactId>spring-jdbcartifactId>
    19. <version>5.3.13version>
    20. dependency>

    在mybatis-spring依赖中,为我们提供了SqlSessionTemplate类,它其实就是官方封装的一个工具类,我们可以将其注册为Bean,这样我们随时都可以向IoC容器索要,而不用自己再去编写一个工具类了,我们可以直接在配置类中创建:

    1. @Configuration
    2. @ComponentScan("com.test")
    3. public class TestConfiguration {
    4. @Bean
    5. public SqlSessionTemplate sqlSessionTemplate() throws IOException {
    6. SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
    7. return new SqlSessionTemplate(factory);
    8. }
    9. }
    1. "1.0" encoding="UTF-8" ?>
    2. configuration
    3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
    5. <configuration>
    6. <environments default="development">
    7. <environment id="development">
    8. <transactionManager type="JDBC"/>
    9. <dataSource type="POOLED">
    10. <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
    11. <property name="url" value="jdbc:mysql://localhost:3306/study"/>
    12. <property name="username" value="root"/>
    13. <property name="password" value="123456"/>
    14. dataSource>
    15. environment>
    16. environments>
    17. <mappers>
    18. <mapper class="com.test.mapper.TestMapper"/>
    19. mappers>
    20. configuration>
    1. public static void main(String[] args) {
    2. ApplicationContext context = new AnnotationConfigApplicationContext(TestConfiguration.class);
    3. SqlSessionTemplate template = context.getBean(SqlSessionTemplate.class);
    4. TestMapper testMapper = template.getMapper(TestMapper.class);
    5. System.out.println(testMapper.getStudent());
    6. }
    1. @Data
    2. public class Student {
    3. int sid;
    4. String name;
    5. String sex;
    6. }

    最后成功得到Student实体类,证明SqlSessionTemplate成功注册为Bean可以使用了。虽然这样已经很方便了,但是还不够方便,我们依然需要手动去获取Mapper对象,那么能否直接得到对应的Mapper对象呢,我们希望让Spring直接帮助我们管理所有的Mapper,当需要时,可以直接从容器中获取,我们可以直接在配置类上方添加注解:

     

    @MapperScan("com.test.mapper")

    这样,Spring会自动扫描所有的Mapper,并将其实现注册为Bean,那么我们现在就可以直接通过容器获取了:

    1. public static void main(String[] args) throws InterruptedException {
    2. ApplicationContext context = new AnnotationConfigApplicationContext(TestConfiguration.class);
    3. TestMapper mapper = context.getBean(TestMapper.class);
    4. System.out.println(mapper.getStudent());
    5. }

    请一定注意,必须存在SqlSessionTemplate或是SqlSessionFactoryBean的Bean,否则会无法初始化(毕竟要数据库的链接信息)

    我们接着来看,如果我们希望直接去除Mybatis的配置文件,那么改怎么去实现呢?我们可以使用SqlSessionFactoryBean类:

    1. @Configuration
    2. @ComponentScan("com.test")
    3. @MapperScan("com.test.mapper")
    4. public class TestConfiguration {
    5. @Bean
    6. public DataSource dataSource(){
    7. return new PooledDataSource("com.mysql.cj.jdbc.Driver",
    8. "jdbc:mysql://localhost:3306/study", "root", "123456");
    9. }
    10. @Bean
    11. public SqlSessionFactoryBean sqlSessionFactoryBean(@Autowired DataSource dataSource){
    12. SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
    13. bean.setDataSource(dataSource);
    14. return bean;
    15. }
    16. }

    删除配置文件,重新再来运行,同样可以正常使用Mapper。从这里开始,通过IoC容器,Mybatis已经不再需要使用配置文件了,之后基于Spring的开发将不会再出现Mybatis的配置文件。

    使用HikariCP连接池

    前面我们提到了数据源还有其他实现,比如C3P0、Druid等,它们都是非常优秀的数据源实现(可以自行了解),不过我们这里要介绍的,是之后在SpringBoot中还会遇到的HikariCP连接池。

    HikariCP是由日本程序员开源的一个数据库连接池组件,代码非常轻量,并且速度非常的快。根据官方提供的数据,在酷睿i7开启32个线程32个连接的情况下,进行随机数据库读写操作,HikariCP的速度是现在常用的C3P0数据库连接池的数百倍。在SpringBoot2.0中,官方也是推荐使用HikariCP。
     



    首先,我们需要导入依赖:
     

    1. <dependency>
    2. <groupId>com.zaxxergroupId>
    3. <artifactId>HikariCPartifactId>
    4. <version>3.4.5version>
    5. dependency>

    接着修改一下Bean的定义:

    1. @Bean
    2. public DataSource dataSource() throws SQLException {
    3. HikariDataSource dataSource = new HikariDataSource();
    4. dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/study");
    5. dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
    6. dataSource.setUsername("root");
    7. dataSource.setPassword("123456");
    8. return dataSource;
    9. }

    最后我们发现,同样可以得到输出结果,但是出现了一个报错:

    1. SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
    2. SLF4J: Defaulting to no-operation (NOP) logger implementation
    3. SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

    此数据源实际上是采用了SLF4J日志框架打印日志信息,但是现在没有任何的日志实现(slf4j只是一个API标准,它规范了多种日志框架的操作,统一使用SLF4J定义的方法来操作不同的日志框架)我们这里就使用JUL作为日志实现,我们需要导入另一个依赖:

    1. <dependency>
    2. <groupId>org.slf4jgroupId>
    3. <artifactId>slf4j-jdk14artifactId>
    4. <version>1.7.25version>
    5. dependency>

    注意版本一定要和slf4j-api保持一致!

    这样就能得到我们的日志信息了:

     

    1. 十二月 07, 2021 8:46:41 下午 com.zaxxer.hikari.HikariDataSource getConnection
    2. 信息: HikariPool-1 - Starting...
    3. 十二月 07, 2021 8:46:41 下午 com.zaxxer.hikari.HikariDataSource getConnection
    4. 信息: HikariPool-1 - Start completed.
    5. Student(sid=1, name=小明, sex=男)

    在SpringBoot阶段,我们还会遇到HikariPool-1 - Starting...HikariPool-1 - Start completed.同款日志信息。

    当然,Lombok肯定也是支持这个日志框架快速注解的:

    1. @Slf4j
    2. public class Main {
    3. public static void main(String[] args) {
    4. log.info("项目正在启动...");
    5. ApplicationContext context = new AnnotationConfigApplicationContext(TestConfiguration.class);
    6. TestMapper mapper = context.getBean(TestMapper.class);
    7. System.out.println(mapper.getStudent());
    8. }
    9. }

  • 相关阅读:
    观测云产品更新|观测云帮助文档全新上线;新增 Profile 可观测
    matlab实现了一个基于粒子群优化(PSO)算法的程序,用于寻找一种三层材料结构的最佳配置
    快速了解什么是jwt及如何使用jwt
    Parallelogram law
    2流高手速成记(之四):SpringBoot整合redis及mongodb
    【Linux】shell命令运行原理---认识Linux基本指令
    Redis哨兵(Sentinel)
    【应用层协议】HTTPS的加密流程
    Java虚拟机
    java8 Optional理解及示例
  • 原文地址:https://blog.csdn.net/Leon_Jinhai_Sun/article/details/126440157