示例程序

示例程序的放置路径:

https://github.com/zhang993632987/self-learning/tree/3f3204831f5755d7e1555c3f2753498666113cba/java/spring-learning

1. 新建项目

创建一个 maven 工程,目录结构如下图所示:

2. 添加依赖

引入 spring 和 mybatis 相关依赖,最终 pom.xml 文件内容如下:

  
  <?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">
      <modelVersion>4.0.0</modelVersion>

      <groupId>com.study.mybatis</groupId>
      <artifactId>mybatis-learning</artifactId>
      <version>1.0-SNAPSHOT</version>
      <packaging>war</packaging>

      <properties>
          <mybatis.version>3.5.13</mybatis.version>
          <mybatis-spring.version>2.1.1</mybatis-spring.version>
          <maven.compiler.source>8</maven.compiler.source>
          <maven.compiler.target>8</maven.compiler.target>
      </properties>

      <dependencyManagement>
          <dependencies>
              <dependency>
                  <groupId>org.springframework</groupId>
                  <artifactId>spring-framework-bom</artifactId>
                  <version>5.3.29</version>
                  <type>pom</type>
                  <scope>import</scope>
              </dependency>
          </dependencies>
      </dependencyManagement>

      <dependencies>
          <!--
              ======================== Spring ========================
          -->
          <dependency>
              <groupId>org.springframework</groupId>
              <artifactId>spring-core</artifactId>
          </dependency>
          <dependency>
              <groupId>org.springframework</groupId>
              <artifactId>spring-context</artifactId>
          </dependency>
          <dependency>
              <groupId>org.springframework</groupId>
              <artifactId>spring-jdbc</artifactId>
          </dependency>

          <!--
              ======================= mybatis =======================
          -->
          <dependency>
              <groupId>org.mybatis</groupId>
              <artifactId>mybatis</artifactId>
              <version>${mybatis.version}</version>
          </dependency>
          <dependency>
              <groupId>org.mybatis</groupId>
              <artifactId>mybatis-spring</artifactId>
              <version>${mybatis-spring.version}</version>
          </dependency>

          <!--
              ======================= 数据库连接池 =======================
          -->
          <dependency>
              <groupId>com.alibaba</groupId>
              <artifactId>druid</artifactId>
              <version>1.2.19</version>
          </dependency>

          <!--
              ======================= MySQL连接器 =======================
          -->
          <dependency>
              <groupId>mysql</groupId>
              <artifactId>mysql-connector-java</artifactId>
              <version>8.0.28</version>
              <scope>runtime</scope>
          </dependency>

          <!--
              ======================= 日志 =======================
          -->
          <dependency>
              <groupId>org.slf4j</groupId>
              <artifactId>slf4j-log4j12</artifactId>
              <version>1.7.30</version>
          </dependency>

          <!--
              ======================= 测试 =======================
          -->
          <dependency>
              <groupId>org.springframework</groupId>
              <artifactId>spring-test</artifactId>
              <scope>test</scope>
          </dependency>
          <dependency>
              <groupId>junit</groupId>
              <artifactId>junit</artifactId>
              <version>4.13.2</version>
              <scope>test</scope>
          </dependency>
      </dependencies>
  </project>

3. 创建数据库

按照如下两个脚本文件,创建数据库,并写入一定的测试数据:

schema.sql
  -- ----------------------------
  -- Table structure for country
  -- ----------------------------
  DROP TABLE IF EXISTS `country`;
  CREATE TABLE `country`
  (
      `ID` int UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',
      `NAME` varchar(255) NOT NULL COMMENT '国家名称',
      `CODE` varchar(255) NOT NULL COMMENT '国家编码',
      PRIMARY KEY (`ID`) 
  ) ENGINE=InnoDB COMMENT='国家表'; ​
test-data.sql
  -- ----------------------------
  -- Records of country
  -- ----------------------------
  INSERT INTO `country`(
      `NAME`,
      `CODE`
  ) VALUES (
      '中国', 'CN'
  ), (
      '美国', 'US'
  ), (
      '俄罗斯', 'RU'
  ), (
      '英国', 'GB'
  ), (
      '法国', 'FR'
  );

4. 生成文件

利用 mybatis generator 生成 java 类和 mapper 文件(注意在生成的 Mapper 类上需要添加注解 @Repository)。

生成器的代码存放路径:

https://github.com/zhang993632987/self-learning/tree/3f3204831f5755d7e1555c3f2753498666113cba/java/mybatis-generator

5. 配置 Spring 和 DataSource:

package com.study.mybatis.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

/**
 * @author Zhang B H
 * @create 2023-09-28 10:04
 */
@Configuration
@ComponentScan(basePackages = "com.study.mybatis")
public class SpringConfig {
}
package com.study.mybatis.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;

import javax.sql.DataSource;

/**
* @author Zhang B H
* @create 2023-09-30 16:33
*/
public class DatabaseConfig {

   @Profile("qa")
   @Bean("dataSource")
   public DataSource druidDataSource() {
       DruidDataSource dataSource = new DruidDataSource();
       dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
       dataSource.setUrl("jdbc:mysql://localhost:3306/mybatis");
       dataSource.setUsername("root");
       dataSource.setPassword("123456");
       return dataSource;
   }
}

5. 配置 mybatis

package com.study.mybatis.config;

import org.apache.ibatis.logging.slf4j.Slf4jImpl;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;

import javax.sql.DataSource;
import java.io.IOException;

/**
* @author Zhang B H
* @create 2023-09-28 10:48
*/
@Configuration
@Import(DatabaseConfig.class)
@MapperScan(basePackages = "com.study.mybatis.mapper")
public class MybatisConfig {

   @Bean
   public ResourcePatternResolver resourceResolver() {
       return new PathMatchingResourcePatternResolver();
   }

   @Bean
   public SqlSessionFactoryBean sqlSessionFactoryBean(
           DataSource dataSource,
           ResourcePatternResolver resourceResolver) throws IOException {
       SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
       sqlSessionFactoryBean.setDataSource(dataSource);
       sqlSessionFactoryBean.setMapperLocations(
           resourceResolver.getResources("classpath:mappers/CountryMapper.xml")
       );

       sqlSessionFactoryBean.setConfiguration(getConfiguration());
       return sqlSessionFactoryBean;
   }

   private org.apache.ibatis.session.Configuration getConfiguration() {
       org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
       configuration.setCacheEnabled(true);
       configuration.setMapUnderscoreToCamelCase(true);
       configuration.setLazyLoadingEnabled(false);
       configuration.setLogImpl(Slf4jImpl.class);
       configuration.setLazyLoadingEnabled(true);
       configuration.setAggressiveLazyLoading(false);
       return configuration;
   }
}​

6. 配置日志,使得能够打印 SQL 执行详细信息

# 全局配置
log4j.rootCategory=INFO, console
# Mybatis 日志配置
log4j.logger.com.study.mybatis.mapper=TRACE

log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n
log4j.logger.com.study.mybatis.mapper=TRACE

注意该行配置:

log4j.logger.com.study.mybatis.mapper=TRACE

com.study.mybatis.mapper 是Mapper接口的存放路径。

7. 编写单元测试

package com.study.mybatis.mapper;

import com.study.mybatis.config.SpringConfig;
import com.study.mybatis.entity.Country;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.util.Assert;

import java.util.List;

/**
* @author Zhang B H
* @create 2023-09-30 11:49
*/
@ActiveProfiles("qa")
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfig.class)
public class CountryMapperTest {

   @Autowired
   private CountryMapper countryMapper;

   @Test
   public void selectAll() {
       List<Country> countries = countryMapper.selectAll();
       Assert.notEmpty(countries, "");
   }

}

8. 执行单元测试

日志信息输出如下:

23/09/30 16:52:27 INFO DruidDataSource: {dataSource-1} inited
23/09/30 16:52:27 DEBUG selectAll: ==>  Preparing: select ID, `NAME`, CODE from country
23/09/30 16:52:27 DEBUG selectAll: ==> Parameters: 
23/09/30 16:52:28 TRACE selectAll: <==    Columns: ID, NAME, CODE
23/09/30 16:52:28 TRACE selectAll: <==        Row: 1, 中国, CN
23/09/30 16:52:28 TRACE selectAll: <==        Row: 2, 美国, US
23/09/30 16:52:28 TRACE selectAll: <==        Row: 3, 俄罗斯, RU
23/09/30 16:52:28 TRACE selectAll: <==        Row: 4, 英国, GB
23/09/30 16:52:28 TRACE selectAll: <==        Row: 5, 法国, FR
23/09/30 16:52:28 DEBUG selectAll: <==      Total: 5
23/09/30 16:52:28 INFO DruidDataSource: {dataSource-1} closing ...
23/09/30 16:52:28 INFO DruidDataSource: {dataSource-1} closed

Process finished with exit code 0

Last updated