Spring框架是一个开放源代码的J2EE应用程序框架,它使得我们的开发过程更简单,可以大大减少工作量,提高效率。spring具有轻量化、ioc(控制反转)、aop(面向切面编程)思想、mvc模式等特性,在企业中被广泛使用。
今天我们使用Maven完成spring的配置以及和MyBatis的整合。
动态扫描过程图
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| graph TD subgraph ApplicationContext source(DataSource连接池) factory(SqlSessionFactory) scan(MapperScannerConfiurer动态扫描器) end api(Mapper接口) other(后续操作...) config(Mapper配置)
source-->factory factory-->scan scan-->api config-->scan api-->other
|
配置xml
配置pom.xml
在pom.xml中加入properties,指定spring版本:
1 2 3
| <properties> <spring.version>5.0.2.RELEASE</spring.version> </properties>
|
在<dependencies>中引入spring的全部包、mybatis以及mybatis-
spring整合包、c3p0连接池、mysql数据库驱动、
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency>
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.0</version> </dependency>
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.17</version> </dependency> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.2</version> </dependency>
|
配置ApplicationContext.xml
在resources目录中创建ApplicationContext.xml,引入以下内容:
mybatis-spring.jar提供了很多方便的类:
SqlSessionFactoryBean可以直接配置SqlSessionFactory而不需要我们提供mybatis-config.xml配置文件。
需要参数dataSource: 提供一个连接池
MapperScannerConfigurer会自动扫描mapper包内的所有mapper映射文件,使得我们直接一步直接获得mapper接口
它会自动读取ApplicationContext.xml中配置的SqlSessionFactoryBean工厂类,并自动生成所有的mapper接口
需要参数basePackage: 指定mapper包的位置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="com.mysql.cj.jdbc.Driver"/> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/hello_mysql?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC"/> <property name="user" value="root"/> <property name="password" value="123"/> </bean> <bean name="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> </bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="mapper"/> </bean> </beans>
|
通过mybatis-spring的整合,我们就不需要再配置mybatis-config.xml了。
提供bean和mapper
要实现动态扫描开发,我们需要提供一个bean实现类,并且提供mapper接口和对应的mapper.xml配置文件。
笔者这里直接使用MyBatis Generator生成了bean(pojo)实现类和mapper配置文件以及mapper接口:
pojo/Users中生成的实现类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| package pojo;
public class Users { private Integer id; String name; private Integer age;
public Users(Integer id, String name, Integer age) { this.id = id; this.name = name; this.age = age; } public Users() { super(); } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name == null ? null : name.trim(); } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return id + ", " + name + ", " + age; } }
|
mapper/UsersMapper中生成的接口文件,MyBatis Generator为我们自动生成了各种方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| package mapper;
import java.util.List; import org.apache.ibatis.annotations.Param; import pojo.Users; import pojo.UsersExample;
public interface UsersMapper { long countByExample(UsersExample example); int deleteByExample(UsersExample example); int deleteByPrimaryKey(Integer id); int insert(Users record); int insertSelective(Users record); List<Users> selectByExample(UsersExample example); Users selectByPrimaryKey(Integer id); int updateByExampleSelective(@Param("record") Users record, @Param("example") UsersExample example); int updateByExample(@Param("record") Users record, @Param("example") UsersExample example); int updateByPrimaryKeySelective(Users record); int updateByPrimaryKey(Users record); }
|
实现访问数据库
基于mybatis-
spring下的动态扫描开发,要访问数据库非常简单,笔者此处实现了一个UsersTest类,使用junit进行测试,只需3行代码我们就可以访问数据库并返回数据了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| package test;
import mapper.UsersMapper; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import pojo.Users;
public class UsersTest { @Test public void test1() { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("ApplicationContext.xml"); UsersMapper mapper = applicationContext.getBean(UsersMapper.class); Users user = mapper.selectByPrimaryKey(1); System.out.println(user); } }
|
测试成功,控制台中正确返回了结果(此处DEBUG数据来自log4j):
1 2 3 4 5 6 7
| DEBUG [main] - JDBC Connection [com.mchange.v2.c3p0.impl.NewProxyConnection@410ae9a3 [wrapping: com.mysql.cj.jdbc.ConnectionImpl@319988b0]] will not be managed by Spring DEBUG [main] - ==> Preparing: select id, name, age from users where id = ? DEBUG [main] - ==> Parameters: 1(Integer) DEBUG [main] - <== Total: 1 DEBUG [main] - Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7d3430a7] DEBUG [main] - Returning JDBC Connection to DataSource 1, Adam, 13
|
完整目录(此处service包可忽略):
