目录
(1) mybatis的配置文件:在classpath下创建SqlMapConfig.xml
(2) spring的配置文件:applicationContext.xml
(4) 数据库连接池:在applicationContext配置数据源
(5) 配置SqlSessionFactory(applicationContext.xml)
(6) 配置mapper文件的扫描器(applicationContext.xml)
本文详细的通过Maven及Spring整合MyBatis的等技术完成一个简单删除、查询、编辑、新增功能,通过spring管理SqlSessionFactory、mapper接口 。 完整工程结构如下:
一、新建Maven工程
第一步:打开MyEclipse->File->New->Other或者按Ctrl+N的热键进入新建选项,
第二步:找到Maven文件夹或者在Wizards输入Maven会出现,选中Maven Project 点Next。
第三步:创建一个新的Maven project有3个选项,分别是
Create a simple project (skip archetype selection) :创建一个简单的项目(跳过对原型模板的选择)[手动选中]
User default Workspace location:使用本地默认的工作空间
--Loaction:本地工作空间目录
Add project(s) to working set :增加项目到工作集
第四步:填写Artifact
-------Group Id:组Id,针对一个项目的普遍唯一识别符。相当于我们日常使用的包名,例如:org.lxh
-------Artifact Id:要新建的项目的名字
-------Version:版本号,默认0.0.1-SNAPSHOT
Packing:要将该项目生成什么类型,模块化开发父项目选着为pom类型,web项目需要部署到应用服务器中运行就选着war,默认是jar
第五步:转换为spring(也就是自动添加spring相关配置文件,不用自己手动新建,比较方便)
第六步:选择对应的spring版本以及java版本,targer runtime选择自己的jdk,如果是web项目,就选择自己搭建的tomcat
第七步:选择class文件生成目录,默认下一步
第八步:选择spring配置文件生成位置:统一更改在生成在resources下
最后生成的项目(如图:生成后的maven项目)分别有以下几个目录
src/main/java:主要编码的目录
src/main/resource:资源目录.如:spring的xml.Java配置properties
src/test/java:测试的代码
src/test/resource:测试的资源.如:spring的xml.Java配置properties
JRE System Library:Java运行环境,默认JavaSE1.5,需要修改,如果要统一更改的话请更改maven配置文件setting.xml中的文件

二、创建数据库与表
使用本地mysql数据库test,新建表s_user
DROP TABLE IF EXISTS `s_user`;
CREATE TABLE `s_user` (
`user_id` int(11) NOT NULL AUTO_INCREMENT,
`user_name` varchar(30) DEFAULT NULL,
`user_birthday` date DEFAULT NULL,
`user_salary` double DEFAULT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of s_user
-- ----------------------------
INSERT INTO `s_user` VALUES ('1', '姓名', '2019-03-29', '21');
三、添加依赖包
整合spring和mybatis需要的jar包:
(1) mybatis的jar包
(2) spring的jar包
(3) spring和mybatis的整合包
(4) mysql的数据库驱动
(5) 数据库连接池
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.version>4.3.0.RELEASE</spring.version>
</properties>
<dependencies>
<!-- 1.mybatis ORM框架 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
<!--2.Spring框架核心库 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- aspectJ AOP 织入器 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.9</version>
</dependency>
<!-- Spring Web -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<!--Spring java数据库访问包,在本例中主要用于提供数据源 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!--Spring事物管理 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<!--3.mybatis-spring适配器 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<!--3 数据库 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.6</version>
</dependency>
<!-- 4 c3p0 数据库连接池 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
<!--log4j日志包 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.6.1</version>
</dependency>
<!-- JUnit单元测试工具 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
</dependencies>
四、新建POJO实体层
package com.sm.po;
import java.util.Date;
public class User {
private int id;
private String name;
private Date birthday;
private double salary;
//set,get 方法
}
五、新建MyBatis SQL映射层,配置Mapper文件
package com.sm.mapper;
import java.util.List;
import com.sm.po.User;
public interface UserMapper {
// 保存用户
public void save(User user);
// 更新
public void update(User user);
// 根据id查询删除单个user信息
public void delete(int id);
// 根据id查询单个user信息
public User findById(int id);
// 查询全部
public List<User> findAll();
}
为MyBatis接口创建的映射文件UserMapper.xml(命名尽量都遵循一个规则,便于扫描,这里约定以实体名+Mapper)如下:
<?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.sm.mapper.UserMapper">
<resultMap type="User" id="userResult">
<result column="user_id" property="id"/>
<result column="user_name" property="name"/>
<result column="user_birthday" property="birthday"/>
<result column="user_salary" property="salary"/>
</resultMap>
<!-- 取得插入数据后的 id -->
<insert id="save" keyColumn="user_id" keyProperty="id" useGeneratedKeys="true">
insert into s_user(user_name,user_birthday,user_salary)
values(#{name},#{birthday},#{salary})
</insert>
<update id="update">
update s_user
set user_name = #{name},
user_birthday = #{birthday},
user_salary = #{salary}
where user_id = #{id}
</update>
<delete id="delete">
delete from s_user
where user_id = #{id}
</delete>
<select id="findById" parameterType="int" resultMap="userResult">
select *
from s_user
where user_id = #{id}
</select>
<select id="findAll" resultMap="userResult">
select *from s_user
</select>
</mapper>
六、完成Spring整合MyBatis配置
(1) mybatis的配置文件:在classpath下创建SqlMapConfig.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>
<!-- 指定包名,mybatis自动扫描包中的po类,自动定义别名,别名就是类名(首字母大写或小写都可以)-->
<typeAliases>
<package name="com.sm.po"/>
</typeAliases>
<!-- 批量加载mapper
指定mapper接口的包名,mybatis自动扫描包下边所有mapper接口进行加载
遵循一些规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录 中
上边规范的前提是:使用的是mapper代理方法
和spring整合后,使用mapper扫描器,这里不需要配置了
-->
<!-- <package name="com.sm.mapper"/> -->
<!-- 加载 映射文件 -->
<!-- <mappers>
<mapper resource="mapper/UserMapper.xml" />
</mappers> -->
</configuration>
(2) spring的配置文件:applicationContext.xml
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
</beans>
(3) 数据源 c3po 配置db.properties
有问题参考:https://www.cnblogs.com/panchanggui/p/10401763.html
现在按照最新官方提示支持将com.mysql.jdbc.Driver 改为 com.mysql.cj.jdbc.Driver
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT
jdbc.username=root
jdbc.password=123456
(4) 数据库连接池:在applicationContext配置数据源
<!-- 加载配置文件 -->
<context:property-placeholder location="classpath:db.properties" />
<!--2 配置C3P0数据源 -->
<bean id="datasource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<!--驱动类名 -->
<property name="driverClass" value="${jdbc.driverClassName}" />
<!-- url -->
<property name="jdbcUrl" value="${jdbc.url}" />
<!-- 用户名 -->
<property name="user" value="${jdbc.username}" />
<!-- 密码 -->
<property name="password" value="${jdbc.password}" />
<!-- 当连接池中的连接耗尽的时候c3p0一次同时获取的连接数 -->
<property name="acquireIncrement" value="5"></property>
<!-- 初始连接池大小 -->
<property name="initialPoolSize" value="10"></property>
<!-- 连接池中连接最小个数 -->
<property name="minPoolSize" value="5"></property>
<!-- 连接池中连接最大个数 -->
<property name="maxPoolSize" value="20"></property>
</bean>
(5) 配置SqlSessionFactory(applicationContext.xml)
<!-- mapper配置 -->
<!-- 让spring管理sqlsessionfactory 使用mybatis和spring整合包中的 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 数据库连接池 -->
<property name="dataSource" ref="datasource" />
<!-- 加载mybatis的mapper接口映射文件 -->
<property name="mapperLocations" value="classpath*:com/sm/mapper/*.xml" />
<!-- 加载mybatis的全局配置文件 -->
<property name="configLocation" value="classpath:SqlMapConfig.xml" />
</bean>
注意:在定义sqlSessionFactory时指定数据源dataSource和mybatis的配置文件。
(6) 配置mapper文件的扫描器(applicationContext.xml)
<!-- mapper批量扫描:从mapper包中扫描出mapper接口,自动创建代理对象并且在spring容器中注册
遵循规范:将mapper.java和mapper.xml映射文件名称保持一致,且在一个目录中,不用在sqlMapConfig.xml中进行配置,
自动扫描出来的mapper的bean的id为mapper类名(首字母小写)-->
<bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- value值为mapper接口包地址 ,扫描包路径,中间可以用逗号或分号分隔定义多个包-->
<property name="basePackage" value="com.sm.mapper"></property>
</bean>
七、创建服务层
标准的mvc架构,service是接口加实现类,这里只是简单整合,就直接用类
package com.sm.service;
import java.util.List;
import com.sm.po.User;
public interface UserService {
public List<User> findAll() ;
public User findById(int id);
public void save(User user) ;
public void delete(int id);
public void update(User user) ;
}
实现类
package com.sm.service.imp;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.sm.mapper.UserMapper;
import com.sm.po.User;
import com.sm.service.UserService;
@Service(value="userService")
public class impUserService implements UserService {
@Autowired
UserMapper userMapper;
@Override
public List<User> findAll() {
// TODO Auto-generated method stub
return null;
}
@Override
public User findById(int id) {
System.out.println("id" + id);
if(("").equals(id)){
System.out.println("id不能為空");
return null;
}
User user = userMapper.findById(id);
return user;
}
@Override
public void save(User user) {
}
@Override
public void delete(int id) {
// TODO Auto-generated method stub
}
@Override
public void update(User user) {
// TODO Auto-generated method stub
}
}
八、JUnit测试服务类
package com.sm.service;
import static org.junit.Assert.fail;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.sm.po.User;
public class UserServiceTest {
private ApplicationContext applicationContext;
@Before
//在setUp中得到spring的容器
public void setUp() throws Exception {
applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
}
@Test
public void testFindById() {
UserService UserService = (UserService)applicationContext.getBean("userService");
User user = UserService.findById(1);
System.out.println(user);
}
@Test
public void testSave() {
fail("Not yet implemented");
}
@Test
public void testDelete() {
fail("Not yet implemented");
}
@Test
public void testUpdate() {
fail("Not yet implemented");
}
}
运行结果:
小结:
mybatis整合之后,mybatis把一些事交给spring来完成。
1.mybatis和spring整合之后mapper代理开发把原来在mybatis配置文件SqlMapConfig.xml中完成的连接数据源、事务控制都交给spring来完成。
2.同时spring还配置了SqlSessionFactory的bean、
3.原来在mybatis配置文件批量扫描的mapper包也交给spring来扫描