Mybatis的基本操作案列增加以及源码的分析(二)

一、构建一个框架的项目的思路

    首先我们先建立一个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

<?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 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、大配置

<?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() 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的实现类

    

原文地址:https://www.cnblogs.com/yejiaojiao/p/6188128.html