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的实现类
Mybatis的基本操作案列增加以及源码的分析(二)的更多相关文章
- Spring5源码深度分析(二)之理解@Conditional,@Import注解
代码地址: 1.源码分析二主要分析的内容 1.使用@Condition多条件注册bean对象2.@Import注解快速注入第三方bean对象3.@EnableXXXX 开启原理4.基于ImportBe ...
- Backbone.js 1.0.0源码架构分析(二)——Event
(function(){ //省略前面代码 var Events = Backbone.Events = { // 根据name订阅事件,push到this._events[name] on: fun ...
- MyBatis源码骨架分析
源码包分析 MyBatis 源码下载地址:https://github.com/MyBatis/MyBatis-3 MyBatis源码导入过程: 下载MyBatis的源码 检查maven的版本,必须是 ...
- LinkedHashMap 源码详细分析(JDK1.8)
1. 概述 LinkedHashMap 继承自 HashMap,在 HashMap 基础上,通过维护一条双向链表,解决了 HashMap 不能随时保持遍历顺序和插入顺序一致的问题.除此之外,Linke ...
- [Java] Hashtable 源码简要分析
Hashtable /HashMap / LinkedHashMap 概述 * Hashtable比较早,是线程安全的哈希映射表.内部采用Entry[]数组,每个Entry均可作为链表的头,用来解决冲 ...
- 【原】FMDB源码阅读(二)
[原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...
- MapReduce的ReduceTask任务的运行源码级分析
MapReduce的MapTask任务的运行源码级分析 这篇文章好不容易恢复了...谢天谢地...这篇文章讲了MapTask的执行流程.咱们这一节讲解ReduceTask的执行流程.ReduceTas ...
- Activity源码简要分析总结
Activity源码简要分析总结 摘自参考书籍,只列一下结论: 1. Activity的顶层View是DecorView,而我们在onCreate()方法中通过setContentView()设置的V ...
- MapReduce的MapTask任务的运行源码级分析
TaskTracker任务初始化及启动task源码级分析 这篇文章中分析了任务的启动,每个task都会使用一个进程占用一个JVM来执行,org.apache.hadoop.mapred.Child方法 ...
随机推荐
- 【从零开始学BPM,Day1】工作流管理平台架构学习
[课程主题] 主题:5天,一起从零开始学习BPM [课程形式] 1.为期5天的短任务学习 2.每天观看一个视频,视频学习时间自由安排. [第一天课程] Step 1 软件下载:H3 BPM10.0全开 ...
- App解读
一直不懂别人口中说的原生开发.混合式开发.今天突然看了一篇文章讲解的是什么叫做原生App?移动 Web App?混合APP?分享给大家. 原生App是专门针对某一类移动设备而生的,它们都是直接安装到设 ...
- oracle 误删数据恢复
1.根据时间点查系统版本号scn: select timestamp_to_scn(to_timestamp('2013-01-07 11:20:00','YYYY-MM-DD HH:MI:SS')) ...
- vim+vundle配置
Linux环境下写代码虽然没有IDE,但通过给vim配置几个插件也足够好用.一般常用的插件主要包括几类,查找文件,查找符号的定义或者声明(函数,变量等)以及自动补全功能.一般流程都是下载需要的工具,然 ...
- ubuntu14 安装及卸载vmware
原帖http://blog.sina.com.cn/s/blog_73dac6b50101gp4f.html 适用于ubuntu14和vmware player 12.5
- Web 前端攻防(2014版)
在百度 FEX 团队时写的.有次让我写点前端开发中注意的安全规范,结果写着写着就跑题了,写了一堆纯前端实现的攻击方式...当然还有防范措施. 文章就懒得粘过来了~ 直接贴个地址算了:) http:// ...
- 2000条你应知的WPF小姿势 基础篇<40-44 启动关闭,Xaml,逻辑树>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...
- ABP源码分析十八:UI Inputs
以下图中描述的接口和类都在Abp项目的Runtime/Validation, UI/Inputs目录下的.在当前版本的ABP(0.83)中这些接口和类并没有实际使用到.阅读代码时可以忽略,无需浪费时间 ...
- My97DatePicker时间控件在项目中的应用
一.下载My97DatePicker的压缩包My97DatePicker.rar,解压. 注:My97DatePicker最新版本有开发包,项目中使用时删掉,以便节省空间,提高程序的运行效率. 二.在 ...
- 【CSS进阶】试试酷炫的 3D 视角
写这篇文章的缘由是因为看到了这个页面: 戳我看看(移动端页面,使用模拟器观看) 运用 CSS3 完成的 3D 视角,虽然有一些晕3D,但是使人置身于其中的交互体验感觉非常棒,运用在移动端制作一些 H5 ...