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

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

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

1、创建一个web项目

    

2、导入jar

    

3、创建实体entity

  1. /**
  2. * 学生实体类
  3. * @author Happy
  4. *
  5. */
  6. public class Student {
  7. private Integer stuno;
  8. private String stuname;
  9. private Integer stuage;
  10. private Date studate;
  11.  
  12. public String toString() {
  13. return "Student [stuno=" + stuno + ", stuname=" + stuname + ", stuage="
  14. + stuage + ", studate=" + studate + "]";
  15. }
  16.  
  17. //省略get/set
  18. }

4、在到层创建dao接口并且小配置StudentDao.xml我也就放在这里了

  1. public interface IStudentDAO {

//添加
  public int addStu(Student stu) throws IOException;

  1. }

StudentDao.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="cn.happy.dao">
  6. <insert id="insertStudent" parameterType="Student" >
  7. insert into student(stuname,stuage,studate) values(#{stuname},#{stuage},#{studate})
  8. </insert>
  9. </mapper>

5、书写daoimpl实现类的

  1. public class StudentDAOImpl implements IStudentDAO {
  2. SqlSession session ;//提取session在下面作为成员变量好调用
  3. public StudentDAOImpl() throws IOException {
  4. session= MybatisUtil.getSession();
  5. }
  6. //添加学生
  7. public int addStu(Student stu) throws IOException {
  8.  
  9. int result = session.insert("insertStudent",stu);
  10. session.commit();
  11. session.close();
  12. return result;
  13. }
  14. }

6、提出一个tool工具类

  1. /**
  2. * 工具类
  3. * @author Happy
  4. *
  5. */
  6. public class MybatisUtil {
  7. private static String config="mybatis-config.xml";
  8. static Reader reader;
  9. static{
  10. try {
  11. reader= Resources.getResourceAsReader(config);
  12. } catch (IOException e) {
  13. e.printStackTrace();
  14. }
  15. }
  16. private static SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
  17. //提供一个可以获取到session的方法
  18. public static SqlSession getSession() throws IOException{
  19.  
  20. System.out.println("22222"+factory);
  21. //弊病,就是工厂是
  22. // 1.1 openSession到底做了什么
  23. SqlSession session = factory.openSession();
  24. System.out.println("3333");
  25. return session;
  26. }
  27. }

7、大配置

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6.  
  7. <!-- 别名的定制 -->
  8. <typeAliases>
  9. <!-- 按类型名定制别名 -->
  10. <!-- <typeAlias type="cn.happy.entity.Student" alias="Student"/> -->
  11.  
  12. <!-- 拿当前指定包下的简单类名作为别名 -->
  13. <package name="cn.happy.entity"/>
  14. </typeAliases>
  15.  
  16. <environments default="mysql">
  17. <environment id="mysql">
  18. <!-- 使用jdbc的事务 -->
  19. <transactionManager type="JDBC" />
  20. <!-- 使用自带的连接池 -->
  21. <dataSource type="POOLED">
  22. <property name="driver" value="com.mysql.jdbc.Driver" />
  23. <property name="url" value="jdbc:mysql://localhost:3306/y2162" />
  24. <property name="username" value="root" />
  25. <property name="password" value="root" />
  26. </dataSource>
  27. </environment>
  28. </environments>
  29. <mappers>
  30. <mapper resource="cn/happy/dao/StudentDAO.xml" />
  31. </mappers>
  32. </configuration>

8、进行@test添加

  1. @Test
  2. public void testAdd() throws IOException{
  3. Student stu=new Student();
  4. stu.setStuname("Y2161好人");
  5. stu.setStuage(21);
  6. stu.setStudate(new Date());
  7.  
  8. System.out.println("添加前======="+stu);
  9.  
  10. IStudentDAO dao=new StudentDAOImpl();
  11. dao.addStu(stu);
  12.  
  13. 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. java面向对象中的关键字

    1,super关键字 super:父类的意思 1. super.属性名 (调用父类的属性) 2. super.方法名 (调用父类的方法) 3. super([参数列表])(调用父类的构造方法) 注意: ...

  2. 《动手实现一个网页加载进度loading》

    loading随处可见,比如一个app经常会有下拉刷新,上拉加载的功能,在刷新和加载的过程中为了让用户感知到 load 的过程,我们会使用一些过渡动画来表达.最常见的比如"转圈圈" ...

  3. Android中访问sdcard路径的几种方式

    以前的Android(4.1之前的版本)中,SDcard路径通过"/sdcard"或者"/mnt/sdcard"来表示,而在JellyBean(安卓4.1)系统 ...

  4. MemCache超详细解读

    MemCache是什么 MemCache是一个自由.源码开放.高性能.分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高 ...

  5. Lesson 24 It could be worse

    Text I entered the hotel manager's office and sat down. I had just lost £50 and I felt very upset. ' ...

  6. asp.net pipeline完整图

  7. mysql sleep进程过多,应用级配置

    <property name="hibernateProperties"> <props> <prop key="hibernate.dia ...

  8. ABP源码分析三十六:ABP.Web.Api

    这里的内容和ABP 动态webapi没有关系.除了动态webapi,ABP必然是支持使用传统的webApi.ABP.Web.Api模块中实现了一些同意的基础功能,以方便我们创建和使用asp.net w ...

  9. ASP.NET MVC5+EF6+EasyUI 后台管理系统(50)-Easyui 扁平化皮肤

    最近抽了点时间仿做了点皮肤,只供欣赏!扁平化

  10. Mina、Netty、Twisted一起学(八):HTTP服务器

    HTTP协议应该是目前使用最多的应用层协议了,用浏览器打开一个网站就是使用HTTP协议进行数据传输. HTTP协议也是基于TCP协议,所以也有服务器和客户端.HTTP客户端一般是浏览器,当然还有可能是 ...