示例程序
Last updated
Last updated
示例程序的放置路径:
创建一个 maven 工程,目录结构如下图所示:
引入 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>
按照如下两个脚本文件,创建数据库,并写入一定的测试数据:
-- ----------------------------
-- 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='国家表';
-- ----------------------------
-- Records of country
-- ----------------------------
INSERT INTO `country`(
`NAME`,
`CODE`
) VALUES (
'中国', 'CN'
), (
'美国', 'US'
), (
'俄罗斯', 'RU'
), (
'英国', 'GB'
), (
'法国', 'FR'
);
利用 mybatis generator 生成 java 类和 mapper 文件(注意在生成的 Mapper 类上需要添加注解 @Repository)。
生成器的代码存放路径:
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;
}
}
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;
}
}
# 全局配置
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接口的存放路径。
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, "");
}
}
日志信息输出如下:
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