本文是按照狂神说的教学视频学习的笔记,强力推荐,教学深入浅出一遍就懂!b站搜索狂神说或点击下面链接

https://space.bilibili.com/95256449?spm_id_from=333.788.b_765f7570696e666f.2

整合Mybatis

步骤

  1. 导入jar包

    • junit

    • Mybatis

    • MySQL

    • Spring

    • AOP

    • Mybatis-Spring

  2. 编写配置文件

  3. 测试

MyBatis-Spring

  • MyBatis-Spring 会帮助你将 MyBatis 代码无缝地整合到 Spring 中。

  • 它将允许 MyBatis 参与到 Spring 的事务管理之中,创建映射器 mapper 和 SqlSession 并注入到 bean 中,以及将 Mybatis 的异常转换为 Spring 的 DataAccessException

  • 最终,可以做到应用代码不依赖于 MyBatis,Spring 或 MyBatis-Spring。

方式一:

  1. 编写数据源配置

    • 其实就相当于原来的Mybatis主配置文件加上SqlSessionFactory的功能。

    • 可以导入Mybatis配置文件,启用Mybatis配置的内容,但是数据库链接和SqlSessionFactory必须在这里配置。

    • Mybatis配置的这里也都可以配置,比如别名、设置、Mapper等。

<?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
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/context
https://www.springframework.org/schema/context/spring-context.xsd">

<!--DataSource:使用Spring的数据源替代Mybatis-->
<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:3308/mybatis?useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=true&amp;serverTimezone=GMT%2B8"/>
<property name="username" value="root"/>
<property name="password" value="mysql"/>
</bean>
<!--sqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!--绑定Mybatis配置文件-->
<property name="configLocation" value="classpath:Mybatis-config.xml"/>
<!--Mybatis配置文件中的内容都可以在这里配置-->
<property name="mapperLocations" value="classpath:com/rzp/mapper/*.xml"/>
</bean>

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<!--因为SqlSessionTemplate没有set方法,因此只能用构造器注入-->
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>

</beans>
  • 注:在spring中注册的org.mybatis.spring.SqlSessionTemplate其实就是Mybatis和Spring整合以后的SqlSession,而且是线程安全的。

  • Mybatis.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>

<typeAliases>
<package name="com.rzp.pojo"/>
</typeAliases>


</configuration>
  1. Mapper接口和实现类、Mapper.xml

  • Mapper接口

package com.rzp.mapper;

import com.rzp.pojo.User;

import java.util.List;

public interface UserMapper {
public List<User> selectUser();
}
  • Mapper实现类

package com.rzp.mapper;

import com.rzp.pojo.User;
import org.mybatis.spring.SqlSessionTemplate;

import java.util.List;

public class UserMapperImpl implements UserMapper {
//我们所有的操作,原来使用SqlSession执行,现在改成使用SqlSessionTemplate
private SqlSessionTemplate sqlSessionT;
public void setSqlSessionT(SqlSessionTemplate sqlSession){
this.sqlSessionT = sqlSession;
}
@Override
public List<User> selectUser() {
UserMapper mapper = sqlSessionT.getMapper(UserMapper.class);
return mapper.selectUser();
}
}
  1. 将实现类注入到Spring

    • 其实也可以放在spring-dao里面,但是现在spring-dao里只有Mybatis相关的,更规范,而且就是一个模板了。

<?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
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/context
https://www.springframework.org/schema/context/spring-context.xsd">

<import resource="spring-dao.xml"/>
<!---->
<bean id="userMapper" class="com.rzp.mapper.UserMapperImpl">
<property name="sqlSessionT" ref="sqlSession"/>
</bean>
</beans>
  • 测试

public class MyTest {
@Test
public void test() throws IOException {
ApplicationContext context = new ClassPathXmlApplicationContext("spring-dao.xml");
UserMapper mapper = context.getBean(UserMapper.class);
List<User> users = mapper.selectUser();
for (User user : users) {
System.out.println(user);
}
}
}

方式二:在实现类中直接创建SqlSession

  • 方式二是一个简化的操作,实现类可以继承SqlSessionDaoSupport,通过父类方法getSqlSession直接生成sqlSession,那么以下两个部分可以省略:

  • xml文件中这部分

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<!--因为SqlSessionTemplate没有set方法,因此只能用构造器注入-->
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>
  • 实现类的这部分

    private SqlSessionTemplate sqlSessionT;
public void setSqlSessionT(SqlSessionTemplate sqlSession){
this.sqlSessionT = sqlSession;
}

示例

  • 实现类

package com.rzp.mapper;

import com.rzp.pojo.User;
import org.mybatis.spring.support.SqlSessionDaoSupport;

import java.util.List;

public class UserMapper2 extends SqlSessionDaoSupport implements UserMapper {
@Override
public List<User> selectUser() {
return getSqlSession().getMapper(UserMapper.class).selectUser();
}
}
  • spring注册

    <bean id="userMapper2" class="com.rzp.mapper.UserMapper2">
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>

Spring中事务管理

  • 在xml文件中导入tx,然后加入以下内容即可

<?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
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/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
https://www.springframework.org/schema/tx/spring-tx.xsd">


<!--结合AOP实现事务的植入-->
<!--配置事务通知-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<!--给哪些方法配置事务-->
<!--propagation事务的传播特性,默认Required-->
<tx:attributes>
<!--insert开头的开启事务 ,不过我测试method这几行不写事务也启动了。。-->
<tx:method name="insert*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<!--所有方法都开启事务-->
<tx:method name="*" propagation="REQUIRED"/>
<tx:method name="query" read-only="true"/>
</tx:attributes>
</tx:advice>

<aop:config>
<!--通过aop代理启动事务,注明哪个包需要添加事务-->
<aop:pointcut id="txPoint" expression="execution(* com.rzp.mapper.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPoint"/>
</aop:config>
</beans>

示例

  • 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
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/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
https://www.springframework.org/schema/tx/spring-tx.xsd">

<!--DataSource:使用Spring的数据源替代Mybatis-->
<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:3308/mybatis?useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=true&amp;serverTimezone=GMT%2B8"/>
<property name="username" value="root"/>
<property name="password" value="mysql"/>
</bean>
<!--sqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!--绑定Mybatis配置文件-->
<property name="configLocation" value="classpath:Mybatis-config.xml"/>
<!--Mybatis配置文件中的内容都可以在这里配置-->
<property name="mapperLocations" value="classpath:com/rzp/mapper/*.xml"/>
</bean>

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<!--因为SqlSessionTemplate没有set方法,因此只能用构造器注入-->
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>

<!--配置声明式事务-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<constructor-arg ref="dataSource" />
</bean>

<!--结合AOP实现事务的植入-->
<!--配置事务通知-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<!--给哪些方法配置事务-->
<!--propagation事务的传播特性,默认Required-->
<tx:attributes>
<!--insert开头的开启事务 ,不过我测试method这几行不写事务也启动了。。-->
<tx:method name="insert*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<!--所有方法都开启事务-->
<tx:method name="*" propagation="REQUIRED"/>
<tx:method name="query" read-only="true"/>
</tx:attributes>
</tx:advice>

<aop:config>
<aop:pointcut id="txPoint" expression="execution(* com.rzp.mapper.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPoint"/>
</aop:config>
</beans>
  • 接口实现

package com.rzp.mapper;

import com.rzp.pojo.User;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.support.SqlSessionDaoSupport;

import java.util.List;

public class UserMapperImpl extends SqlSessionDaoSupport implements UserMapper {

@Override
public List<User> selectUser() {
User user = new User(4, "rzp222", "123123");
UserMapper mapper = getSqlSession().getMapper(UserMapper.class);
mapper.insertUser(user);
//执行删除,因为删除语句是错的,就可以根据上面的insert是否执行成功来查看事务是否有开启
mapper.deleteUser(6);

return mapper.selectUser();
}

@Override
public void insertUser(User user) {
getSqlSession().getMapper(UserMapper.class).insertUser(user);
}

@Override
public void deleteUser(int id) {
getSqlSession().getMapper(UserMapper.class).deleteUser(id);
}
}
  • Mapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.rzp.mapper.UserMapper">
<select id="selectUser" resultType="user">
select * from user
</select>

<insert id="insertUser" parameterType="user">
insert into user (id,name,pwd) values (#{id},#{name},#{pwd})
</insert> <!--故意写错delete语句,以测试事务-->
<delete id="deleteUser" parameterType="_int">
deletes from user where id = #{id}
</delete>
</mapper>
  • 其他不变,测试:

import com.rzp.mapper.UserMapper;
import com.rzp.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("applicationContext.xml");
UserMapper userMapper = context.getBean("userMapper", UserMapper.class);
List<User> users = userMapper.selectUser();
for (User user : users) {
System.out.println(user);
}
}
}
  • 执行selectUser的时候,会先执行insert,再删除另一个记录。

  • 因为删除的语句是错的,只要看insert的记录是否存在就可以知道事务是否开启了

Spring (六):整合Mybatis的更多相关文章

  1. Spring Boot整合Mybatis并完成CRUD操作

    MyBatis 是一款优秀的持久层框架,被各大互联网公司使用,本文使用Spring Boot整合Mybatis,并完成CRUD操作. 为什么要使用Mybatis?我们需要掌握Mybatis吗? 说的官 ...

  2. spring boot 整合 mybatis 以及原理

    同上一篇文章一样,spring boot 整合 mybatis过程中没有看见SqlSessionFactory,sqlsession(sqlsessionTemplate),就连在spring框架整合 ...

  3. spring 框架整合mybatis的源码分析

    问题:spring 在整合mybatis的时候,我们是看不见sqlSessionFactory,和sqlsession(sqlsessionTemplate 就是sqlsession的具体实现)的,这 ...

  4. Spring Boot 整合mybatis时遇到的mapper接口不能注入的问题

    现实情况是这样的,因为在练习spring boot整合mybatis,所以自己新建了个项目做测试,可是在idea里面mapper接口注入报错,后来百度查询了下,把idea的注入等级设置为了warnin ...

  5. Spring Boot整合Mybatis报错InstantiationException: tk.mybatis.mapper.provider.base.BaseSelectProvider

    Spring Boot整合Mybatis时一直报错 后来发现原来主配置类上的MapperScan导错了包 由于我使用了通用Mapper,所以应该导入通用mapper这个包

  6. Spring Boot整合MyBatis(非注解版)

    Spring Boot整合MyBatis(非注解版),开发时采用的时IDEA,JDK1.8 直接上图: 文件夹不存在,创建一个新的路径文件夹 创建完成目录结构如下: 本人第一步习惯先把需要的包结构创建 ...

  7. Spring Boot整合Mybatis完成级联一对多CRUD操作

    在关系型数据库中,随处可见表之间的连接,对级联的表进行增删改查也是程序员必备的基础技能.关于Spring Boot整合Mybatis在之前已经详细写过,不熟悉的可以回顾Spring Boot整合Myb ...

  8. Spring Boot系列(三):Spring Boot整合Mybatis源码解析

    一.Mybatis回顾 1.MyBatis介绍 Mybatis是一个半ORM框架,它使用简单的 XML 或注解用于配置和原始映射,将接口和Java的POJOs(普通的Java 对象)映射成数据库中的记 ...

  9. 太妙了!Spring boot 整合 Mybatis Druid,还能配置监控?

    Spring boot 整合 Mybatis Druid并配置监控 添加依赖 <!--druid--> <dependency> <groupId>com.alib ...

  10. Spring Boot 整合MyBatis(1)

    这篇文章介绍如何在Spring boot中整合Mybatis,其中sql语句采用注解的方式插入.后续文章将会介绍,如何使用xml方式. SSM SSH框架已经满足轻量级这个需求了,但是对于开发人员而言 ...

随机推荐

  1. Vue2.0 【第四季】第1节 实例入门-实例属性

    目录 Vue2.0 [第四季]第1节 实例入门-实例属性 第1节 实例入门-实例属性 一.Vue和Jquery.js一起使用 二.实例调用自定义方法 Vue2.0 [第四季]第1节 实例入门-实例属性 ...

  2. yarn报错error An unexpected error occurred:****ETIMEDOUT

    起因 在一个美好的下午,我敲击键盘输入quasar create Tangerine_Reception 我自豪的使用yarn作为包管理器,本以为万事无忧,不用担心出现npm的种种异常了...... ...

  3. javaScript 基础知识汇总 (十)

    1.New Function 语法:let func = new Function ([arg1[, arg2[, ...argN]],] functionBody) //无参数示例: let say ...

  4. vue相关的前端UI库

    1,element-ui 这个笔者用的最多,但是官网不知道咋回事.打不开,难道被黑了?! 地址(http://element-ui.cn/#/zh-CN/component/installation) ...

  5. Python3学习之路~9.3 GIL、线程锁之Lock\Rlock\信号量、Event

    一 Python GIL(Global Interpreter Lock) 全局解释器锁 如果一个主机是单核,此时同时启动10个线程,由于CPU执行了上下文的切换,让我们宏观上看上去它们是并行的,但实 ...

  6. MySQL:GROUP_CONCAT函数的使用

    原文链接 GROUP_CONCAT功能 将某个字段的值拼接成字符串. 举例使用 先看一下原始数据表 执行下面sql语句 SELECT `cid`,GROUP_CONCAT(mid) AS `mids` ...

  7. Java中内部类和静态内部类的区别

    内部类和静态内部类 示例 public class OuterClass { private int numPrivate = 1; public int numPublic = 2; public ...

  8. CMDB_Agent版本

    目录 CMDB_Agent版本 CMDB概念 CMDB_Agent介绍 agent方案 ssh类方案 相比较 架构目录 bin-start.py 启动文件 conf-config.py 自定义配置文件 ...

  9. Java容器的常见问题

    记录Java容器中的常见概念和原理 参考: https://github.com/wangzhiwubigdata/God-Of-BigData#三Java并发容器 https://blog.csdn ...

  10. gRPC(2):客户端创建和调用原理

    1. gRPC 客户端创建流程 1.1 背景 gRPC 是在 HTTP/2 之上实现的 RPC 框架,HTTP/2 是第 7 层(应用层)协议,它运行在 TCP(第 4 层 - 传输层)协议之上,相比 ...