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方法 ...
随机推荐
- java面向对象中的关键字
1,super关键字 super:父类的意思 1. super.属性名 (调用父类的属性) 2. super.方法名 (调用父类的方法) 3. super([参数列表])(调用父类的构造方法) 注意: ...
- 《动手实现一个网页加载进度loading》
loading随处可见,比如一个app经常会有下拉刷新,上拉加载的功能,在刷新和加载的过程中为了让用户感知到 load 的过程,我们会使用一些过渡动画来表达.最常见的比如"转圈圈" ...
- Android中访问sdcard路径的几种方式
以前的Android(4.1之前的版本)中,SDcard路径通过"/sdcard"或者"/mnt/sdcard"来表示,而在JellyBean(安卓4.1)系统 ...
- MemCache超详细解读
MemCache是什么 MemCache是一个自由.源码开放.高性能.分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高 ...
- 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. ' ...
- asp.net pipeline完整图
- mysql sleep进程过多,应用级配置
<property name="hibernateProperties"> <props> <prop key="hibernate.dia ...
- ABP源码分析三十六:ABP.Web.Api
这里的内容和ABP 动态webapi没有关系.除了动态webapi,ABP必然是支持使用传统的webApi.ABP.Web.Api模块中实现了一些同意的基础功能,以方便我们创建和使用asp.net w ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(50)-Easyui 扁平化皮肤
最近抽了点时间仿做了点皮肤,只供欣赏!扁平化
- Mina、Netty、Twisted一起学(八):HTTP服务器
HTTP协议应该是目前使用最多的应用层协议了,用浏览器打开一个网站就是使用HTTP协议进行数据传输. HTTP协议也是基于TCP协议,所以也有服务器和客户端.HTTP客户端一般是浏览器,当然还有可能是 ...