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

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

    

Mybatis的基本操作案列增加以及源码的分析(二)的更多相关文章

  1. Spring5源码深度分析(二)之理解@Conditional,@Import注解

    代码地址: 1.源码分析二主要分析的内容 1.使用@Condition多条件注册bean对象2.@Import注解快速注入第三方bean对象3.@EnableXXXX 开启原理4.基于ImportBe ...

  2. Backbone.js 1.0.0源码架构分析(二)——Event

    (function(){ //省略前面代码 var Events = Backbone.Events = { // 根据name订阅事件,push到this._events[name] on: fun ...

  3. MyBatis源码骨架分析

    源码包分析 MyBatis 源码下载地址:https://github.com/MyBatis/MyBatis-3 MyBatis源码导入过程: 下载MyBatis的源码 检查maven的版本,必须是 ...

  4. LinkedHashMap 源码详细分析(JDK1.8)

    1. 概述 LinkedHashMap 继承自 HashMap,在 HashMap 基础上,通过维护一条双向链表,解决了 HashMap 不能随时保持遍历顺序和插入顺序一致的问题.除此之外,Linke ...

  5. [Java] Hashtable 源码简要分析

    Hashtable /HashMap / LinkedHashMap 概述 * Hashtable比较早,是线程安全的哈希映射表.内部采用Entry[]数组,每个Entry均可作为链表的头,用来解决冲 ...

  6. 【原】FMDB源码阅读(二)

    [原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...

  7. MapReduce的ReduceTask任务的运行源码级分析

    MapReduce的MapTask任务的运行源码级分析 这篇文章好不容易恢复了...谢天谢地...这篇文章讲了MapTask的执行流程.咱们这一节讲解ReduceTask的执行流程.ReduceTas ...

  8. Activity源码简要分析总结

    Activity源码简要分析总结 摘自参考书籍,只列一下结论: 1. Activity的顶层View是DecorView,而我们在onCreate()方法中通过setContentView()设置的V ...

  9. MapReduce的MapTask任务的运行源码级分析

    TaskTracker任务初始化及启动task源码级分析 这篇文章中分析了任务的启动,每个task都会使用一个进程占用一个JVM来执行,org.apache.hadoop.mapred.Child方法 ...

随机推荐

  1. 负载均衡——nginx理论

     nginx是什么? nginx是一个强大的web服务器软件,用于处理高并发的http请求和作为反向代理服务器做负载均衡.具有高性能.轻量级.内存消耗少,强大的负载均衡能力等优势.  nginx架构? ...

  2. [jquery]jquery正则表达式验证(手机号、身份证号、中文名称)

    数字判断方法:isNaN()函数 test()方法 判断字符串中是否匹配到正则表达式内容,返回的是boolean值 ( true / false ) // 验证中文名称 function isChin ...

  3. [Intel Edison开发板] 05、Edison开发基于MRAA实现IO控制,特别是UART通信

    一.前言 下面是本系列文章的前几篇: [Intel Edison开发板] 01.Edison开发板性能简述 [Intel Edison开发板] 02.Edison开发板入门 [Intel Edison ...

  4. ASP.NET Web API Model-ModelMetadata

    ASP.NET Web API Model-ModelMetadata 前言 前面的几个篇幅主要围绕控制器的执行过程,奈何执行过程中包含的知识点太庞大了,只能一部分一部分的去讲解,在上两篇中我们看到在 ...

  5. Entity Framework 6 Recipes 2nd Edition(11-2)译 -> 为一个”模型定义”函数返回一个计算列

    11-3. 为一个”模型定义”函数返回一个计算列 问题 想从”模型定义”函数里返回一个计算列 解决方案 假设我们有一个员工(Employee)实体,属性有: FirstName, LastName,和 ...

  6. string length() 方法注意点

    突然意识到string length() 是跟文件的字符编码相关的 测试了下, 果然如此: 对于常见字, 结果是一样的, System.out.println("T中国123".l ...

  7. Spark 开发中遇到的一些问题

    1.StackOverflowError 问题:简单代码记录 : for (day <- days){ rdd = rdd.union(sc.textFile(/path/to/day) ... ...

  8. SQL Server 进制转换函数

    一.背景 前段时间群里的朋友问了一个问题:“在查询时增加一个递增序列,如:0x00000001,即每一个都是36进位(0—9,A--Z),0x0000000Z后面将是0x00000010,生成一个像下 ...

  9. Java学习之LinkedHashMap学习总结

    前言: 在学习LRU算法的时候,看到LruCache源码实现是基于LinkedHashMap,今天学习一下LinkedHashMap的好处以及如何实现lru缓存机制的. 需求背景: LRU这个算法就是 ...

  10. CRL快速开发框架系列教程四(删除数据)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...