09. Spring集成Mybatis框架
1、创建Maven项目
2、导入一下必要的jar包
在pom.xml文件中
<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
https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.company</groupId>
<artifactId>SpringDemo05</artifactId>
<version>1.0.0</version>
<packaging>war</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<!-- spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<!-- 阿里数据源 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<!-- mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
</dependency>
<!-- Spring 切面实现AOP -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<!-- spring整合mybatis的插件包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.2</version>
</dependency>
<!-- log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
</project>
3、搭建Spring
3.1 数据库连接配置文件
(1)jdbc.properties
url=jdbc:mysql://127.0.0.1:3306/shop?characterEncoding=utf-8&serverTimezone=GMT
driver=com.mysql.cj.jdbc.Driver
jdbc_username=root
jdbc_password=123456
initialSize=10
minIdle=5
maxActive=20
(2)db.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"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
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">
<!-- 加载属性文件 -->
<context:property-placeholder location="jdbc.properties"/>
<!-- spring管理阿里数据源对象的创建,由此数据源对象管理创建数据库连接对象(Connection) -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${driver}"></property>
<property name="url" value="${url}"></property>
<property name="username" value="${jdbc_username}"></property>
<property name="password" value="${jdbc_password}"></property>
<property name="initialSize" value="${initialSize}"></property>
<property name="minIdle" value="${minIdle}"></property>
<property name="maxActive" value="${maxActive}"></property>
</bean>
<!-- 配置事务管理器类 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 开启事务注解功能 -->
<tx:annotation-driven transaction-manager="transactionManager" />
</beans>
(3)application.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"
xmlns:aop="http://www.springframework.org/schema/aop"
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">
<!-- 导入数据库连接配置 -->
<import resource="db.xml"/>
<!-- 开启自动扫描注解 -->
<context:component-scan base-package="com.company.springPro"></context:component-scan>
</beans>
4、Dao、Po、mapper以及service类的编写
(1)UserPo.java
package com.company.project.Po;
import java.sql.Date;
@Component
public class UserPo {
private int id;
private String userName;
private String password;
private Date regTime;
public UserPo() {
// TODO Auto-generated constructor stub
}
public UserPo(String userName, String password, Date regTime) {
super();
this.userName = userName;
this.password = password;
this.regTime = regTime;
}
public int getId() {
return id;
}
public String getUserName() {
return userName;
}
public String getPassword() {
return password;
}
public void setId(int id) {
this.id = id;
}
public void setUserName(String userName) {
this.userName = userName;
}
public void setPassword(String password) {
this.password = password;
}
public Date getRegTime() {
return regTime;
}
public void setRegTime(Date regTime) {
this.regTime = regTime;
}
@Override
public String toString() {
return "UserPo [id=" + id + ", userName=" + userName + ", password=" + password + ", regTime=" + regTime + "]";
}
}
(2)UserDao.java
package com.company.springPro.dao;
import java.util.List;
import org.springframework.stereotype.Repository;
import com.company.springPro.Po.UserPo;
@Repository
public interface UserDao {
void insert(UserPo userPo);
void update(UserPo userPo);
void delete(int id);
UserPo findById(int id);
List<UserPo> findAll();
}
(3)UserService.java
package com.company.springPro.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.company.springPro.Po.UserPo;
import com.company.springPro.dao.UserDao;
@Service
public class UserService {
@Autowired
private UserDao userDao;
public UserService() {
}
public void insert(UserPo userPo) {
userDao.insert(userPo);
}
public void update(UserPo userPo) {
userDao.update(userPo);
}
public void delete(int userId) {
userDao.delete(userId);
}
public UserPo findById(int id) {
return userDao.findById(id);
}
public List<UserPo> findAll(){
return userDao.findAll();
}
}
(4)UserMapper.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">
<!--
namespace 指向对应接口的类路径
-->
<mapper namespace="com.company.springPro.dao.UserDao">
<!-- 把重复的sql代码可以提炼出来,通过定义别名把sql列名和java属性对应 -->
<sql id="selectResult">
id,user_name userName,password,reg_time regTime
</sql>
<!-- 高级 -->
<resultMap type="UserPo" id="userResult">
<id property="id" column="id"/>
<result property="userName" column="user_name"/>
<result property="password" column="password"/>
<result property="regTime" column="reg_time"/>
</resultMap>
<!--
id="saveUser":唯一标记
parameterType="UserPo":参数类型
useGeneratedKeys="true":针对于主键自增
-->
<insert id="insert" parameterType="UserPo" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
insert into t_user(id,user_name,password,reg_time)
values
(#{id},#{userName},#{password},#{regTime})
</insert>
<update id="update" parameterType="UserPo" >
update t_user
set user_name=#{userName},password=#{password},reg_time=#{regTime}
where id = #{id}
</update>
<delete id="delete" parameterType="int">
delete from t_user
where id = #{id}
</delete>
<select id="findById" parameterType="int" resultMap="userResult">
select id,user_name,password,reg_time from t_user where id = #{id}
</select>
<!-- mybatis会自动把得到的数据进行封装,把每条数据封装成对象 ,最后封装成集合-->
<select id="findAll" resultType="UserPo">
select id,user_name,password,reg_time from t_user;
</select>
</mapper>
5、搭建MyBatis
(1)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>
<!-- 设置类型自动转换 -->
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<typeAliases>
<!-- 利用package标签可以直接把整个包的 Po类都导入,这块是导入与数据库表对应的java类-->
<package name="com.company.springPro.Po"/>
</typeAliases>
<!-- 将我们写好的sql映射文件一定要注册到全局配置文件中 -->
<mappers>
<!-- 利用package标签可以直接把整个包的 xml配置文件都导入,这块是导入数据库表与java Po类对应的配置文件 -->
<package name="com.company.springPro.mapper" />
</mappers>
</configuration>
(2)配置sqlSessionFactory
在db.xml文件中添加
<!-- 配置sqlSessionFactory spring管理生成SqlSessionFactory对象-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--注入数据库连接管理对象 -->
<property name="dataSource" ref="dataSource"></property>
<!-- 加载mybatis全局配置文件 -->
<property name="configLocation" value="mybatis-config.xml"></property>
<!-- 加载sql映射文件 -->
<property name="mapperLocations" value="com/company/springPro/mapper/*Mapper.xml"></property>
</bean>
<!-- 指定生成接口代理 -->
<bean id="mapperFactory" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.company.springPro.dao"></property>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
6、测试
package com.company.springPro.test;
import java.sql.Date;
import java.util.List;
import org.apache.log4j.Logger;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.company.springPro.Po.UserPo;
import com.company.springPro.service.UserService;
import junit.framework.TestCase;
public class UserTest extends TestCase{
Logger logger = Logger.getLogger(UserTest.class);
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
UserService userService = (UserService) context.getBean("userService");
public void testInsert() {
//测试期间启动加载spring的写法 加载spring配置文件,创建一个ApplicationContext
UserPo userPo = new UserPo("王五","123456",new Date(System.currentTimeMillis()));
userService.insert(userPo);
}
public void testUpdate() {
UserPo userPo = new UserPo("张三","123",new Date(System.currentTimeMillis()));
userPo.setId(7);
userService.update(userPo);
}
public void testDelete() {
userService.delete(7);
}
public void testFindById() {
UserPo userPo = userService.findById(1);
logger.debug(userPo.toString());
}
public void testFindAll() {
List<UserPo> userList = userService.findAll();
for(int i = 0;i<userList.size();i++) {
logger.debug(userList.get(i).toString());
}
}
}