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类型,而不是实体类型

  • 相关阅读:
    linux系统——机制与策略(三)
    linux系统——机制与策略(二)
    Linux系统——机制策略(一)
    RTSP会话基本流程
    linux编程学习
    编码风格——linux内核开发的coding style
    编程风格——整洁代码的4个提示
    编程风格——五种应该避免的代码注释
    十条不错的编程观点
    代码优化概要
  • 原文地址:https://www.cnblogs.com/Arno-vc/p/13410349.html
Copyright © 2011-2022 走看看