提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
前文介绍了在Mybatis中实现操作数据库以及事务的概念。本文将在Spring中整合Mybatis,使得代码更加简洁,并实现事务的功能。
一、整合Mybatis
目标:实在查找功能。
1. 创建一个测试使用的数据库
本文创建了一个User表,包含字段id,name,pwd
2. 导入包
在pox.xml文件中导入需要的包
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.2</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.9</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
</dependency>
</dependencies>
3.创建一个User实体类
@Data
public class User {
private int id;
private String name;
private String pwd;
public User() {
}
public User(int id, String name, String pwd) {
this.id = id;
this.name = name;
this.pwd = pwd;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", pwd='" + pwd + '\'' +
'}';
}
}
4.创建一个UserMapper接口和UserMapperx.xml
public interface UserMapper {
// 查
List<User> getUserList();
}
<?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接口 -->
<mapper namespace="com.ali.mapper.UserMapper">
<select id="getUserList" resultType="User">
select * from mybatis.user
</select>
</mapper>
5. 创建一个beans.xml配置文件
在该文件中,配置连接数据库的信息以及执行sql语句的对象。如:数据源信息,配置SqlSessionFactory,注册sqlSessionTemple。
<?xml version="1.0" encoding="UTF-8"?>
<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
https://www.springframework.org/schema/beans/spring-beans.xsd"
>
<!-- 1.配置数据源:driver、url、用户信息等-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8"></property>
<property name="username" value="root"></property>
<property name="password" value="132"></property>
</bean>
<!-- 2.配置SqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 关联数据源-->
<property name="dataSource" ref="dataSource"></property>
<!-- 关联mybatis configLocation:关联到mybatis-config.xml文件,可将一些设置放入该文件 mapperLocation:关联到mapper.XML文件,类似于mybatis配置文件中mappers -->
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
<property name="mapperLocations" value="classpath:com/ali/mapper/UserMapper.xml"></property>
</bean>
<!-- 3.注册sqlSessionTemple,等价于mybatis中得sqlSession,关联sqlSessionFactory-->
<bean id="sqlSessionTemple" class="org.mybatis.spring.SqlSessionTemplate">
<!-- 只能构造器注入-->
<constructor-arg index="0" ref="sqlSessionFactory"></constructor-arg>
</bean>
</beans>
6.创建UserMapper的实现类
目的:用于sqlSessionTemplate执行sql语句。
1)方法一:创建sqlSessionTemplate对象,并利用.getMapper获得接口,再调用接口的方法。
// 4. UserMapper的实现类:用sqlSessionTemplate执行sql语句
public class UserMapperImple implements UserMapper {
private SqlSessionTemplate sqlSessionTemplate;
public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
this.sqlSessionTemplate = sqlSessionTemplate;
}
public List<User> getUserList(){
UserMapper mapper = sqlSessionTemplate.getMapper(UserMapper.class);
return mapper.getUserList();
}
}
2)方法二:继承SqlSessionDaoSupport 类, 直接利用 getSqlSession() 获得 , 然后直接注入SqlSessionFactory,无需获得sqlSessionTemple。可直接省略步骤5中的第3小步。
public class UserMapperImple1 extends SqlSessionDaoSupport implements UserMapper {
public List<User> getUserList(){
UserMapper mapper = getSqlSession().getMapper(UserMapper.class);
return mapper.getUserList();
}
}
7. 注册bean
在beans.xml注册响应的bean
<bean id="UserMapperImple" class="com.ali.mapper.UserMapperImple">
<property name="SqlSessionTemplate" ref="sqlSessionTemple"></property>
</bean>
<bean id="UserMapperImple1" class="com.ali.mapper.UserMapperImple1">
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>
8. 测试
public class Test {
@org.junit.Test
public void test() {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
UserMapper mapper = (UserMapper) context.getBean("UserMapperImple1");
List<User> userList = mapper.getUserList();
for (User user : userList) {
System.out.println(user);
}
}
}
二、事务
为保证数据的正确存取,因此需要实现事务。
例如:在一个事务中要增加某条数据,又要删除另一条数据。要么两个操作都成功,要么两个操作都失败。不能仅有一个成功。
下面将实现一个事务中增加某条数据,又要删除另一条数据的功能。
该链接为事务的基本介绍
1.创建一个数据库
同一.1
2. 导入包
同一.2
3.创建一个User实体类
同一.3
4.创建一个UserMapper接口和UserMapperx.xml
public interface UserMapper {
//添加一个用户
int addUser(User user);
//根据id删除用户
int deleteUser(int id);
}
<?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接口 -->
<mapper namespace="com.ali.mapper.UserMapper">
<select id="getUserList" resultType="User">
select * from mybatis.user
</select>
<insert id="addUser" parameterType="com.ali.pojo.User">
insert into user (id,name,pwd) values (#{id},#{name},#{pwd})
</insert>
<delete id="deleteUser" parameterType="int">
delete from user where id = #{id}
</delete>
</mapper>
5.创建beans.xml配置文件
<!-- 1.导入事务、aop需要的依赖 -->
<?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:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd"
>
<!-- 2.配置数据源:driver、url、用户信息等-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8"></property>
<property name="username" value="root"></property>
<property name="password" value="132"></property>
</bean>
<!-- 3.配置SqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 关联数据源-->
<property name="dataSource" ref="dataSource"></property>
<!-- 关联mybatis configLocation:关联到mybatis-config.xml文件 mapperLocation:关联到mapper.XML文件,类似于mybatis配置文件中mappers -->
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
<property name="mapperLocations" value="classpath:com/ali/mapper/UserMapper.xml"></property>
</bean>
</beans>
6. 创建UserMapper接口的实现类
// 4。创建执行sql的对象及执行
public class UserMapperImple1 extends SqlSessionDaoSupport implements UserMapper {
private User user;
private int id = 4;
public List<User> getUserList(){
user = new User(id,"小明","123456");
UserMapper mapper = getSqlSession().getMapper(UserMapper.class);
mapper.addUser(user);
mapper.deleteUser(id);
return mapper.getUserList();
}
@Override
public int addUser(User user) {
UserMapper mapper = getSqlSession().getMapper(UserMapper.class);
return mapper.addUser(user);
}
@Override
public int deleteUser(int id) {
UserMapper mapper = getSqlSession().getMapper(UserMapper.class);
return mapper.deleteUser(id);
}
}
7. 注册bean并使用aop实现事务
在beans.xml中操作
<!-- 5. 注册事务的bean -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 6. 配置事务通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!--配置哪些方法使用什么样的事务,配置事务的传播特性。REQUIRED:如果当前没有事务,就新建一个事务,如果已存在一个事务中,加入到这个事务中,这是最常见的选择。-->
<tx:method name="add" propagation="REQUIRED"/>
<tx:method name="delete" propagation="REQUIRED"/>
<tx:method name="update" propagation="REQUIRED"/>
<tx:method name="search*" propagation="REQUIRED"/>
<tx:method name="get" read-only="true"/>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<!-- 7. 配置aop织入事务 -->
<aop:config>
<aop:pointcut id="txPointcut" expression="execution(* com.ali.mapper.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
</aop:config>
8. 测试
public class Test {
@org.junit.Test
public void test() {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
UserMapper mapper = (UserMapper) context.getBean("UserMapperImple1");
List<User> userList = mapper.getUserList();
for (User user : userList) {
System.out.println(user);
}
}
}