MyBatis与Spring的整合(实现增删查改)

实现Spring和MyBatis整合

要在Spring中使用MyBatis,需要在Spring的配置文件中定义一些类

  • SqlSessionFactoryBean

       为整合应用提供SqlSession对象资源

  • SqlSessionTemplate

        负责管理MyBatis的SqlSession,调用SQL映射语句,实现对数据库的访问

  • MapperFactoryBean

        根据指定Mapper接口生成Bean实例

  • MapperScannerConfigurer

        根据指定包批量扫描Mapper接口并生成实例

 

二、为业务层添加声明式事务管理

配置声明式事务:

1、导入tx和aop命名空间

2、定义事务管理器Bean,并为其注入数据源Bean

3、通过<tx:advice>配置事务增强,绑定事务管理器并针对不同方法定义事务规则

4、配置切面,将事务增强与方法切入点组合

 <!--声明式事务-->
    <tx:advice id="interceptor" transaction-manager="transactionManager">
        <tx:attributes>
            <!--在什么方法上加上事务-->
            <tx:method name="select*" propagation="SUPPORTS" isolation="DEFAULT"/>
            <tx:method name="update*" propagation="REQUIRED" isolation="DEFAULT" />
            <tx:method name="insert*" propagation="REQUIRED" isolation="DEFAULT"/>
            <tx:method name="delete*" propagation="REQUIRED" isolation="DEFAULT" />
        </tx:attributes>
    </tx:advice>

    <aop:config>
        <aop:pointcut id="pointcut" expression="execution(* org.example.service.*.*(..))"/>

        <aop:advisor advice-ref="interceptor" pointcut-ref="pointcut"></aop:advisor>
    </aop:config>

事务属性:

1、propagation:事务传播机制

  • REQUIRED(默认值)
  • REQUIRES_NEW、MANDATORY、NESTED
  • SUPPORTS
  • NOT_SUPPORTED、NEVER

2、isolation:事务隔离等级

  • DEFAULT(默认值)
  • READ_COMMITTED
  • READ_UNCOMMITTED
  • REPEATABLE_READ
  • SERIALIZABLE\

3、timeout:事务超时时间,允许事务运行的最长时间,以秒为单位。默认值为-1,表示不超时

4、read-only:事务是否为只读,默认值为false

5、rollback-for:设定能够触发回滚的异常类型

  • Spring默认只在抛出runtime exception时才标识事务回滚
  • 可以通过全限定类名指定需要回滚事务的异常,多个类名用逗号隔开

6、no-rollback-for:设定不触发回滚的异常类型

  • Spring默认checked Exception不会触发事务回滚
  • 可以通过全限定类名指定不需要回滚事务的异常,多个类名用逗号隔开

 

三、用户的增删改查例子

导入相关的依赖包

pom.xml

<dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.6</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>2.0.5</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.22</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.3.1</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aspects</artifactId>
      <version>5.3.1</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.springframework/spring-orm -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-orm</artifactId>
      <version>5.3.1</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/log4j/log4j -->
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.17</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
    <dependency>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
      <version>1.2</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/commons-dbcp/commons-dbcp -->
    <dependency>
      <groupId>commons-dbcp</groupId>
      <artifactId>commons-dbcp</artifactId>
      <version>1.4</version>
    </dependency>

    <dependency>
      <groupId>org.apache.maven</groupId>
      <artifactId>maven-model</artifactId>
      <version>2.0.9</version>
      <scope>test</scope>
    </dependency>


  </dependencies>

配置文件

mybatisConfig.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="logImpl" value="LOG4J"/>
    </settings>

    <typeAliases>
        <package name="org.example.bean"/>
    </typeAliases>

</configuration>

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


    <!--导入db.properties  log4j.properties-->
    <context:property-placeholder location="classpath*:db.properties" system-properties-mode="NEVER"/>
    <context:property-placeholder location="classpath*:log4j.properties"/>


    <!--配置数据源-->
    <bean class="org.apache.commons.dbcp.BasicDataSource" id="dataSource">
        <property name="driverClassName" value="${driver}"></property>
        <property name="username" value="${username}"></property>
        <property name="password" value="${password}"></property>
        <property name="url" value="${url}"></property>
    </bean>

    <!--sqlSession-->
    <bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sessionFactory">
        <property name="dataSource" ref="dataSource"></property>
        <property name="configLocation" value="classpath:mybatisConfig.xml"></property>
    </bean>

    <!--扫描mapper文件-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="org.example.dao"></property>
    </bean>

    <context:component-scan base-package="org.example.service"/>

    <bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

    <!--开启事务注解-->
    <tx:annotation-driven/>
</beans>

 

User实体类

package org.example.bean;

import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;


public class User  implements  Serializable{
	private Integer id; //id
	private String userCode; //用户编码
	private String userName; //用户名称
	private String userPassword; //用户密码
	private Integer gender;  //性别
	private Date birthday;  //出生日期
	private String phone;   //电话
	private String address; //地址
	private Integer userRole;    //用户角色
	private Integer createdBy;   //创建者
	private Date creationDate; //创建时间
	private Integer modifyBy;     //更新者
	private Date modifyDate;   //更新时间


    public Integer getId() {
	    return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getUserCode() {
		return userCode;
	}
	public void setUserCode(String userCode) {
		this.userCode = userCode;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getUserPassword() {
		return userPassword;
	}
	public void setUserPassword(String userPassword) {
		this.userPassword = userPassword;
	}
	public Integer getGender() {

        return gender;
	}
	public void setGender(Integer gender) {

		this.gender = gender;
	}
	public Date getBirthday() {
		return birthday;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
	public String getPhone() {
		return phone;
	}
	public void setPhone(String phone) {
		this.phone = phone;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public Integer getUserRole() {
		return userRole;
	}
	public void setUserRole(Integer userRole) {
		this.userRole = userRole;
	}
	public Integer getCreatedBy() {
		return createdBy;
	}
	public void setCreatedBy(Integer createdBy) {
		this.createdBy = createdBy;
	}
	public Date getCreationDate() {
		return creationDate;
	}
	public void setCreationDate(Date creationDate) {
		this.creationDate = creationDate;
	}
	public Integer getModifyBy() {
		return modifyBy;
	}
	public void setModifyBy(Integer modifyBy) {
		this.modifyBy = modifyBy;
	}
	public Date getModifyDate() {
		return modifyDate;
	}
	public void setModifyDate(Date modifyDate) {
		this.modifyDate = modifyDate;
	}

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", userCode='" + userCode + '\'' +
                ", userName='" + userName + '\'' +
                ", userPassword='" + userPassword + '\'' +
                ", gender=" + gender +
                ", birthday=" + birthday +
                ", phone='" + phone + '\'' +
                ", address='" + address + '\'' +
                ", userRole=" + userRole +
                ", createdBy=" + createdBy +
                ", creationDate=" + creationDate +
                ", modifyBy=" + modifyBy +
                ", modifyDate=" + modifyDate +
                '}';
    }
}

UserDao接口

package org.example.dao;

import org.apache.ibatis.annotations.Mapper;
import org.example.bean.User;

import java.util.List;

@Mapper
public interface UserDao {
    /**查询用户**/
    public List<User> selectUser();

    /**根据用户id删除用户**/
    public void deleteUserById(String id);

    /**增加用户**/
    public void insertUser(User user);

    /**修改用户**/
    public void updateUserById(User user);
}

UserDao.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">
<!--namespace  命名空间-->
<mapper namespace="org.example.dao.UserDao">
    <resultMap id="myUser" type="org.example.bean.User">
        <id column="id" property="id"></id>
        <result column="userCode" property="userCode"></result>
        <result column="userName" property="userName"></result>
        <result column="phone" property="phone"></result>
        <result column="gender" property="gender"></result>
        <result column="birthday" property="birthday"></result>
        <result column="userRole" property="userRole"></result>
    </resultMap>


    <!--查询用户-->
    <select id="selectUser" resultType="org.example.bean.User">
        select * from smbms_user
    </select>

    <!--删除用户-->
    <delete id="deleteUserById">
        delete from smbms_user
        where id =#{id}
    </delete>

    <!--增加用户-->
    <insert id="insertUser" parameterType="org.example.bean.User">
        insert into smbms_user
        (userCode,userName,userPassword,gender,phone,address,userRole)
        values (#{userCode},#{userName},#{userPassword},#{gender},#{phone},#{address},#{userRole})
    </insert>
    
    <!--修改用户-->
    <update id="updateUserById" parameterType="org.example.bean.User">
        update smbms_user
        set userName = #{userName}
        where id = #{id}
    </update>

</mapper>

IUserService接口

package org.example.service;

import org.example.bean.User;

import java.util.List;

public interface IUserService {
    /**查询用户**/
    public List<User> selectUserlist();

    /**删除用户**/
    public void deleteUserById(String id);

    /**新增用户
     * @return**/
    public User insertUser(User user);

    /**修改用户**/
    public void updateUser(User user);
}

UserServiceImpl实现类

package org.example.service;

import org.example.bean.User;
import org.example.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service("userService")
@Transactional
public class UserServiceImpl implements IUserService {


        @Autowired
        @Qualifier("userDao")
        private UserDao userDao;

        public void setUserDao(UserDao userDao) {
            this.userDao = userDao;
        }


    /**
     * @author chenliduan
     * @description 查询用户
     * @params [user]
     * @Return java.util.List<org.example.bean.User>
     * @date 2020/11/11 0011 11:22
     **/
    @Override
    @Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.DEFAULT,readOnly = true)
    public List<User> selectUserlist() {
        return userDao.selectUser();
    }


    /**
     * @author chenliduan
     * @description 删除用户
     * @params [id]
     * @Return void
     * @date 2020/11/11 0011 12:19
     **/
    @Override
    @Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.DEFAULT,readOnly = false)
    public void deleteUserById(String id) {
        userDao.deleteUserById(id);
    }

    /**
     * @author chenliduan
     * @description 新增用户
     * @params []
     * @Return void
     * @date 2020/11/11 0011 15:20
     *
     * @return*/
    @Override
    @Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.DEFAULT,readOnly = false)
    public User insertUser(User user) {
        userDao.insertUser(user);
        return null;
    }

    /**
     * @author chenliduan
     * @description 修改用户
     * @params []
     * @Return void
     * @date 2020/11/11 0011 15:20
     **/
    @Override
    @Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.DEFAULT,readOnly = false)
    public void updateUser(User user) {
        userDao.updateUserById(user);
    }
}

AppTest测试类

package org.example;



import org.example.bean.User;
import org.example.service.IUserService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.sql.Date;
import java.util.List;

/**
 * Unit test for simple App.
 */
public class AppTest {

    /**
     * @author chenliduan
     * @description 查询用户 Rigorous Test :-)
     * @params []
     * @Return void
     * @date 2020/11/11 0011 11:30
     **/
    @Test
    public void selectUserlist(){
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext2.xml");
    IUserService bean = applicationContext.getBean(IUserService.class);
    List<User> users = bean.selectUserlist();
    System.out.println(users);
    }

    /**
     * @author chenliduan
     * @description 删除用户
     * @params []
     * @Return void
     * @date 2020/11/11 0011 12:19
     **/
    @Test
    public void deleteUserById(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext2.xml");
        IUserService bean = applicationContext.getBean(IUserService.class);
        bean.deleteUserById("30");
    }

    /**
     * @author chenliduan
     * @description 增加用户
     * @params
     * @Return
     * @date 2020/11/11 0011 15:23
     **/
    @Test
    public void insertUser(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext2.xml");
        IUserService bean = applicationContext.getBean(IUserService.class);
        User user =new User();
        user.setUserCode("chenxiaoduan");
        user.setUserName("陈小端");
        user.setUserPassword("123456");
        user.setGender(2);
        user.setAddress("广州市");
        user.setUserRole(3);
        bean.insertUser(user);
    }

    /**
     * @author chenliduan
     * @description 修改用户
     * @params
     * @Return
     * @date 2020/11/11 0011 15:23
     **/
    @Test
    public void updateUserById(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext2.xml");
        IUserService bean = applicationContext.getBean(IUserService.class);
        User user = new User();
        user.setUserName("hhh");
        user.setId(36);
        bean.updateUser(user);
    }
}

 


版权声明:本文为weixin_41781654原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。