1.什么是Spring整合MyBatis?
Spring整合MyBatis是指将Spring框架和MyBatis持久化框架结合起来使用,实现数据访问层和业务逻辑层的整合。Spring是一个轻量级的Java开发框架,提供了面向切面编程(AOP)、依赖注入(DI)等功能,可以简化企业级应用程序的开发。而MyBatis是一种持久化框架,通过将数据库操作与Java对象的映射进行配置,实现了数据库操作的简化。
Spring整合MyBatis的好处包括:
-
提供了事务管理机制:Spring的事务管理功能可以统一管理数据库操作的事务,确保数据的一致性和完整性。
-
简化了数据访问层的开发:MyBatis提供了灵活的SQL映射配置,通过将SQL语句与Java方法进行映射,可以方便地进行数据库操作。结合Spring的依赖注入和AOP特性,可以进一步简化数据访问层的代码编写。
-
提高了代码的可测试性和可维护性:通过将数据库操作与业务逻辑层解耦,可以更容易地进行单元测试和模块化开发,提高代码的可测试性和可维护性。
Spring整合MyBatis主要需要配置Spring的ApplicationContext、数据源、事务管理器以及MyBatis的SqlSessionFactory等组件,以及定义Mapper接口和对应的映射文件。通过配置这些组件,可以在Spring中使用MyBatis进行数据库操作,并结合Spring的功能进行更加灵活和方便的开发。
2.Spring整合MyBatis的步骤有哪些?
Spring整合MyBatis的步骤如下:
先和我建立这些包和类:
-
引入依赖:在项目的构建文件(例如Maven或Gradle)中添加Spring和MyBatis的相关依赖。
<dependencies> <!--spring用到的依赖--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.2.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>5.2.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>5.2.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>5.2.7.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>5.3.10</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.3.10</version> </dependency> <!--mybatis用到的依赖--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.7</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjtools</artifactId> <version>1.9.5</version> </dependency> <dependency> <groupId>aopalliance</groupId> <artifactId>aopalliance</artifactId> <version>1.0</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.0</version> </dependency> <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>3.3.0</version> </dependency> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.0</version> </dependency> <!--junit,mysql,log4j的依赖--> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.19</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency> <!--util--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.28</version> </dependency> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.4</version> </dependency> </dependencies>
-
配置数据源:在Spring的配置文件(例如applicationContext.xml)中配置数据库的连接信息和数据源,可以使用Spring提供的内置数据源,也可以使用其他第三方数据源。
<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:p="http://www.springframework.org/schema/p" 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"> <!--1.配置数据源--> <context:property-placeholder location="database.properties"></context:property-placeholder> <!--2.配置环境 配置数据源--> <bean id="datasource" class="org.apache.commons.dbcp.BasicDataSource"> <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> </bean> <!--配置sqlSessionFactory--> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="datasource"></property> <property name="configLocation" value="classpath:mybatis-config.xml"></property> </bean> <!--配置扫描包--> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="mapper"></property> </bean> <context:component-scan base-package="service"/> </beans>
database.properties的配置
driver=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/数据库名字?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8 jdbc.username=root jdbc.password=root
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="autoMappingBehavior" value="FULL"/> <setting name="cacheEnabled" value="true" /> </settings> <typeAliases> <package name="domain"/> </typeAliases> <!--3.配置需要引用的SQL映射文件的位置(SysUserMapper.xml将在后续步骤中创建)--> <mappers> <mapper resource="mapper/UserMapper.xml"></mapper> </mappers> </configuration>
-
配置SqlSessionFactory:在Spring的配置文件中配置MyBatis的SqlSessionFactory,包括指定数据源、配置MyBatis的属性和设置映射文件等。
-
配置Mapper扫描器:通过配置MapperScannerConfigurer,扫描并注册Mapper接口,使其能够被Spring自动管理和注入。
-
编写Mapper接口和映射文件:在Mapper接口中定义数据库操作的方法,并在对应的映射文件(例如XML文件)中编写SQL语句和结果映射规则。
-
配置事务管理器:如果需要进行事务管理,可以配置Spring的事务管理器,以确保数据库操作的一致性和完整性。
-
使用MyBatis进行数据库操作:在业务逻辑层(Service层)中注入Mapper接口的实例,并调用其方法进行数据库操作。
以上是Spring整合MyBatis的一般步骤,具体的配置和使用方式可能会因项目和需求而有所不同。但总体来说,通过配置数据源、SqlSessionFactory和Mapper扫描器,以及编写Mapper接口和映射文件,就可以在Spring中使用MyBatis进行数据库操作了。
3.获取映射接口实例,实现数据操作有哪几种方式?
获取映射接口实例,实现数据操作有以下几种方式:
-
XML配置方式:在Mapper映射文件中编写SQL语句和结果映射规则,在Java代码中使用MyBatis提供的SqlSession对象执行数据库操作,并通过指定Mapper接口的命名空间和方法名进行调用。
-
注解方式:在Mapper接口的方法上使用注解(例如@Select、@Insert、@Update等)来定义SQL语句和参数映射,然后通过SqlSession对象的getMapper()方法获取Mapper接口实例,并直接调用方法进行数据库操作。
-
动态代理方式:通过MyBatis的Mapper动态代理机制,将Mapper接口的方法与对应的SQL语句绑定起来,无需编写XML映射文件或注解。通过SqlSession对象的getMapper()方法获取Mapper接口的代理实例,然后直接调用方法进行数据库操作。
这些方式各有特点,XML配置方式相对灵活,适用于复杂的SQL语句和结果映射;注解方式简单快捷,适用于简单的数据库操作;动态代理方式结合了XML配置和注解的优点,可以灵活控制SQL语句的生成和执行过程。
在实际项目中,可以根据具体需求选择适合的方式进行数据操作。通常推荐使用注解方式或动态代理方式,因为它们更加简洁、易于维护,并且减少了XML映射文件的编写和配置工作。
4.基本整合方式
5.代码
增删改查
mapper接口
@Repository
public interface UserMapper {
public List<User> getAllUser();
public int insertUser(@Param("user") List<User> user);
public int updateUser(User user);
public int deleteUser(String id);
}
user实体类
@Data
public class User {
private Integer id;
private String name;
private Integer gradeid;
public User(String name, Integer gradeid,Integer id) {
this.name = name;
this.gradeid = gradeid;
this.id=id;
}
public User() {
}
}
service接口
public interface UserService {
public List<User> getAllUser();
public int insertUser(@Param("user")List<User> user);
public int updateUser(User user);
public int deleteUser(String id);
}
serviceImpl
@Service("userService")
public class UserServiceImpl implements UserService {
@Resource
private UserMapper userMapper;
@Override
public List<User> getAllUser() {
return userMapper.getAllUser();
}
@Override
public int insertUser(List<User> user) {
return userMapper.insertUser(user);
}
@Override
public int updateUser(User user) {
return userMapper.updateUser(user);
}
@Override
public int deleteUser(String id) {
return userMapper.deleteUser(id);
}
}
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">
<!--将下列SQL语句绑定到cn.cvs.dao.sysUser.SysUserMapper接口-->
<mapper namespace="mapper.UserMapper">
<select id="getAllUser" resultType="domain.User">
select * from User
</select>
<insert id="insertUser" parameterType="java.util.List">
INSERT INTO user (id,name, gradeid) values
<foreach collection="user" item="value" separator=",">
(#{value.id},#{value.name},#{value.gradeid})
</foreach>
</insert>
<update id="updateUser" parameterType="domain.User">
update user
<trim prefix="set" suffixOverrides="," suffix="where id=#{id}">
<if test="name!=null">
name=#{name},
</if>
<if test="gradeid!=null">
gradeid=#{gradeid}
</if>
</trim>
</update>
<delete id="deleteUser" parameterType="java.lang.String">
delete from user
<trim prefix="where" prefixOverrides="and|or">
<if test="id!=null">
id=#{id}
</if>
</trim>
</delete>
</mapper>
text类
import domain.User;
import lombok.val;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import service.UserService;
import service.UserServiceImpl;
import java.util.ArrayList;
import java.util.List;
public class test {
@Test
public void test(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService)applicationContext.getBean("userService");
userService.getAllUser().stream().forEach(item->{
System.out.println(item);
});
}
@Test
public void insertUser(){
List<User> list=new ArrayList<>();
User user=new User();
user.setId(3);
user.setName("黄晓宇");
user.setGradeid(2);
list.add(user);
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
final UserService userService=(UserService) context.getBean("userService");
System.out.println(userService.insertUser(list));
}
@Test
public void updateUser(){
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
final UserService userService=(UserService) context.getBean("userService");
System.out.println(userService.updateUser(new User("黄晓宇",1,3)));
}
@Test
public void deleteUser(){
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
final UserService userService=(UserService) context.getBean("userService");
System.out.println(userService.deleteUser("3"));
}
}
6.配置声明式事务
(1)硬编码方式
(2)Spring基于AOP实现声明式事务处理机制
(3)配置步骤
事务属性说明
![](https://i-blog.csdnimg.cn/blog_migrate/2c45226050d4c95aaa27f6942bf60e9c.png)
使用注解实现声明式事务
7.总结