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

    首先我们先建立一个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. MyBatis源码分析(一)开篇

    源码学习的好处不用多说,Mybatis源码量少.逻辑简单,将写个系列文章来学习. SqlSession Mybatis的使用入口位于org.apache.ibatis.session包中的SqlSes ...

  2. BPM配置故事之案例7-公式计算

    行政主管发来邮件.要求物资明细表增加"单价""总价"."单价"由其审批时填写,"总价"根据"单价"与 ...

  3. iOS开源项目周报1215

    由OpenDigg 出品的iOS开源项目周报第一期来啦.我们的iOS开源周报集合了OpenDigg一周来新收录的优质的iOS开发方面的开源项目,方便iOS开发人员便捷的找到自己需要的项目工具等. PY ...

  4. Atiti.大企业病与小企业病 大公司病与小公司病

    Atiti.大企业病与小企业病 大公司病与小公司病 1. 大企业病,一般会符合机构臃肿 .多重领导 .人才流失的特点.1 2. 大企业病避免方法1 3. 小企业病 1 3.1.1. 表现1 4. 如何 ...

  5. CentOS:Yum源的配置

    # cd /etc/yum.repos.d/ # mv CentOS-Base.repo CentOS-Base.repo.bak # wget http://mirrors.163.com/.hel ...

  6. TCP/IP之TCP_NODELAY与TCP_CORK

    TCP/IP之Nagle算法与40ms延迟提到了Nagle 算法.这样虽然提高了网络吞吐量,但是实时性却降低了,在一些交互性很强的应用程序来说是不允许的,使用TCP_NODELAY选项可以禁止Nagl ...

  7. Web应用之LAMP源码环境部署

    一.LAMP环境的介绍 1.LAMP环境的重要性 思索许久,最终还是决定写一篇详细的LAMP的源码编译安装的实验文档,一来是为了给自己一个交代,把技术进行系统的归纳,将技术以极致的形式呈现出来,做为一 ...

  8. 自定义ConfigSection

      CCustom configuration section with intelisense

  9. 白板编程浅谈——Why, What, How

    作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://lucida.me/blog/whiteboard-coding-demystified/ 这篇文章节选 ...

  10. iOS----应用的旋转---Orientations

    此博文主要针对IOS应用, 是屏幕旋转相关问题的一个总结. 主要内容有: IOS5,6,7不同版的适配. 强制旋转和自动旋转. QQ : 1101819159 邮箱: GeekiVan@aliyun. ...