0


Spring-Mybatis整合 | 原理分析

在这里插入图片描述

💗wei_shuo的个人主页

💫wei_shuo的学习社区

🌐Hello World !

文章目录


▌环境搭建

步骤:

导入相关jar包

  • junit
  • mybatis
  • mysql
  • spring
  • aop织入
  • mybatis-spring

环境搭建:

<dependencies><!--junit--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><!--mysql--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version></dependency><!--mybatis--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.2</version></dependency><!--spring--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.0.RELEASE</version></dependency><!--spring操作数据库,需要spring-jdbc--><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.1.9.RELEASE</version></dependency><!--aop织入--><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.4</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>2.0.2</version></dependency></dependencies>

▌Mybatis流程回顾

  • 编写实体类
packagecom.wei.pojo;importlombok.Data;@DatapublicclassUser{privateint id;privateString name;privateString pwd;}
  • 编写核心配置文件
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPEconfigurationPUBLIC"-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><!--configuration核心配置文件--><configuration><!--引入外部配置文件--><!--<properties resource="jdbc.properties"/>--><settings><!--标准日志工厂实现--><settingname="logImpl"value="LOG4J"/></settings><typeAliases><packagename="com.wei.pojo.User"/></typeAliases><!--环境配置--><environmentsdefault="development"><environmentid="development"><!--事物管理--><transactionManagertype="JDBC"/><dataSourcetype="POOLED"><propertyname="driver"value="com.mysql.cj.jdbc.Driver"/><propertyname="url"value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/><propertyname="username"value="root"/><propertyname="password"value="root"/></dataSource></environment></environments><mappers><mapperclass="com.wei.Mapper.UserMapper"/></mappers></configuration>
  • 编写接口
packagecom.wei.Mapper;importcom.wei.pojo.User;importjava.util.List;publicinterfaceUserMapper{publicList<User>selectUser();}
  • 编写Mapper映射文件
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPEmapperPUBLIC"-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!--namespace=绑定一个对应的Dao/Mapper接口--><mappernamespace="com.wei.Mapper.UserMapper"><!--select查询语句查询全部用户--><selectid="selectUser"resultType="com.wei.pojo.User">
        select * from mybatis.user;
    </select></mapper>
  • 测试
importcom.wei.Mapper.UserMapper;importcom.wei.pojo.User;importorg.apache.ibatis.io.Resources;importorg.apache.ibatis.session.SqlSession;importorg.apache.ibatis.session.SqlSessionFactory;importorg.apache.ibatis.session.SqlSessionFactoryBuilder;importorg.junit.Test;importjava.io.IOException;importjava.io.InputStream;importjava.util.List;publicclassMyTest{@Testpublicvoidtest()throwsIOException{String resources ="mybatis-config.xml";//读取mybatis-config.xml主配置文件InputStream in =Resources.getResourceAsStream(resources);SqlSessionFactory sessionFactory =newSqlSessionFactoryBuilder().build(in);SqlSession sqlSession = sessionFactory.openSession(true);UserMapper mapper = sqlSession.getMapper(UserMapper.class);List<User> userList = mapper.selectUser();for(User user : userList){System.out.println(user);}

      sqlSession.close();}}

▌Mybatis-Spring整合

SqlSessionTemplate方式

  • 要和 Spring 一起使用 MyBatis,需要在 Spring 应用上下文中定义至少两样东西:一个 SqlSessionFactory 和至少一个数据映射器类。
  • 在 MyBatis-Spring 中,可使用 SqlSessionFactoryBean来创建 SqlSessionFactory。 要配置这个工厂 bean,只需要把下面代码放在 Spring 的 XML 配置文件中
  • 在基础的 MyBatis 用法中,是通过 SqlSessionFactoryBuilder 来创建 SqlSessionFactory 的。而在 MyBatis-Spring 中,则使用 SqlSessionFactoryBean 来创建
  • 编写UserMapper接口类
packagecom.wei.Mapper;importcom.wei.pojo.User;importjava.util.List;publicinterfaceUserMapper{publicList<User>selectUser();}
  • UserMapper.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"><!--namespace=绑定一个对应的Dao/Mapper接口--><mapper namespace="com.wei.Mapper.UserMapper"><!--select查询语句查询全部用户--><select id="selectUser" resultType="com.wei.pojo.User">
        select * from mybatis.user;</select></mapper>
  • UserMapperImpl实现类,接口增加实现类
packagecom.wei.Mapper;importcom.wei.pojo.User;importorg.mybatis.spring.SqlSessionTemplate;importjava.util.List;publicclassUserMapperImplimplementsUserMapper{//以前来有操作使用SqlSession执行,现在所有操作在SqlSessionTemplateprivateSqlSessionTemplate sqlSession;publicvoidsetSqlSession(SqlSessionTemplate sqlSession){this.sqlSession = sqlSession;}publicList<User>selectUser(){UserMapper mapper = sqlSession.getMapper(UserMapper.class);return mapper.selectUser();}}
  • User接口
packagecom.wei.pojo;importlombok.Data;@DatapublicclassUser{privateint id;privateString name;privateString pwd;}
  • Mybatis-config.xml核心配置文件
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPEconfigurationPUBLIC"-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><!--configuration核心配置文件--><configuration><!--引入外部配置文件--><!--<properties resource="jdbc.properties"/>--><settings><!--标准日志工厂实现--><settingname="logImpl"value="LOG4J"/></settings><typeAliases><packagename="com.wei.pojo"/></typeAliases><!--环境配置--><environmentsdefault="development"><environmentid="development"><!--事物管理--><transactionManagertype="JDBC"/><dataSourcetype="POOLED"><propertyname="driver"value="com.mysql.cj.jdbc.Driver"/><propertyname="url"value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/><propertyname="username"value="root"/><propertyname="password"value="root"/></dataSource></environment></environments><!--    <mappers>--><!--        <mapper class="com.wei.Mapper.UserMapper"/>--><!--    </mappers>--></configuration>
  • log4j.properties资源包
log4j.properties
#将等级为DEBUG的日志信息输出到console和file两个目的地
log4j.rootLogger=DEBUG,console,file

#控制台输出的相关设置
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Target=System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=【%c】-%m%n

#文件输出的相关配置
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/wei.log
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=【%p】[%d{yy-MM-dd}【%c】%m%n

#日志输出级别
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
  • ​ spring-dao.xml(将sqlSessionFactory等bean注入到spring框架中,来管理持久层中的操作)
<?xml version="1.0" encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--DataSource:使用Spring的数据源替换Mybatis的配置--><beanid="dataSource"class="org.springframework.jdbc.datasource.DriverManagerDataSource"><propertyname="driverClassName"value="com.mysql.cj.jdbc.Driver"/><propertyname="url"value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/><propertyname="username"value="root"/><propertyname="password"value="root"/></bean><!--sqlSessionFactory--><beanid="sqlSessionFactory"class="org.mybatis.spring.SqlSessionFactoryBean"><!--配置数据源--><propertyname="dataSource"ref="dataSource"/><!--
        当你需要使用mybatis-config.xml 配置文件的时候你就需要配置config-location,
        config-location的作用是确定mybatis-config.xml文件位置的,
        而mapper-locations是用来注册你写的xxxmapper.xml文件。如果你使用了mybatis-config.xml,
        并且里面配置了mapper,那就不需要mapper-locations

        mapper-locations是一个定义mapper接口位置的属性,在xxx.yml或xxx.properties下配置,作用是实现mapper接口配置
        --><!--绑定Mybatis配置文件--><propertyname="configLocation"value="classpath:mybatis-config.xml"/><propertyname="mapperLocations"value="classpath:com/wei/Mapper/*.xml"/></bean><!--SqlSessionTemplate:就是我们使用的sqlSessiion--><beanid="sqlSession"class="org.mybatis.spring.SqlSessionTemplate"><!--只能使用构造器注入,应为没有set方法--><constructor-argindex="0"ref="sqlSessionFactory"/></bean><!--注入UserMapperImpl实现类--><beanid="userMpaaer"class="com.wei.Mapper.UserMapperImpl"><propertyname="sqlSession"ref="sqlSession"/></bean></beans>
  • ​ ApplicationContext.xml(配置Spring框架所需的信息)
<?xml version="1.0" encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--import,一般用于团队开发中,可以将多个配置文件导入合并为一个--><importresource="spring-dao.xml"/><!--注入UserMapperImpl实现类--><beanid="userMpaaer"class="com.wei.Mapper.UserMapperImpl"><propertyname="sqlSession"ref="sqlSession"/></bean></beans>
  • 测试
importcom.wei.Mapper.UserMapper;importcom.wei.pojo.User;importorg.junit.Test;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.ClassPathXmlApplicationContext;importjava.io.IOException;publicclassMyTest{@Testpublicvoidtest()throwsIOException{//解析beans.xml文件,生成管理相应的Bean对象ApplicationContext context =newClassPathXmlApplicationContext("ApplicationContext.xml");//       UserMapper userMpaaer = context.getBean("userMpaaer", UserMapper.class);UserMapper userMpaaer =(UserMapper) context.getBean("userMpaaer");for(User user: userMpaaer.selectUser()){System.out.println(user);}}}

SqlSessionTemplate分析

SqlSessionTemplate

是 MyBatis-Spring 的核心。作为

SqlSession

的一个实现,这意味着可以使用它无缝代替你代码中已经在使用的

SqlSession

SqlSessionTemplate

是线程安全的,可以被多个 DAO 或映射器所共享使用

  • 使用 SqlSessionFactory 作为构造方法的参数来创建 SqlSessionTemplate 对象
<beanid="sqlSession"class="org.mybatis.spring.SqlSessionTemplate"><constructor-argindex="0"ref="sqlSessionFactory"/></bean>
@ConfigurationpublicclassMyBatisConfig{@BeanpublicSqlSessionTemplatesqlSession()throwsException{returnnewSqlSessionTemplate(sqlSessionFactory());}}
  • 现在,这个 bean 就可以直接注入到你的 DAO bean 中了。你需要在你的 bean 中添加一个 SqlSession 属性,就像下面这样:
publicclassUserDaoImplimplementsUserDao{privateSqlSession sqlSession;publicvoidsetSqlSession(SqlSession sqlSession){this.sqlSession = sqlSession;}publicUsergetUser(String userId){return sqlSession.selectOne("org.mybatis.spring.sample.mapper.UserMapper.getUser", userId);}}
  • 注入Spring:按下面这样,注入 SqlSessionTemplate
<beanid="userDao"class="org.mybatis.spring.sample.dao.UserDaoImpl"><propertyname="sqlSession"ref="sqlSession"/></bean>
  • SqlSessionTemplate 还有一个接收 ExecutorType 参数的构造方法。这允许你使用如下 Spring 配置来批量创建对象,例如批量创建一些 SqlSession:
<beanid="sqlSession"class="org.mybatis.spring.SqlSessionTemplate"><constructor-argindex="0"ref="sqlSessionFactory"/><constructor-argindex="1"value="BATCH"/></bean>
@ConfigurationpublicclassMyBatisConfig{@BeanpublicSqlSessionTemplatesqlSession()throwsException{returnnewSqlSessionTemplate(sqlSessionFactory(),ExecutorType.BATCH);}}
  • 现在所有的映射语句可以进行批量操作了,可以在 DAO 中编写如下的代码
publicclassUserService{privatefinalSqlSession sqlSession;publicUserService(SqlSession sqlSession){this.sqlSession = sqlSession;}publicvoidinsertUsers(List<User> users){for(User user : users){
      sqlSession.insert("org.mybatis.spring.sample.mapper.UserMapper.insertUser", user);}}}

注意,只需要在希望语句执行的方法与

SqlSessionTemplate

中的默认设置不同时使用这种配置。

这种配置的弊端在于,当调用这个方法时,不能存在使用不同

ExecutorType

的进行中的事务。要么确保对不同

ExecutorType

SqlSessionTemplate

的调用处在不同的事务中,要么完全不使用事务

configLocation & mapperLocations分析

  • Spring-dao.xml中
<!--绑定Mybatis配置文件--><propertyname="configLocation"value="classpath:mybatis-config.xml"/><propertyname="mapperLocations"value="classpath:com/wei/Mapper/*.xml"/>
  • configLocation :即mybatis-config.xml核心配置文件

当你需要使用mybatis-config.xml 配置文件的时候你就需要配置config-location,config-location的作用是确定mybatis-config.xml文件位置

  • mapperLocations:dao接口类的映射文件

mapper-locations是用来注册所写的xxxmapper.xml映射文件

SqlSessionDaoSupport方式

  • 创建User类
packagecom.wei.pojo;importlombok.Data;@DatapublicclassUser{privateint id;privateString name;privateString pwd;}
  • UserMapper接口
packagecom.wei.Mapper;importcom.wei.pojo.User;importjava.util.List;publicinterfaceUserMapper{publicList<User>selectUser();}
  • UserMapper.xml映射文件
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPEmapperPUBLIC"-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!--namespace=绑定一个对应的Dao/Mapper接口--><mappernamespace="com.wei.Mapper.UserMapper"><!--select查询语句查询全部用户--><selectid="selectUser"resultType="com.wei.pojo.User">
        select * from mybatis.user;
    </select></mapper>
  • Spring-dao.xml(配置、整合Mybatis)
<?xml version="1.0" encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--DataSource:使用Spring的数据源替换Mybatis的配置--><beanid="dataSource"class="org.springframework.jdbc.datasource.DriverManagerDataSource"><propertyname="driverClassName"value="com.mysql.cj.jdbc.Driver"/><propertyname="url"value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/><propertyname="username"value="root"/><propertyname="password"value="root"/></bean><!--sqlSessionFactory--><beanid="sqlSessionFactory"class="org.mybatis.spring.SqlSessionFactoryBean"><!--配置数据源--><propertyname="dataSource"ref="dataSource"/><!--
        当你需要使用mybatis-config.xml 配置文件的时候你就需要配置config-location,
        config-location的作用是确定mybatis-config.xml文件位置的,
        而mapper-locations是用来注册你写的xxxmapper.xml文件。如果你使用了mybatis-config.xml,
        并且里面配置了mapper,那就不需要mapper-locations

        mapper-locations是一个定义mapper接口位置的属性,在xxx.yml或xxx.properties下配置,作用是实现mapper接口配置
        --><!--绑定Mybatis配置文件--><propertyname="configLocation"value="classpath:mybatis-config.xml"/><propertyname="mapperLocations"value="classpath:com/wei/Mapper/*.xml"/></bean></beans>
  • UserMapperImpl实现类,注入到spring中(applicationContext.xml)
packagecom.wei.Mapper;importcom.wei.pojo.User;importorg.mybatis.spring.support.SqlSessionDaoSupport;importjava.util.List;publicclassUserMapperImpl2extendsSqlSessionDaoSupportimplementsUserMapper{@OverridepublicList<User>selectUser(){//        SqlSession sqlSession = getSqlSession();//        UserMapper mapper = sqlSession.getMapper(UserMapper.class);returngetSqlSession().getMapper(UserMapper.class).selectUser();}}
  • applicationContext.xml(配置Spring框架所需的信息)
<?xml version="1.0" encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--import,一般用于团队开发中,可以将多个配置文件导入合并为一个--><importresource="spring-dao.xml"/><!--注入UserMapperImpl实现类--><beanid="userMpaaer"class="com.wei.Mapper.UserMapperImpl"><propertyname="sqlSession"ref="sqlSession"/></bean><beanid="userMapper2"class="com.wei.Mapper.UserMapperImpl2"><propertyname="sqlSessionFactory"ref="sqlSessionFactory"/></bean></beans>
  • MyTest测试类
importcom.wei.Mapper.UserMapper;importcom.wei.pojo.User;importorg.junit.Test;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.ClassPathXmlApplicationContext;importjava.io.IOException;publicclassMyTest{@Testpublicvoidtest()throwsIOException{//解析beans.xml文件,生成管理相应的Bean对象ApplicationContext context =newClassPathXmlApplicationContext("ApplicationContext.xml");//       UserMapper userMpaaer = context.getBean("userMpaaer", UserMapper.class);UserMapper userMpaaer =(UserMapper) context.getBean("userMpaaer");for(User user: userMpaaer.selectUser()){System.out.println(user);}}}

SqlSessionDaoSupport分析

SqlSessionDaoSupport

是一个抽象的支持类,用来为你提供

SqlSession

。调用

getSqlSession()

方法你会得到一个

SqlSessionTemplate

,之后可以用于执行 SQL 方法,就像下面这样:

publicclassUserDaoImplextendsSqlSessionDaoSupportimplementsUserDao{publicUsergetUser(String userId){returngetSqlSession().selectOne("org.mybatis.spring.sample.mapper.UserMapper.getUser", userId);}}

在这个类里面,通常更倾向于使用

MapperFactoryBean

,因为它不需要额外的代码。但是,如果你需要在 DAO 中做其它非 MyBatis 的工作或需要一个非抽象的实现类,那么这个类就很有用了。

SqlSessionDaoSupport

需要通过属性设置一个

sqlSessionFactory

SqlSessionTemplate

。如果两个属性都被设置了,那么

SqlSessionFactory

将被忽略。

假设类

UserMapperImpl

SqlSessionDaoSupport

的子类,可以编写如下的 Spring 配置来执行设置:

<beanid="userDao"class="org.mybatis.spring.sample.dao.UserDaoImpl"><propertyname="sqlSessionFactory"ref="sqlSessionFactory"/></bean>

🌼 结语:创作不易,如果觉得博主的文章赏心悦目,还请——

点赞

👍

收藏

⭐️

评论

📝

冲冲冲

🤞


在这里插入图片描述

标签: mybatis spring java

本文转载自: https://blog.csdn.net/weixin_62765017/article/details/127839791
版权归原作者 wei_shuo 所有, 如有侵权,请联系我们删除。

“Spring-Mybatis整合 | 原理分析”的评论:

还没有评论