一、构建一个框架的项目的思路
首先我们先建立一个web项目,我们需要jar,mybatis-config.xml和studentDao.xml的配置随后就是dao、daoimpl、entity、的架构。
二、具体步骤(添加一个学生)
1、创建一个web项目
2、导入jar
3、创建实体entity
/*** 学生实体类 * @authorHappy * */ public classStudent { privateInteger stuno; privateString stuname; privateInteger stuage; privateDate studate; publicString toString() { return "Student [stuno=" + stuno + ", stuname=" + stuname + ", stuage=" + stuage + ", studate=" + studate + "]"; } //省略get/set }
4、在到层创建dao接口并且小配置StudentDao.xml我也就放在这里了
public interfaceIStudentDAO {
//添加
public int addStu(Student stu) throws IOException;
}
StudentDao.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="cn.happy.dao"> <insert id="insertStudent"parameterType="Student" >insert into student(stuname,stuage,studate) values(#{stuname},#{stuage},#{studate}) </insert> </mapper>
5、书写daoimpl实现类的
public class StudentDAOImpl implementsIStudentDAO { SqlSession session ;//提取session在下面作为成员变量好调用 public StudentDAOImpl() throwsIOException { session=MybatisUtil.getSession(); } //添加学生 public int addStu(Student stu) throwsIOException { int result = session.insert("insertStudent",stu); session.commit(); session.close(); returnresult; } }
6、提出一个tool工具类
/*** 工具类 * @authorHappy * */ public classMybatisUtil { private static String config="mybatis-config.xml"; staticReader reader; static{ try{ reader=Resources.getResourceAsReader(config); } catch(IOException e) { e.printStackTrace(); } } private static SqlSessionFactory factory = newSqlSessionFactoryBuilder().build(reader); //提供一个可以获取到session的方法 public static SqlSession getSession() throwsIOException{ System.out.println("22222"+factory); //弊病,就是工厂是 //1.1 openSession到底做了什么 SqlSession session =factory.openSession(); System.out.println("3333"); returnsession; } }
7、大配置
<?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 type="cn.happy.entity.Student" alias="Student"/> --> <!--拿当前指定包下的简单类名作为别名 --> <package name="cn.happy.entity"/> </typeAliases> <environments default="mysql"> <environment id="mysql"> <!--使用jdbc的事务 --> <transactionManager type="JDBC" /> <!--使用自带的连接池 --> <dataSource type="POOLED"> <property name="driver"value="com.mysql.jdbc.Driver" /> <property name="url"value="jdbc:mysql://localhost:3306/y2162" /> <property name="username"value="root" /> <property name="password"value="root" /> </dataSource> </environment> </environments> <mappers> <mapper resource="cn/happy/dao/StudentDAO.xml" /> </mappers> </configuration>
8、进行@test添加
@Test public void testAdd() throwsIOException{ Student stu=newStudent(); stu.setStuname("Y2161好人"); stu.setStuage(21); stu.setStudate(newDate()); System.out.println("添加前======="+stu); IStudentDAO dao=newStudentDAOImpl(); dao.addStu(stu); System.out.println("添加后======="+stu);
三、源码分析四个问题
1.openSession做了什么?
根据openSession()方法找到DefaultSqlSessionFactory
找到这个方法你会看到OpenSeesion传过来的是autoCommit的属性
根据openSessionFromDataSource方法找到
得出结论:autoCommit=false; dirty=false
2.insert和delete底层到底发生了什么?
insert和delete的方法都是update
现在跟一遍insert代码看看底层发生了什么?
得出结论:update中第一行将dirty=true;
3.为什么session.commit()能引起事务提交
前提dirty = true
找到commit方法的实现类
在找到isCommitOrRollbackRequired实现类
autoCommit=false;取反为trun&&在insert为trun所以直接为trun
在找到commit方法就可以事物提交了
4.为什么session.close()不用回滚事务了
找到close的实现类