一、构建一个框架的项目的思路
首先我们先建立一个web项目,我们需要jar,mybatis-config.xml和studentDao.xml的配置随后就是dao、daoimpl、entity、的架构。
二、具体步骤(添加一个学生)
1、创建一个web项目
2、导入jar
3、创建实体entity
/** * 学生实体类 * @author Happy * */public class Student { private Integer stuno; private String stuname; private Integer stuage; private Date studate; public String toString() { return "Student [stuno=" + stuno + ", stuname=" + stuname + ", stuage=" + stuage + ", studate=" + studate + "]";}//省略get/set}
4、在到层创建dao接口并且小配置StudentDao.xml我也就放在这里了
public interface IStudentDAO {
//添加
public int addStu(Student stu) throws IOException;}
StudentDao.xml
insert into student(stuname,stuage,studate) values(#{stuname},#{stuage},#{studate})
5、书写daoimpl实现类的
public class StudentDAOImpl implements IStudentDAO { SqlSession session ;//提取session在下面作为成员变量好调用 public StudentDAOImpl() throws IOException { session= MybatisUtil.getSession(); } //添加学生 public int addStu(Student stu) throws IOException { int result = session.insert("insertStudent",stu); session.commit(); session.close(); return result; }}
6、提出一个tool工具类
/** * 工具类 * @author Happy * */public class MybatisUtil { private static String config="mybatis-config.xml"; static Reader reader; static{ try { reader= Resources.getResourceAsReader(config); } catch (IOException e) { e.printStackTrace(); } } private static SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader); //提供一个可以获取到session的方法 public static SqlSession getSession() throws IOException{ System.out.println("22222"+factory); //弊病,就是工厂是 // 1.1 openSession到底做了什么 SqlSession session = factory.openSession(); System.out.println("3333"); return session; }}
7、大配置
8、进行@test添加
@Test public void testAdd() throws IOException{ Student stu=new Student(); stu.setStuname("Y2161好人"); stu.setStuage(21); stu.setStudate(new Date()); System.out.println("添加前======="+stu); IStudentDAO dao=new StudentDAOImpl(); 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的实现类