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

摘要:
DOCTYPEmapperPUBLIC“-//mybatis.org//DTDMapper3.0//EN”http://mybatis.org/dtd/mybatis-3-mapper.dtd“˃insertstudentvalues5.编写publiclassStudentDAOImplementsStudentDaO{SqlSession;//将会话提取为下面的成员变量,通过IOException{session=MybatisUtil.getSession();}//添加学生publicationaddStuthrowsIOException{intresult=session.insert;session.commit();session.close();returnresult;}}6.建议一个工具工具类/***工具类*@authorHappy**/publicclassMybatisUtil{privatestaticStringconfig=“mybatis config.xml”;staticReaderreader;静态{try{reader=Resources.getResourceAsReader;}catch{e.printStackTrace();}}privatestaticSqlSessionFactoryfactory=newSql会话工厂生成器()。构建;//提供一个公共staticSqlSessionetSession()抛出IOException{System.out.println;//缺点是工厂是//1.1 openSession做什么7.大型配置˂!

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

首先我们先建立一个web项目,我们需要jar,mybatis-config.xml和studentDao.xml的配置随后就是dao、daoimpl、entity、的架构。

二、具体步骤(添加一个学生)

1、创建一个web项目

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

2、导入jar

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

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做了什么?

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

根据openSession()方法找到DefaultSqlSessionFactory

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

找到这个方法你会看到OpenSeesion传过来的是autoCommit的属性

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

根据openSessionFromDataSource方法找到

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

得出结论:autoCommit=false; dirty=false

2.insert和delete底层到底发生了什么?

insert和delete的方法都是update

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

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

现在跟一遍insert代码看看底层发生了什么?

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

得出结论:update中第一行将dirty=true;

3.为什么session.commit()能引起事务提交

前提dirty = true

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

找到commit方法的实现类

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

在找到isCommitOrRollbackRequired实现类

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

autoCommit=false;取反为trun&&在insert为trun所以直接为trun

在找到commit方法就可以事物提交了

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

4.为什么session.close()不用回滚事务了

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

找到close的实现类

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

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

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

免责声明:文章转载自《Mybatis的基本操作案列增加以及源码的分析(二)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇DNS注册信息ranger kafka下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

核心开发接口(一)

1.Configuration   进行配置信息的管理   用来产生SessionFactory   可以在configure方法中指定hibernate配置文件   只需要关注一个方法即:buildSessionFactory() 2.SessionFactory   管理连接池   用来产生Session,没产生一个session,就给它一个数据库连接...

使用Fiddler进行APP弱网测试

一、安装Fiddler 网上说要先安装.NET Framwork4,应该是由于本机已装,所以在安装Fiddler时并没有相关提示。 Fiddler安装包:https://www.telerik.com/download/fiddler/fiddler4 二、Fiddler通过代理连上手机 首先电脑和手机要使用同一个无线网。 1. Fiddler工具->...

android黑科技系列——实现静态的默认安装和卸载应用

一、访问隐藏的API方式进行静态的默认安装和卸载 1.系统安装程序 android自带了一个安装程序—/system/app/PackageInstaller.apk.大多数情况下,我们手机上安装应用都是通过这个apk来安装 的。代码使用也非常简单: /*安装apk */ public static voidinstallApk(Context conte...

MyBatis 映射文件详解(六)

MyBatis 配置文件类型 MyBatis配置文件有两种类型,如下: 全局配置文件(如 mybatis-config.xml) Mapper XML 映射文件(如 UserMapper.xml) 上篇讲解全局配置文件,这篇接着讲解Mapper 接口映射文件 Mapper XML 映射文件详解 CRUD 标签(或元素) select Map...

Django(55)GenericAPIView源码分析

源码分析 GenericAPIView继承自APIView,也就是在APIView基础上再做了一层封装,源码如下: class GenericAPIView(views.APIView): queryset = None serializer_class = None lookup_field = 'pk' lookup_...

shiro中用redis做session缓存

shiro中的cache和spring类似,有提供两个接口,使用者使用不同的实现来继承他们:   1.cache-实际进行缓存操作,如使用spring-data-redis操作   2.cacheManager-管理cahe实例,返回cache实例   3.SessionDAO-调用cache进行操作 项目中,我用的securityManager是Defa...