zoukankan      html  css  js  c++  java
  • spring——整合Mybatis

    一、Mybatis整合spring

    步骤:

    1. 导入相关jar包
      • junit
      • mybatis
      • mysql数据库
      • spring-webmvc
      • aop织入
      • mybatis-spring
      • spring-jdbc(spring的事务管理器,也可以用druid等的代替)
    2. 编写配置文件
    3. 测试
    1.1 回忆mybatis
    1. 编写实体类
    2. 编写核心配置文件
    3. 编写接口
    4. 编写Mapper.xml
    5. 测试
    1.2 整合方式一

    注意版本限制:

    image-20200730210748119

    1. dataSource(这里配置使用Spring的数据源替换Mybatis的配置)

      <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
          <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
          <property name="url" value="jdbc:mysql://localhost:3306/dailyClick-test?useSSL=false&amp;useUnicode=true&amp;characterEncoding=utf-8"/>
          <property name="username" value="1111"/>
          <property name="password" value="1111"/>
      </bean>
      

      注:Mybatis有默认的数据源(连接池),但是是可以替换的

    2. sqlSessionFactory配置

      <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
          <property name="dataSource" ref="dataSource" />
          <!--        绑定配置文件地址和mapper地址-->
          <property name="configLocation" value="classpath:mybatis-config.xml"/>
          <property name="mapperLocations" value="classpath:com/guan/dao/*.xml"/>
      </bean>
      

      注意:

      • 需要配置数据源
      • 需要绑定配置文件地址和mapper地址,注意这里的路径使用classpath路径
      • 由于mapper等信息被转移到<bean>中,不能重复配置(如:<mapper>),否则会报错;mybatis-config.xml配置文件通常留<typeAlias><settings>
    3. 与在原来的mybatis不同,整合后需要有一个接口的实现类,且接口的方法需要通过sqlSessionTemplate实现(有利于bean的注册和管理,这个sqlSessioinTemplate是线程安全的)

      sqlSessionTemplate配置

      <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
          <constructor-arg index="0" ref="sqlSessionFactory"/>
      </bean>
      

      注:由于sqlSessionTemplate没有set方法,只有构造函数,所以通过<constructor>标签注入

    4. 实现类:与mybatis元素代码不同,接口类需要实现且接口的方法通过sqlSessionTemplate实现

      public class UserMapperImpl implements UserMapper {
          SqlSessionTemplate sqlSession;
      
          public void setSqlSession(SqlSessionTemplate sqlSession) {
              this.sqlSession = sqlSession;
          }
      
          public List<UserBean> getUserList() {
              UserMapper mapper = sqlSession.getMapper(UserMapper.class);
              return mapper.getUserList();
          }
      }
      
      <bean id="userMapper" class="com.guan.dao.UserMapperImpl">
          <property name="sqlSession" ref="sqlSession"/>
      </bean>
      
    5. 测试

      public class MyTest {
          public static void main(String[] args) throws IOException {
              ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
              UserMapperImpl userMapperImpl = context.getBean("userMapper", UserMapperImpl.class);
              List<UserBean> userList = userMapperImpl.getUserList();
              for (UserBean userBean : userList) {
                  System.out.println(userBean);
              }
          }
      }
      

      注:

      (1).mybatis的配置文件(指的是和spring注册的那一部分),最好通过import引入ApplicationiContext中,这样spring配置文件的结构可以区分开

      (2).xxxTemplate是spring特有的模板类

    1.3 整合方式二

    注:SqlSessionDaoSupport:抽象类,可以通过SqlSessionFactory获得一个SqlSessionTemplate.所以该方法相对于第一种方法增加了一个抽象类,减少了一个配置SqlSessionTemplate的步骤

    1. 环境搭建:

      接口:

      public interface UserMapper1 {
          List<UserBean> getUserList();
      }
      

      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.guan.dao.UserMapper1">
          <select id="getUserList" resultType="userBean">
              SELECT  * FROM  user;
          </select>
      </mapper>
      

      实体类:

      public class UserMapper1Impl extends SqlSessionDaoSupport implements UserMapper1{
          public List<UserBean> getUserList() {
              return getSqlSession().getMapper(UserMapper1.class).getUserList();
          }
      }
      
    2. xml配置(在上文的前文的基础上配置)

      <bean id="userMapper1" class="com.guan.dao.UserMapper1Impl">
          <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
      </bean>
      
    3. 测试:

          public static void main(String[] args) throws IOException {
              ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
              UserMapper1Impl userMapperImpl = context.getBean("userMapper1", UserMapper1Impl.class);
              List<UserBean> userList = userMapperImpl.getUserList();
              for (UserBean userBean : userList) {
                  System.out.println(userBean);
              }
          }
      

    二、spring中的事物管理

    1. 编程式事务:将事务管理代码嵌到业务方法中控制事务的提交和回滚

      缺点:使业务逻辑中包含额外的事务管理代码

    2. 声明式事物:使用AOP

      (1).搭建环境:

      接口

      public interface UserMapper1 {
          List<UserBean> getUserList();
          void insert(UserBean user);
          void delete(String UId);
      }
      

      mapper:

      <insert id="insert" parameterType="userBean">
          INSERT  INTO user(UId,UName,USet,UAuth,UPassword,UState) VALUES(#{UId},#{UName},#{USet},#{UAuth},#{UPassword},#{UState});
      </insert>
      
      <delete id="delete" parameterType="string">
          DELETEs FROM user WHERE UId = #{UId};
      </delete>
      

      注:可以看到我这里的"DELETEs"是错误的写法

      编写实体类:

      public class UserMapper1Impl extends SqlSessionDaoSupport implements UserMapper1{
          public List<UserBean> getUserList() {
              insert(new UserBean("6666666666","淀真嗣",1,0,"123456",1));
              delete("3180421016");
              return getSqlSession().getMapper(UserMapper1.class).getUserList();
          }
      
          public void insert(UserBean user) {
              getSqlSession().getMapper(UserMapper1.class).insert(user);
          }
      
          public void delete(String UId) {
              getSqlSession().getMapper(UserMapper1.class).delete(UId);
          }
      }
      

      注:getUserList中添加了insert和delete方法,且delete方法是错误的.如果没有事务,则插入可以完成;如果有事务,则插入无法完成

      (2).导入事务相关的xml头文件约束,创建DataSourceTransaction对象以开启事务,配置事务通知,结合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/tx
              https://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">
      
          <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
              <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
              <property name="url" value="jdbc:mysql://47.100.90.132:3306/dailyClick-test?useSSL=false&amp;useUnicode=true&amp;characterEncoding=utf-8"/>
              <property name="username" value="root"/>
              <property name="password" value="aguan123"/>
          </bean>
      
          <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
              <property name="dataSource" ref="dataSource" />
      <!--        bind mybatis-config.xml and userMapper.xml-->
              <property name="configLocation" value="classpath:mybatis-config.xml"/>
              <property name="mapperLocations" value="classpath:com/guan/dao/*.xml"/>
          </bean>
      
          <bean id="userMapper1" class="com.guan.dao.UserMapper1Impl">
              <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
          </bean>
      
      <!--    配置声明式事务-->
          <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
              <property name="dataSource" ref="dataSource"/>
          </bean>
      
      <!--    配置事务通知-->
          <tx:advice id="txAdvice" transaction-manager="transactionManager">
              <tx:attributes>
                  <tx:method name="getUserList" propagation="REQUIRED"/>
              </tx:attributes>
          </tx:advice>
      
      <!--    结合AOP织入事务-->
          <aop:config>
              <aop:pointcut id="point" expression="execution(* com.guan.dao.*.*(..))"/>
      <!--        <aop:advisor advice-ref="txAdvice" pointcut-ref="point"/>-->
          </aop:config>
      
      
      </beans>
      

      注:<tx:method name="getUserList" propagation="REQUIRED"/>的propagation属性表示对这些方法怎样使用事务,如:REQUIRED表示支持当前事务,如果当前没有事务,就新建一个事务 (Default)

      (3).测试

      public class MyTest {
      
          public static void main(String[] args) throws IOException {
              ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
              UserMapper1 userMapperImpl = context.getBean("userMapper1", UserMapper1.class);
              List<UserBean> userList = userMapperImpl.getUserList();
              for (UserBean userBean : userList) {
                  System.out.println(userBean);
              }
          }
      }
      

      注意:由于使用了AOP,这里UserMapper1 userMapperImpl = context.getBean("userMapper1", UserMapper1.class)的返回类型必须为interface类型,而不是实体类型

  • 相关阅读:
    CNN comprehension
    Gradient Descent
    Various Optimization Algorithms For Training Neural Network
    gerrit workflow
    jenkins job配置脚本化
    Jenkins pipeline jobs隐式传参
    make words counter for image with the help of paddlehub model
    make words counter for image with the help of paddlehub model
    git push and gerrit code review
    image similarity
  • 原文地址:https://www.cnblogs.com/Arno-vc/p/13410349.html
Copyright © 2011-2022 走看看