一、Mybatis的诞生

  回顾下传统的数据库开发,JDBC和Hibernate是使用最普遍的技术,但这两种ORM框架都存在一定的局限性:

  JDBC:最原生的技术,简单易学,执行速度快,效率高,适合大数据量的操作,但存在代码繁琐,需要关心驱动的加载,连接的关闭等操作,对于分页等复杂用法,需要自己手动写代码实现。

  Hibernate:以面向对象的方式设计和访问,不用写SQL,不用管底层具体数据库的语法,但对于多表操作灵活性差,复杂的HQL难写难理解,执行速度慢,只适合小数据量的操作。

  基于上述技术的瓶颈,诞生了一种在这两者之间找到平衡点的ORM框架,结合它们的优点,摒弃它们的缺点,这就是myBatis,现今myBatis被广泛的企业所采用。MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)

二、Mybatis入门Demo(基于MySQL)

  Mybatis程序的运行流程大概如下:

  (1)通过Reader对象读取src目录下的mybatis.xml配置文件(该文件名称可自定义,主要用来配置数据源,类型别名以及mapper文件的总配置文件)

  (2)通过SqlSessionFactoryBuilder对象创建SqlSessionFactory对象

  (3)从当前线程,即ThreadLocal中获取SqlSession对象
  (4)开启事务(默认开启)
  (5)通过SqlSession对象读取对应Mapper.xml映射文件中的操作编号,从而读取sql语句
  (6)提交或回滚事务
  (7)关闭SqlSession对象,并且分开当前线程与SqlSession对象,让GC尽早回收

  基于上述步骤开始Mybatis入门Demo案例的编写:

  步骤1.引入Mybatis所需jar包依赖

  1. <dependency>
  2. <groupId>org.mybatis</groupId>
  3. <artifactId>mybatis</artifactId>
  4. <version>3.3.0</version>
  5. </dependency>
  6.  
  7. <dependency>
  8. <groupId>mysql</groupId>
  9. <artifactId>mysql-connector-java</artifactId>
  10. <version>5.1.38</version>
  11. </dependency>
  12.  
  13. <dependency>
  14. <groupId>org.slf4j</groupId>
  15. <artifactId>slf4j-api</artifactId>
  16. <version>1.7.12</version>
  17. </dependency>
  18. <dependency>
  19. <groupId>org.slf4j</groupId>
  20. <artifactId>slf4j-log4j12</artifactId>
  21. <version>1.7.12</version>
  22. </dependency>
  23. <dependency>
  24. <groupId>log4j</groupId>
  25. <artifactId>log4j</artifactId>
  26. <version>1.2.17</version>
  27. </dependency>

  步骤2.准备数据源db.properties并配置mybatis.xml文件

  1. mysql.driver=com.mysql.jdbc.Driver
  2. mysql.url=jdbc:mysql://localhost:3306/aa
  3. mysql.username=root
  4. mysql.password=123456
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  3. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  4.  
  5. <configuration>
  6.  
  7. <!-- 加载类路径下的属性文件 -->
  8. <properties resource="db.properties">
  9. </properties>
  10.  
  11. <!-- 设置实体类的类型别名 -->
  12. <typeAliases>
  13. <typeAlias type="com.jyk.mybatis.Student" alias="student"/>
  14. </typeAliases>
  15.  
  16. <!-- 设置一个默认的连接环境信息,支持多数据源 -->
  17. <environments default="mysql_env">
  18. <!-- 连接环境信息,取一个唯一的编号 -->
  19. <environment id="mysql_env">
  20. <!-- mybatis使用的jdbc事务管理方式 -->
  21. <transactionManager type="jdbc">
  22. </transactionManager>
  23.  
  24. <!-- mybatis使用连接池方式来获取链接 -->
  25. <dataSource type="pooled">
  26. <!-- 配置与数据库交互的四个属性 -->
  27. <property name="driver" value="${mysql.driver}"/>
  28. <property name="url" value="${mysql.url}"/>
  29. <property name="username" value="${mysql.username}"/>
  30. <property name="password" value="${mysql.password}"/>
  31. </dataSource>
  32. </environment>
  33. </environments>

  34. <mappers>
  35. <mapper resource="com/jyk/mybatis/StudentMapper.xml"/>
  36. </mappers>
  37.  
  38. </configuration>

  步骤3.编写需要操作的实体类com.jyk.mybatis.Student记录学生信息

  1. package com.jyk.mybatis;
  2.  
  3. public class Student {
  4.  
  5. private String id;
  6. private String name;
  7. private String age;
  8. private String sex;
  9.  
  10. public String getId() {
  11. return id;
  12. }
  13. public void setId(String id) {
  14. this.id = id;
  15. }
  16. public String getName() {
  17. return name;
  18. }
  19. public void setName(String name) {
  20. this.name = name;
  21. }
  22. public String getAge() {
  23. return age;
  24. }
  25. public void setAge(String age) {
  26. this.age = age;
  27. }
  28. public String getSex() {
  29. return sex;
  30. }
  31. public void setSex(String sex) {
  32. this.sex = sex;
  33. }
  34.  
  35. public Student(String id, String name, String age, String sex) {
  36. super();
  37. this.id = id;
  38. this.name = name;
  39. this.age = age;
  40. this.sex = sex;
  41. }
  42.  
  43. public Student() {
  44. super();
  45. }
  46. }

  步骤4.配置StudentMapper.xml,配置namespace,需要唯一,一般以需要操作的实体类全路径为准,也可为其他值。然后是配置实体类与实际表的映射关系resultMap,type属性:实体全路径名,可在mybatis.xml文件中统一配置,如在上述mybatis.xml中已配置<typeAlias type="com.jyk.mybatis.Student" alias="student"/>,则此处实体类全路径可用student代替

  注:当实体属性名与表字段名不一样时,此处信息必配,若一致,则此处配置可选。

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  4.  
  5. <!-- 名称空间namespace必须唯一 -->
  6. <mapper namespace="studentNamespace">
  7.  
  8. <!--
  9. resultMap标签:映射实体与表,非主键属性标签
  10. type属性:实体全路径名,可在mybatis.xml文件中统一配置
  11. id属性:为实体与表的映射取一个唯一的编号
  12. -->
  13. <resultMap type="student" id="studentMap">
  14. <!--
  15. id标签:映射主键属性
  16. result标签:映射非主键属性
  17. property属性:实体属性名
  18. column属性:表的字段名
  19. -->
  20. <id property="id" column="id"/>
  21. <result property="name" column="name"/>
  22. <result property="age" column="age"/>
  23. <result property="sex" column="sex"/>
  24. </resultMap>
  25.  
  26. </mapper>

  步骤5.编写Mybatis通用工具类,通过Reader对象读取src目录下的mybatis.xml配置文件,并测试连接

  1. package com.jyk.mybatis.util;
  2.  
  3. import java.io.IOException;
  4. import java.io.Reader;
  5. import java.sql.Connection;
  6.  
  7. import org.apache.ibatis.io.Resources;
  8. import org.apache.ibatis.session.SqlSession;
  9. import org.apache.ibatis.session.SqlSessionFactory;
  10. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  11.  
  12. /*
  13. * MyBatis工具类
  14. */
  15. public class MyBatisUtil {
  16.  
  17. private static ThreadLocal<SqlSession> threadLocal = new
  18. ThreadLocal<SqlSession>();
  19. private static SqlSessionFactory sqlSessionFactory;
  20.  
  21. //静态块加载src目录下的mybatis配置文件
  22. static{
  23. try {
  24. Reader reader = Resources.getResourceAsReader("mybatis.xml");
  25. sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
  26. } catch (IOException e) {
  27. e.printStackTrace();
  28. }
  29. }
  30.  
  31. /*
  32. * 禁止外界通过new方法创建
  33. */
  34. private MyBatisUtil(){}
  35.  
  36. /*
  37. * 获取sqlsession
  38. */
  39. public static SqlSession getSqlSession()
  40. {
  41. //从当前线程中获取sqlSession对象
  42. SqlSession sqlSession = threadLocal.get();
  43.  
  44. //判断SqlSession对象是否为空
  45. if(sqlSession==null)
  46. {
  47. //在SqlSessionFactory对象非空的情况下,获取SqlSession对象
  48. sqlSession = sqlSessionFactory.openSession();
  49. //将SqlSession对象与当前线程绑定在一起
  50. threadLocal.set(sqlSession);
  51. }
  52.  
  53. return sqlSession;
  54. }
  55.  
  56. /*
  57. * 关闭sqlsession与当前线程分开
  58. */
  59. public static void closeSqlSession()
  60. {
  61. //从当前线程中获取SqlSession对象
  62. SqlSession sqlSession = threadLocal.get();
  63.  
  64. if(sqlSession != null)
  65. {
  66. //关闭SqlSession对象
  67. sqlSession.close();
  68. //分开当前线程与SqlSession对象的关系,目的是尽早进行垃圾回收
  69. threadLocal.remove();
  70. }
  71. }
  72.  
  73. /*
  74. * 测试方法
  75. */
  76. public static void main(String[] args) {
  77. Connection conn = MyBatisUtil.getSqlSession().getConnection();
  78. if(conn==null)
  79. {
  80. System.out.println("连接为空");
  81. }
  82. else
  83. {
  84. System.out.println("连接不为空");
  85. }
  86. }
  87. }

  步骤6.编写CRUD语句,在mapper文件中编写,此处编写在上述已经配置好实体类映射的StudentMapper.xml文件中

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  4.  
  5. <!-- 名称空间namespace必须唯一 -->
  6. <mapper namespace="studentNamespace">
  7.  
  8. <!--
  9. resultMap标签:映射实体与表
  10. type属性:实体全路径名
  11. id属性:为实体与表的映射取一个唯一的编号
  12. -->
  13. <resultMap type="student" id="studentMap">
  14. <!--
  15. id标签:映射主键属性
  16. result标签:映射非主键属性
  17. property属性:实体属性名
  18. column属性:表的字段名
  19. -->
  20. <id property="id" column="id"/>
  21. <result property="name" column="name"/>
  22. <result property="age" column="age"/>
  23. <result property="sex" column="sex"/>
  24. </resultMap>
  25.  
  26. <!--
  27. insert标签:sql插入语句
  28. id属性:该sql语句的唯一标签
  29. parameterType:要执行的dao中的方法的参数,如果是类的话,必须使用全路径名
  30. #{xx}:mybatis特有语法,用来替代jdbc中的?占位符
  31. -->
  32. <insert id="add1">
  33. insert into student(id,name,age,sex) values("1","admin","22","男")
  34. </insert>
  35.  
  36. <insert id="add2" parameterType="student">
  37. insert into student(id,name,age,sex) values(#{id},#{name},#{age},#{sex})
  38. </insert>
  39.  
  40. <!-- <insert id="add3" parameterType="student">
  41. insert into student(id,name,age,sex) values(#{id},#{name},#{age},#{sex})
  42. </insert> -->
  43. </mapper>

  步骤7.编写DAO,利用上述配置完成的文件和写好的通用工具类MyBatisUtil对学生信息进行增删该查

  1. package com.jyk.mybatis;
  2.  
  3. import org.apache.ibatis.session.SqlSession;
  4.  
  5. import com.jyk.mybatis.util.MyBatisUtil;
  6.  
  7. public class StudentDao {
  8.  
  9. /*
  10. * 增加的方法1
  11. */
  12. public void add1()
  13. {
  14. SqlSession sqlSession = null;
  15. try{
  16. sqlSession = MyBatisUtil.getSqlSession();
  17. //事务开始(默认)
  18.  
  19. //读取StudentMapper.xml配置文件中的sql语句,对应的sql语句由{名称空间.sql的id指定}
  20. int i = sqlSession.insert("studentNamespace.add1");
  21. System.out.println("本次操作影响了"+i+"行数据");
  22.  
  23. //事务提交
  24. sqlSession.commit();
  25. }catch(Exception e){
  26. e.printStackTrace();
  27. //事务回滚
  28. sqlSession.rollback();
  29. throw e;
  30. }finally{
  31. MyBatisUtil.closeSqlSession();
  32. }
  33. }
  34.  
  35. /*
  36. * 增加的方法2
  37. */
  38. public void add2(Student stu)
  39. {
  40. SqlSession sqlSession = null;
  41. try{
  42. sqlSession = MyBatisUtil.getSqlSession();
  43. //事务开始(默认)
  44.  
  45. //读取StudentMapper.xml配置文件中的sql语句
  46. int i = sqlSession.insert("studentNamespace.add2",stu);
  47. System.out.println("本次操作影响了"+i+"行数据");
  48.  
  49. //事务提交
  50. sqlSession.commit();
  51. }catch(Exception e){
  52. e.printStackTrace();
  53. //事务回滚
  54. sqlSession.rollback();
  55. throw e;
  56. }finally{
  57. MyBatisUtil.closeSqlSession();
  58. }
  59. }
  60.  
  61. /*
  62. * 增加的方法3
  63. * 往数据库添加记录必须要添加事务,没有事务添加不进去
  64. */
  65. public void add3(Student stu)
  66. {
  67. SqlSession sqlSession = null;
  68. try{
  69. sqlSession = MyBatisUtil.getSqlSession();
  70. //事务开始(默认)
  71.  
  72. //读取StudentMapper.xml配置文件中的sql语句
  73. int i = sqlSession.insert("studentNamespace.add3",stu);
  74. System.out.println("本次操作影响了"+i+"行数据");
  75. sqlSession.commit();
  76. }catch(Exception e){
  77. e.printStackTrace();
  78. //事务回滚
  79. sqlSession.rollback();
  80. throw e;
  81. }finally{
  82. MyBatisUtil.closeSqlSession();
  83. }
  84. }
  85.  
  86. public static void main(String[] args) {
  87. StudentDao sd = new StudentDao();
  88. sd.add1();
  89. sd.add2(new Student("64","kaiye","23","男"));
  90. }
  91. }

Mybatis入门和简单Demo的更多相关文章

  1. Mybatis 入门 -- 最简单的引入和使用

    参考:http://www.mybatis.org/mybatis-3/zh/getting-started.html 从今天开始学习官方文档. 1.项目搭建 项目结构: 首先,搭建一个maven项目 ...

  2. springboot入门之简单demo

    项目构建 我们采用maven构建SpringBoot工程,首先创建一个maven工程,对应的pom文件如下: <properties> <java.version>1.8< ...

  3. 【Dubbo】Dubbo+ZK基础入门以及简单demo

    参考文档: 官方文档:http://dubbo.io/ duboo中文:https://dubbo.gitbooks.io/dubbo-user-book/content/preface/backgr ...

  4. Java Persistence with MyBatis 3(中文版) 第一章 MyBatis入门

    本章将涵盖以下话题: ž  MyBatis是什么? ž  为什么选择MyBatis? ž  MyBatis安装配置 ž  域模型样例 1.1 MyBatis是什么 MyBatis是一个简化和实现了Ja ...

  5. Mybatis入门DEMO

    下面将通过以下步骤说明如何使用MyBatis开发一个简单的DEMO: 步骤一:新建表STUDENTS 字段有: Stu_Id.Stu_Name.Stu_Age.Stu_Birthday CREATE ...

  6. 服务网关Ocelot 入门Demo系列(01-Ocelot极简单Demo及负载均衡的配置)

    [前言] Ocelot是一个用.NET Core实现并且开源的API网关,它功能强大,包括了:路由.请求聚合.服务发现.认证.鉴权.限流熔断.并内置了负载均衡器与Service Fabric.Butt ...

  7. Mybatis入门案例中设计模式的简单分析

    Talk is cheap, show me the code! public class TestMybatis { public static void main(String[] args) t ...

  8. MyBatis - 介绍、简单入门程序

    JDBC编程中的问题     1. 将SQL语句硬编码到Java代码,不利于系统维护.         设想如何解决:将SQL单独抽取出来,在配置文件(xml方式.properties文件)进行配置. ...

  9. 写给新手看的 MyBatis 入门

    目录 MyBatis 使用前的准备 什么是 MyBatis 使用Maven 进行 MyBatis 开发环境搭建 MyBatis 入门 项目整体结构一览 MyBatis 的简单生命周期 1.获取 Sql ...

随机推荐

  1. mysql中什么是物理备份?

    需求描述: 今天在看数据库备份,恢复的内容,就是对于一个概念,物理备份的理解,在这里记录下. 概念解释: 物理备份:就是对存储数据库内容的目录和文件的直接拷贝.简单来说,就是对物理文件的拷贝. 文档创 ...

  2. BaiduMap 鼠标绘制矩形选框四个顶角坐标的获取

    雪影工作室版权全部.转载请注明[http://blog.csdn.net/lina791211] 1.博文产生原因 在使用百度Map开放API进行开发的时候,遇到了一个需求,非常easy的一个需求. ...

  3. HDU 2594 Simpsons’ Hidden Talents (KMP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2594 这题直接用KMP算法就能够做出来,只是我还尝试了用扩展的kmp,这题用扩展的KMP效率没那么高. ...

  4. 上传绕过WAF的tips大全

    原始默认状态: ——WebKitFormBoundary2smpsxFB3D0KbA7D Content-Disposition: form-data; name=”filepath”; filena ...

  5. 事件和winform的学习

             记得现在已经不在学习winform啦,可是我们为什么还是学习啦,我感觉就是帮助我们往下一个层次进发啦,因为从控制台直接开始进入webform的学习,我们很难接受啦,估计效率也不高啦, ...

  6. 学习C#基础知识这段时间

    似乎穿越的感觉,我又来到了这周的周五,总是在周五,知道了时间的概念,上午会讲课,但是在下午就是一个总结小练习,上午老师给我们讲了委托,在听课时间感觉很简单啊,哪里有难的地方啊,一直在好奇,老师在演示给 ...

  7. diff命令的参数详解和实例

    diff命令参数: diff - 找出两个文件的不同点 总览 diff [选项] 源文件 目标文件 描述 在最简单的情况是, diff 比较两个文件的内容 (源文件 和 目标文件). 文件名可以是 - ...

  8. poj_1037 动态规划+字典序第k大

    题目大意 给定n个数字,规定一种 cute 排序:序列中的数字大小为严格的波浪形,即 a[0] > a[1] < a[2] > a[3] < .... 或者 a[0] < ...

  9. javascript字符串函数

    substring() 从字符串中提取一些字符 <script type="text/javascript"> var str="Hello world!&q ...

  10. CRUX下实现进程隐藏(2)

    前面我们介绍了如何修改/proc目录读取函数的方法实现进程隐藏.这篇博文将介绍另一种方法—— 劫持系统调用实现进程隐藏. 其基本原理是:加载一个内核模块(LKM),通过劫持系统调用sys_getden ...