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

        

  • 相关阅读:
    Ed Chi 的 long range dependence works
    论文阅读:Stochastic Weight Completion for Road Networks using Graph Convolutional Networks
    论文阅读:HOP-Rec: High-Order Proximity for Implicit Recommendation
    温故BERT之Transformer
    论文阅读:Are We Really Making Much Progress-A Worrying Analysis of Recent Neural Recommendatin Approaches
    使用ffmpeg进行媒体格式转换
    使用ghostscript将pdf转图片
    linux下使用libreoffice将Office文档转PDF
    nginx指定文件路径有两种方式root和alias
    CentOS下的SVN服务器搭建过程
  • 原文地址:https://www.cnblogs.com/yejiaojiao/p/6188128.html
Copyright © 2011-2022 走看看