1. MyBatis-Spring
将mybatis的内容和Spring进行整合处理。
具体步骤:
1.导入依赖
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<!--aspectJ AOP 织入器-->
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.5</version>
</dependency>
<!--mybatis-spring整合包 【重点】-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
<scope>provided</scope>
</dependency>
</dependencies>
2.引入Spring配置文件SpringConfig.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: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/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd">
3.配置数据源替换mybaits的数据源
<!--1.配置数据源替换mybaits的数据源-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
4.配置SqlSessionFactory,关联MyBatis
<!--2.配置SqlSessionFactory,关联MyBatis-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!--关联Mybatis-->
<property name="configLocation" value="classpath:MyBatisConfig.xml"/>
<property name="mapperLocations" value="classpath:com/chen/Mapper/*.xml"/>
</bean>
5.注册sqlSessionTemplate,关联sqlSessionFactory;
<!--3.注册sqlSessionTemplate , 关联sqlSessionFactory-->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>
6.编写实体类、UserMapper 接口、UserMapper.xml文件
package com.chen.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
//实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private int id;
private String name;
private String password;
}
package com.chen.Mapper;
import com.chen.pojo.User;
import java.util.List;
//UserMapper 接口
public interface UserMapper {
List<User> getUser();
int addUser(User user);
int deleteUser(int id);
}
<!-- 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">
<mapper namespace="com.chen.Mapper.UserMapper">
<select id="getUser" resultType="user">
select * from mybatis.user
</select>
<insert id="addUser" parameterType="user">
insert into mybatis.user (id,name,password) values (#{id},#{name},#{password});
</insert>
<delete id="deleteUser" >
delete from mybatis.user where id=#{id}
</delete>
</mapper>
方式一:
7.增加Mapper接口的实现类UserMapperIMp ;私有化sqlSessionTemplate
package com.chen.Mapper;
import com.chen.pojo.User;
import org.mybatis.spring.SqlSessionTemplate;
import java.util.List;
public class UserMapperIMp implements UserMapper{
//sqlSession不用我们自己创建了,Spring来管理
private SqlSessionTemplate sqlSession;
public void setSqlSession(SqlSessionTemplate sqlSession) {
this.sqlSession = sqlSession;
}
public List<User> getUser() {
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userlist = mapper.getUser();
return userlist;
}
public int addUser(User user) {
return 0;
}
public int deleteUser(int id) {
return 0;
}
}
8.在spring中注册UserMapperIMp 类
<bean id="userMapperIMp" class="com.chen.Mapper.UserMapperIMp">
<!--注入值-->
<property name="sqlSession" ref="sqlSession"/>
</bean>
9.测试
import java.util.List;
public class MyTest {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationConfig.xml");
UserMapper userMapperIMp = context.getBean("userMapperIMp", UserMapper.class);
List<User> userList = userMapperIMp.getUser();
for (User user : userList) {
System.out.println(user);
}
}
}
方式二
使用SqlSessionDaoSupport
SqlSessionDaoSupport 是一个抽象的支持类,用来为你提供 SqlSession。调用 getSqlSession() 方法你会得到一个 SqlSessionTemplate,之后可以用于执行 SQL 方法
1–6与上面一致
7.将上面的UserMapperIMp 修改一下
package com.chen.Mapper;
import com.chen.pojo.User;
import org.apache.ibatis.session.SqlSession;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import java.util.List;
public class UserMapperIMp2 extends SqlSessionDaoSupport implements UserMapper{
public List<User> getUser() {
return getSqlSession().getMapper(UserMapper.class).getUser();
}
public int addUser(User user) {
return getSqlSession().getMapper(UserMapper.class).addUser(user);
}
public int deleteUser(int id) {
return getSqlSession().getMapper(UserMapper.class).deleteUser(id);
}
}
8.在spring中配置
<bean id="userMapperIMp2" class="com.chen.Mapper.UserMapperIMp2">
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
9.测试
import com.chen.Mapper.UserMapper;
import com.chen.pojo.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.List;
public class MyTest {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationConfig.xml");
UserMapper userMapperIMp = context.getBean("userMapperIMp2", UserMapper.class);
List<User> userList = userMapperIMp.getUser();
for (User user : userList) {
System.out.println(user);
}
}
}
总结:
整合到spring以后可以完全不要mybatis的配置文件,除了这些方式可以实现整合之外
,我们还可以使用注解来实现,这个等我们后面学习SpringBoot的时候还会测试整合
2.Spring管理事务
- Spring在不同的事务管理API之上定义了一个抽象层,使得开发人员不必了解底层的事务管理API就可以使用Spring的事务管理机制。Spring支持编程式事务管理和声明式的事务管理。
编程式事务管理
将事务管理代码嵌到业务方法中来控制事务的提交和回滚
缺点:必须在每个事务操作业务逻辑中包含额外的事务管理代码
声明式事务管理
一般情况下比编程式事务好用。
将事务管理代码从业务方法中分离出来,以声明的方式来实现事务管理。
将事务管理作为横切关注点,通过aop方法模块化。Spring中通过Spring AOP框架支持声明式事务管理。
具体步骤:
1.使用Spring管理事务,注意头文件的约束导入 : tx
xmlns:tx="http://www.springframework.org/schema/tx"
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
2.事务管理器
无论使用Spring的哪种事务管理策略(编程式或者声明式)事务管理器都是必须的。
就是 Spring的核心事务管理抽象,管理封装了一组独立于技术的方法。
3.JDBC事务
<!--声明式事务:事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
4.配置好事务管理器后我们需要去配置事务的通知
<!--配置事务-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*"/>
<tx:method name="delete*"/>
<tx:method name="update*"/>
<tx:method name="query" read-only="true"/>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
5.配置AOP
<!--配置aop织入事务-->
<aop:config>
<aop:pointcut id="txPoint" expression="execution(* com.chen.Mapper.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPoint"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPoint"/>
</aop:config>
6.测试
package com.chen.Mapper;
import com.chen.pojo.User;
import org.apache.ibatis.session.SqlSession;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import java.util.List;
public class UserMapperIMp2 extends SqlSessionDaoSupport implements UserMapper{
public List<User> getUser() {
User user = new User(4, "sada0","554564");
addUser(user);
deleteUser(3);
return getSqlSession().getMapper(UserMapper.class).getUser();
}
public int addUser(User user) {
return getSqlSession().getMapper(UserMapper.class).addUser(user);
}
public int deleteUser(int id) {
return getSqlSession().getMapper(UserMapper.class).deleteUser(id);
}
}
import com.chen.Mapper.UserMapper;
import com.chen.pojo.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.List;
public class MyTest {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationConfig.xml");
UserMapper userMapperIMp = context.getBean("userMapperIMp2", UserMapper.class);
List<User> userList = userMapperIMp.getUser();
for (User user : userList) {
System.out.println(user);
}
}
}
为什么需要配置事务?
如果不配置,就需要我们手动提交控制事务;
事务在项目开发过程非常重要,涉及到数据的一致性的问题,不容马虎!