zoukankan      html  css  js  c++  java
  • 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的实现类

        

  • 相关阅读:
    26 转义符 re模块 方法 random模块 collection模块的Counter方法
    25 正则表达式
    24 from 模块 import 名字
    24 from 模块 import 名字
    24 from 模块 import 名字
    23 析构方法 items系列 hash方法 eq方法
    21 isinstance issubclass 反射 _str_ _new_ _len_ _call_
    20 属性, 类方法, 静态方法. python2与python3的区别.
    python(1)
    python之字符串格式化
  • 原文地址:https://www.cnblogs.com/yejiaojiao/p/6188128.html
Copyright © 2011-2022 走看看