# 前言

阅读本文前,希望读者能看完 Mybatis 标签的文章。

之前讲解 IoC,为了方便演示,我们将 Student,Card 等实体类注册为 Bean 对象,这样的应该是原型模式,而不是单例模式,类似参数传递时,通过只传入类的属性自动注入获取对象。

@Controller
public class HelloController {//User:String name;int age
    @RequestMapping(path = "/sayHello")
    public ModelAndView sayHello(User u){
		System.out.println(u.toString());
    }
}
// 直接用属性名传递就是
//http://localhost:8888/SpringMVC_war_exploded/sayHello?name=bob&age=100

# 整合 Mybatis

导入依赖:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.25</version>
</dependency>
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.7</version>
</dependency>
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>2.0.6</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.3.13</version>
</dependency>

# 相关 Bean 对象

  • 获取 SqlSession

之前我们为了每次快速获取一个 SqlSession,将 SqlSessionFactory 等操作放到了一个工具类中

public class SqlUtil {
    private static SqlSessionFactory factory;
    static {
        try {
            factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static SqlSession getSqlSession() {
        return factory.openSession(true);
    }
}

mybatis-spring 依赖提供了 SqlSessionTemplate 类,这就是一个官方封装的工具类,我们可以将其注册为 Bean 对象。在配置类中创建(使用注解开发):

@Configuration
@ComponentScan("com.bean")
public class Configuration {
    @Bean
    public SqlSessionTemplate sqlSessionTemplate() throws IOException {
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
        return new SqlSessionTemplate(factory);
    }
}

在 main 中使用:

public static void main(String[] args) {
    ApplicationContext context = new AnnotationConfigApplicationContext(Configuration.class);
    SqlSessionTemplate template = context.getBean(SqlSessionTemplate.class);
    StudentMapper mapper = template.getMapper(StudentMapper.class);
}
  • 获取 Mapper 对象。

我们可以将 Mapper 对象也交给 IoC 管理,在注解类添加:

@MapperScan("com.mapper")

之后要获取 Mapper 对象:

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

前提是必须将 SqlSessionTemplate 或者 SqlSessionFacoryBean 注册为 Bean 对象,否则无法初始化。

当我们使用 MapperScan 注解时,就不需要配置文件中的 <Mappers> 标签了。

  • 删除 mybatis-config.xml 配置文件。
@Configuration
@ComponentScan("com.test")
@MapperScan("com.test.mapper")
public class TestConfiguration {
    @Bean
    public DataSource dataSource(){
        return new PooledDataSource("com.mysql.cj.jdbc.Driver",
                "jdbc:mysql://localhost:3306/study", "root", "123456");
    }
    @Bean
    public SqlSessionFactoryBean sqlSessionFactoryBean(@Autowired DataSource dataSource){
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        return bean;
    }
}

我们需要创建一个数据源的实体类,载入数据库基本信息。

关于去掉配置文件,如何整合多个数据源,可以参看这篇

# HikariCP 连接池

DataSource 还有其他实现,比如 C3P0,Druid 等,本部分介绍 HikariCP 连接池。

HikariCP 是由日本程序员开源的一个数据库连接池组件,代码非常轻量,并且速度非常的快。

导入依赖

<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <version>3.4.5</version>
</dependency>

在配置类中修改一下 Bean 定义:

@Bean
public DataSource dataSource() throws SQLException {
    HikariDataSource dataSource = new HikariDataSource();
    dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/study");
    dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
    dataSource.setUsername("root");
    dataSource.setPassword("123456");
    return dataSource;
}

该数据源采用了 SLF4J 日志框架打印日志信息,但是没有任何日志实现,我们需要导入依赖:

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-jdk14</artifactId>
    <version>1.7.25</version>
</dependency>

lombok 也支持该日志框架快速注解:

@Slf4j
public class Main {
    public static void main(String[] args) {
        log.info("xxx");
    }
}

# 参考

https://www.yuque.com/qingkongxiaguang/spring/rlgcf7#fff8b166