Spring + MyBatis 整合基础项目
此处使用 Intellij IDEA 和 Maven 进行项目的构建。
首先使用 IDEA 创建 Maven 项目:
选择 New Project 选择如下,不需要选择 Create from archetype,一路选择 Next 并填入 groupId 和 artifactId 等信息:
创建完成后项目结构如下:
配置文件,Mapper.xml 等静态资源需要放置在 resources 文件夹下,因为 DAO 层接口对应的 Mapper 文件一般需要放在与对应接口同一个包名下,因此在 resources 文件夹下新建一个和 DAO 层包名结构相同的文件夹放置 DAO 层接口对应的 xml 映射文件。
修改 pom.xml 文件加入需要的依赖
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.delicate</groupId>
<artifactId>spring5_demo</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13-beta-2</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.11.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.11.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.13</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.0</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.0</version>
</dependency>
</dependencies>
</project>
- log4j 是答应相关报错信息需要的依赖包,对应的需要一个 log4j.properties 配置文件
编写相关 Controller, Service,Dao 代码及其需要的 xml 映射文件
HelloController.java 内容:
package com.delicate.spring5_demo.controller;
import com.delicate.spring5_demo.bean.User;
import com.delicate.spring5_demo.service.HelloService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@ContextConfiguration(locations = "classpath:applicationContext.xml")
@RunWith(SpringJUnit4ClassRunner.class)
public class HelloController {
@Autowired
private HelloService helloServiceImpl;
@Test
public void test() {
User user = helloServiceImpl.findUserById(1);
System.out.println(user);
}
}
这里为了最后直接在 HelloController 中编写测试代码加入了
@ContextConfiguration(locations = "classpath:applicationContext.xml")
和@RunWith(SpringJUnit4ClassRunner.class)
是运行在此类下的 Test 时,为使其自动加载 applicationContext.xml 中 Spring 的相关配置而添加的注解。
applicationContext.xml 文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.1.xsd">
<context:component-scan base-package="com.delicate.spring5_demo.*"/>
<context:property-placeholder location="classpath:db.properties"/>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="yourpassword"/>
<property name="filters" value="stat"/>
<property name="maxActive" value="20"/>
<property name="initialSize" value="1"/>
<property name="maxWait" value="60000"/>
<property name="minIdle" value="1"/>
<property name="timeBetweenEvictionRunsMillis" value="60000"/>
<property name="minEvictableIdleTimeMillis" value="300000"/>
<property name="testWhileIdle" value="true"/>
<property name="testOnBorrow" value="false"/>
<property name="testOnReturn" value="false"/>
<property name="poolPreparedStatements" value="true"/>
<property name="maxOpenPreparedStatements" value="20"/>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
<!--
mybatis自动扫描加载Sql映射文件/接口 : MapperScannerConfigurer sqlSessionFactory
basePackage:指定sql映射文件/接口所在的包(自动扫描)
-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.delicate.spring5_demo.dao"/>
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
<!--
事务管理 : DataSourceTransactionManager dataSource:引用上面定义的数据源
-->
<bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
</beans>
这里使用 Alibaba 的 Druid 作为数据源。
mybatis-config.xml 文件内容:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<mappers>
<mapper resource="com/delicate/spring5_demo/dao/HelloDaoMapper.xml"/>
</mappers>
</configuration>
mybatis-config.xml 文件是 MyBatis 需要的配置文件,其中写入 mappers 标签配置 DAO 层需要的 *Mapper.xml 文件即可。
HelloService.java 文件内容:
package com.delicate.spring5_demo.service;
import com.delicate.spring5_demo.bean.User;
public interface HelloService {
User findUserById(int id);
}
HelloServiceImpl.java 文件内容:
package com.delicate.spring5_demo.service.impl;
import com.delicate.spring5_demo.bean.User;
import com.delicate.spring5_demo.dao.HelloDao;
import com.delicate.spring5_demo.service.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class HelloServiceImpl implements HelloService {
@Autowired
private HelloDao helloDao;
public User findUserById(int id) {
return helloDao.findUserById(id);
}
}
HelloDao.java 文件内容:
package com.delicate.spring5_demo.dao;
import com.delicate.spring5_demo.bean.User;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
@Repository
public interface HelloDao {
User findUserById(@Param("id") int id);
}
Dao 层接口使用 MyBatis 通过 Mapper 映射文件的方式自动实现,因此不再需要实现类。
HelloDao 对应映射文件 HelloDaoMapper.xml 文件内容:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.delicate.spring5_demo.dao.HelloDao">
<select id="findUserById" resultType="com.delicate.spring5_demo.bean.User" parameterType="int">
select * from user where id=#{id}
</select>
</mapper>
*Mapper.xml 文件select 标签 id 对应 Dao 接口中的一个方法名,该方法的实现就在对应映射文件中的标签下(此处为 select 标签),resultType 即对应数据需要包装成的 bean 类的全路径,注意 User 类的成员变量需要与数据库中域和名字完全一致。
至此,运行 HelloController 下的 Junit 测试 test(), 查询数据库成功如下,完成整合:
有什么我没讲清楚的地方欢迎提问呀,一起学习,O(∩_∩)O谢谢
PS:另外,需要的话,源码我放到 GitHub 上了:spring5_demo