单独使用MyBatis对事物进行管理
前面MyBatis的文章有写过相关内容,这里继续写一个最简单的Demo,算是复习一下之前MyBatis的内容吧,先是建表,建立一个简单的Student表:
create table student(student_id int auto_increment,student_name varchar(20) not null,primary key(student_id))
建立实体类Student.java:
public class Student{private int studentId;private String studentName;public int getStudentId(){return studentId;}public void setStudentId(int studentId){this.studentId = studentId;}public String getStudentName(){return studentName;}public void setStudentName(String studentName){this.studentName = studentName;}public String toString(){return "Student{[studentId:" + studentId + "], [studentName:" + studentName + "]}";}}
多说一句,对实体类重写toString()方法,打印其中每一个(或者说是关键属性)是一个推荐的做法。接着是config.xml,里面是jdbc基本配置:
<?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><typeAlias alias="Student" type="org.xrq.domain.Student" /></typeAliases><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/test"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><mappers><mapper resource="student_mapper.xml"/></mappers></configuration>
然后是student_mapper.xml,主要是具体的sql语句:
<mapper namespace="StudentMapper"><resultMap type="Student" id="StudentMap"><id column="student_id" property="studentId" jdbcType="INTEGER" /><result column="student_name" property="studentName" jdbcType="VARCHAR" /></resultMap><select id="selectAllStudents" resultMap="StudentMap">select student_id, student_name from student;</select><insert id="insertStudent" useGeneratedKeys="true" keyProperty="studentId" parameterType="Student">insert into student(student_id, student_name) values(#{studentId, jdbcType=INTEGER}, #{studentName, jdbcType=VARCHAR});</insert></mapper>
建立一个MyBatisUtil.java,用于建立一些MyBatis基本元素的,后面的类都继承这个类:
public class MyBatisUtil{protected static SqlSessionFactory ssf;protected static Reader reader;static{try{reader = Resources.getResourceAsReader("config.xml");ssf = new SqlSessionFactoryBuilder().build(reader);} catch (IOException e){e.printStackTrace();}}protected SqlSession getSqlSession(){return ssf.openSession();}}
企业级开发讲求:
1、定义和实现分开
2、分层开发,通常情况下为Dao-->Service-->Controller,不排除根据具体情况多一层/几层或少一层
所以,先写一个StudentDao.java接口:
public interface StudentDao{public List<Student> selectAllStudents();public int insertStudent(Student student);}
最后写一个StudentDaoImpl.java实现这个接口,注意要继承MyBatisUtil.java类:
public class StudentDaoImpl extends MyBatisUtil implements StudentDao{private static final String NAMESPACE = "StudentMapper.";public List<Student> selectAllStudents(){SqlSession ss = getSqlSession();List<Student> list = ss.selectList(NAMESPACE + "selectAllStudents");ss.close();return list;}public int insertStudent(Student student){SqlSession ss = getSqlSession();int i = ss.insert(NAMESPACE + "insertStudent", student);// ss.commit();ss.close();return i;}}
写一个测试类:
public class StudentTest{public static void main(String[] args){StudentDao studentDao = new StudentDaoImpl();Student student = new Student();student.setStudentName("Jack");studentDao.insertStudent(student);System.out.println("插入的主键为:" + student.getStudentId());System.out.println("-----Display students------");List<Student> studentList = studentDao.selectAllStudents();for (int i = 0, length = studentList.size(); i < length; i++)System.out.println(studentList.get(i));}}
结果一定是空。
我说过这个例子既是作为复习,也是作为一个引子引入我们今天的内容,空的原因是,insert操作已经做了,但是MyBatis并不会帮我们自动提交事物,所以展示出来的自然是空的。这种时候就必须手动通过SqlSession的commit()方法提交事务,即打开StudentDaoImpl.java类第17行的注释就可以了。
多说一句,这个例子除了基本的MyBatis插入操作之外,在插入的基础上还有返回插入的主键id的功能。
接下来,就利用Spring管理MyBatis事物,这也是企业级开发中最常用的事物管理做法。
使用Spring管理MyBatis事物
关于这块,网上有很多文章讲解,我搜索了很多,但是要么就是相互复制黏贴,要么就是没有把整个例子讲清楚的,通过这一部分,我尽量讲清楚如何使用Spring管理MyBatis事物。
使用Spring管理MyBatis事物,除了Spring必要的模块beans、context、core、expression、commons-logging之外,还需要以下内容:
(1)MyBatis-Spring-1.x.0.jar,这个是Spring集成MyBatis必要的jar包
(2)数据库连接池,dbcp、c3p0都可以使用,我这里使用的是阿里的druid
(3)jdbc、tx、aop,jdbc是基本的不多说,用到tx和aop是因为Spring对MyBatis事物管理的支持是通过aop来实现的
(4)aopalliance.jar,这个是使用Spring AOP必要的一个jar包
上面的jar包会使用Maven的可以使用Maven下载,没用过Maven的可以去CSDN上下载,一搜索就有的。
MyBatis的配置文件config.xml里面,关于jdbc连接的部分可以都去掉,只保留typeAliases的部分:
<?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><typeAlias alias="Student" type="org.xrq.domain.Student" /></typeAliases></configuration>
多提一句,MyBatis另外一个配置文件student_mapper.xml不需要改动。接着,写Spring的配置文件,我起名字叫做spring.xml:
<?xml version="1.0" encoding="UTF-8"?><beans xmlns:xsi="http://mit、rollback,全部都是由Spring帮助我们实现的,这就是利用Spring对MyBatis进行事物管理。
后记
本文复习了MyBatis的基本使用与使用Spring对MyBatis进行事物管理,给出了比较详细的代码例子,有需要的朋友们可以照着代码研究一下。在本文的基础上,后面还会写一篇文章,讲解一下多数据在单表和多表之间的事物管理实现,这种需求也是属于企业及应用中比较常见的需求。