MyBatis是轻量级的数据库访问API,封装了JDBC操作,可以实现对实体对象的CRUD操作。

MyBatis体系结构主要组成部分:

   配置文件:SqlMapConfig.xml 主配置文件

   声明了数据库连接参数,引用了映射文件

   映射文件: 每个实体一个映射文件

   映射文件与 Mapper接口对应。

 

映射文件中:

  每个Mapper接口中的方法,对应映射文件中的SQL语句。

使用步骤:

使用MyBatis

 1 导入包

 2 创建配置文件

 3 创建实体和Mapper接口,已经映射文件

 4 使用 工厂创建SqlSession

 5 创建Mapper接口对象,执行接口方法

下面来详细介绍。

1),加载配置

两钟形式,一种是XML配置文件,另一种是JAVA代码的注解。

MyBatis将SQL的配置信息加载成为一个个的MappedStatement对象(包括了传入参数映射配置,执行的SQL语句,结果映射配置),并将其存储在内存中。

   A)SqlMapConfig.xml 

只有一个,用于配置数据库连接参数和框架参数。

Java代码  

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!--这段代码不能掉,否则出现异常-->
  3. <!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN"
  4. "http://ibatis.apache.org/dtd/ibatis-3-config.dtd">
  5. <configuration>
  6. <!--配置数据库连接 -->
  7. <environments default="environment">
  8. <environment id="environment">
  9. <transactionManager type="JDBC" />
  10. <dataSource type="POOLED">
  11. <property name="driver"
  12. value="oracle.jdbc.OracleDriver" />
  13. <property name="url"
  14. value="jdbc:oracle:thin:@localhost:1521:XE" />
  15. <property name="username" value="root" />
  16. <property name="password" value="root" />
  17. </dataSource>
  18. </environment>
  19. </environments>
  20. <!-- 引入 Dept.xml 配置 -->
  21. <mappers>
  22. <mapper resource="com/lydia/entity/Dept.xml"/>
  23. </mappers>
  24. </configuration>

    B) 实体类对应的映射文件

    Dept.xml ,该配置文件是映射Dept.java实体类的

Java代码  

  1. <!-- Dept.xml 在com.lydia.entity 包中  -->
  2. <!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
  3. "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
  4. <!-- namespace 的值是 DeptMapper 接口
  5. 每个Mapper 接口对应一个配置文件  -->
  6. <mapper
  7. namespace="com.lydia.entity.DeptMapper"> <!--此处的DeptMapper是我们封装的接口-->
  8. <insert id="addDept"
  9. parameterType="com.lydia.entity.Dept">
  10. <selectKey keyProperty="deptno"
  11. order="BEFORE"
  12. resultType="int">
  13. select SEQ_T_DEPT.nextval
  14. from DUAL
  15. </selectKey>
  16. insert into T_DEPT (deptno, dname,
  17. loc) values
  18. (#{deptno}, #{dname}, #{loc})
  19. </insert>
  20. <delete id="deleteDept"
  21. parameterType="com.lydia.entity.Dept">
  22. delete from T_DEPT
  23. where deptno = #{deptno}
  24. </delete>
  25. <select id="findDeptById"
  26. parameterType="java.lang.Integer"
  27. resultType="com.lydia.entity.Dept">
  28. select deptno,dname,loc
  29. from T_DEPT where deptno=#{deptno}
  30. </select>
  31. <update id="updateDept"
  32. parameterType="com.lydia.entity.Dept">
  33. <!-- #{deptno} 读取参数的Bean属性 -->
  34. update T_DEPT set dname=#{dname},
  35. loc = #{loc} where deptno=#{deptno}
  36. </update>
  37. <!-- 注意resultType 的值是List中元素类型
  38. 结果集行映射的数据类型-->
  39. <select id="findAllDept"
  40. resultType="com.lydia.entity.Dept">
  41. select deptno, dname, loc
  42. from T_DEPT
  43. </select>
  44. <select id="findDeptByLoc"
  45. parameterType="java.lang.String"
  46. resultType="com.lydia.entity.Dept">
  47. select deptno, dname, loc
  48. from T_DEPT where loc=#{loc}
  49. </select>
  50. <select id="findAllDname"
  51. parameterType="java.lang.String"
  52. resultType="java.util.Map">
  53. select dname from T_DEPT
  54. where loc=#{loc}
  55. </select>
  56. </mapper>

  

注意:这里特别要注意主键ID的处理。

本案例中使用Oracle,那么要先创建序列 CREATE SEQUENCE SEQ_T_DEPT;   然后使用<select-key>..

如果是MySQL 或者 DB2,主键ID是自动增长的,可以如下设置:

Java代码  

  1. <!-- 自增类型(MySql SqlServer DB2 Derby)-->
  2. <insert id="addDept" useGeneratedKeys="true"
  3. keyProperty="deptno"
  4. parameterType="com.tarean.entity.Dept">
  5. insert into T_DEPT(dname, loc)
  6. values (#{dname},#{loc})
  7. </insert>

2),SQL解析

当API接口层接收到调用请求时,会接收到传入SQL的ID和传入对象(可以是Map,JavaBean,基本数据类型))。MyBatis会根据SQL的ID找到对应的MappedStatement,然后根据传入参数对象对MappedStatement进行解析。解析后可以得到最终要执行的SQL和参数。

3),结果映射

将操作数据库的结果按照映射的配置进行转换。可以转换成HashMap,JavaBean或者基本数据类型,并最终将结果返回。

创建DeptMapper.java接口,该接口中封装了Dept.xml中指定的SQL方法。

Java代码  

  1. /**
  2. * Mapper接口,类似于Dao,但是语法有限定
  3. * 不能有重载
  4. * Mapper 定义实体Dept对象的CRUD操作
  5. *该类中的方法名必须和Dept.xml中SQL的id一致
  6. */

Java代码  

  1. public interface DeptMapper {
  2. void addDept(Dept dept);
  3. void deleteDept(Dept dept);
  4. void updateDept(Dept dept);
  5. Dept findDeptById(Integer deptno);
  6. List<Dept> findAllDept();
  7. List<Dept> findDeptByLoc(String loc);
  8. List<Map<String, Object>> findAllDname(
  9. String loc);
  10. }

MyBatis框架中设计到的几个API

SqlSessionFactoryBuilder

--该对象负责根据MyBatis配置文件SqlMapConfig.xml构建SqlSessionFactory实例

SqlSessionFactory

--每一个MyBatis的应用程序都以一个SqlSessionFactory对象为核心。该对象负责创建SqlSession对象实例。

SqlSession

--该对象包含了所有执行SQL操作的方法,用于执行已映射的SQL语句

TestCass.java类负责调用MyBatis中的基本API来操作数据库。

Java代码  

  1. package com.lydia.test;
  2. import java.io.Reader;
  3. import java.sql.Connection;
  4. import java.util.List;
  5. import java.util.Map;
  6. import org.apache.ibatis.io.Resources;
  7. import org.apache.ibatis.session.SqlSession;
  8. import org.apache.ibatis.session.SqlSessionFactory;
  9. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  10. import org.junit.Test;
  11. import com.lydia.entity.Dept;
  12. import com.lydia.entity.DeptMapper;
  13. public class TestCase {
  14. // @Test
  15. public void testSqlSession() throws Exception {
  16. String cfg = "SqlMapConfig.xml";
  17. Reader reader = Resources.getResourceAsReader(cfg);
  18. //创建builder对象
  19. SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
  20. SqlSessionFactory factory = builder.build(reader);
  21. //创建session
  22. SqlSession session = factory.openSession();
  23. Connection conn = session.getConnection();
  24. System.out.println(conn);
  25. System.out.println(conn.getMetaData().getDatabaseProductName());
  26. conn.close();
  27. session.close();
  28. }
  29. @Test
  30. public void testAddDept() throws Exception {
  31. String cfg = "SqlMapConfig.xml";
  32. Reader reader = Resources.getResourceAsReader(cfg);
  33. SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
  34. SqlSessionFactory factory = builder.build(reader);
  35. SqlSession session = factory.openSession();
  36. //      +++++++++++++++++++++++++++++++++++++++
  37. // 通过Mapper映射器去执行SQL
  38. // DeptMapper mapper =
  39. // session.getMapper(DeptMapper.class);
  40. // Dept dept = new Dept("C++","武汉");
  41. // mapper.addDept(dept);
  42. // System.out.println(dept);
  43. //      +++++++++++++++++++++++++++++++++++++++
  44. // 通过session去执行SQL
  45. Dept dept = new Dept("C++", "武汉");
  46. session.insert("addDept", dept);
  47. //      +++++++++++++++++++++++++++++++++++++++
  48. session.commit();
  49. session.close();
  50. }
  51. // @Test
  52. public void testDelete() throws Exception {
  53. String cfg = "SqlMapConfig.xml";
  54. Reader reader = Resources.getResourceAsReader(cfg);
  55. SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
  56. SqlSessionFactory factory = builder.build(reader);
  57. SqlSession session = factory.openSession();
  58. DeptMapper mapper = session.getMapper(DeptMapper.class);
  59. Dept dept = mapper.findDeptById(2);
  60. mapper.deleteDept(dept);
  61. System.out.println(dept);
  62. Dept d = mapper.findDeptById(2);
  63. System.out.println(d);
  64. session.commit();
  65. session.close();
  66. }
  67. @Test
  68. public void testFindAll() throws Exception {
  69. String cfg = "SqlMapConfig.xml";
  70. Reader reader = Resources.getResourceAsReader(cfg);
  71. SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
  72. SqlSessionFactory factory = builder.build(reader);
  73. SqlSession session = factory.openSession();
  74. DeptMapper mapper = session.getMapper(DeptMapper.class);
  75. List<Dept> list = mapper.findAllDept();
  76. for (Dept dept : list) {
  77. System.out.println(dept);
  78. }
  79. session.close();
  80. }
  81. // @Test
  82. public void testUpdate() throws Exception {
  83. String cfg = "SqlMapConfig.xml";
  84. Reader reader = Resources.getResourceAsReader(cfg);
  85. SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
  86. SqlSessionFactory factory = builder.build(reader);
  87. SqlSession session = factory.openSession();
  88. DeptMapper mapper = session.getMapper(DeptMapper.class);
  89. Dept d = mapper.findDeptById(4);
  90. d.setDname("PHP");
  91. d.setLoc("苏州桥");
  92. mapper.updateDept(d);
  93. List<Dept> list = mapper.findAllDept();
  94. for (Dept dept : list) {
  95. System.out.println(dept);
  96. }
  97. session.commit();
  98. session.close();
  99. }
  100. // @Test
  101. public void testMap() throws Exception {
  102. String cfg = "SqlMapConfig.xml";
  103. Reader reader = Resources.getResourceAsReader(cfg);
  104. SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
  105. SqlSessionFactory factory = builder.build(reader);
  106. SqlSession session = factory.openSession();
  107. DeptMapper mapper = session.getMapper(DeptMapper.class);
  108. List<Map<String, Object>> list = mapper.findAllDname("苏州桥");
  109. System.out.println(list);
  110. session.close();
  111. }
  112. @Test
  113. public void testPage() throws Exception {
  114. String cfg = "SqlMapConfig.xml";
  115. SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
  116. Reader reader = Resources.getResourceAsReader(cfg);
  117. SqlSessionFactory factory = builder.build(reader);
  118. SqlSession session = factory.openSession();
  119. //+++++++++++++++++++++++++++++++++++++
  120. RowBounds bounds = new RowBounds(0, 2);
  121. //此处用的selectList(arg1,arg2,arg3); 中间arg2参数不要掉
  122. List<Dept> list = session.selectList("findAllDept",null, bounds);
  123. for (Dept dept : list) {
  124. System.out.println(dept);
  125. }
  126. session.commit();
  127. session.close();
  128. //+++++++++++++++++++++++++++++++++++++
  129. }
  130. }

注意:上面调用CRUD的操作方法也可以使用以下的代替

Java代码  

  1. String cfg = "SqlMapConfig.xml";
  2. Reader reader =
  3. Resources.getResourceAsReader(cfg);
  4. SqlSessionFactoryBuilder builder=
  5. new SqlSessionFactoryBuilder();
  6. SqlSessionFactory factory =
  7. builder.build(reader);
  8. SqlSession session =
  9. factory.openSession();
  10. Dept dept = new Dept("C++","武汉");
  11. session.insert("addDept", dept);
  12. session.commit();
  13. session.close();

   

 ResultMap映射定义:

在Dept.xml中定义<select>操作时,如果查询结果字段名和javaBean属性不一致,需要使用<resultMap>元素显示指定映射关系。例如Dept.java中的属性是 no,name,loc,那么应该如下配置:

Java代码  

  1. <select id ="findAll2" resultMap="deptMap">
  2. select DEPTNO,DNAME,LOC from DEPT
  3. </select>
  4. <resultMap id = "deptMap" type="com.lydia.Dept">
  5. <result property="no" column="deptno"/>
  6. <result property="name" column="dname"/>
  7. <result property="loc" column="loc"/>
  8. </resultMap>

MyBatis基本使用的更多相关文章

  1. 【分享】标准springMVC+mybatis项目maven搭建最精简教程

    文章由来:公司有个实习同学需要做毕业设计,不会搭建环境,我就代劳了,顺便分享给刚入门的小伙伴,我是自学的JAVA,所以我懂的.... (大图直接观看显示很模糊,请在图片上点击右键然后在新窗口打开看) ...

  2. Java MyBatis 插入数据库返回主键

    最近在搞一个电商系统中由于业务需求,需要在插入一条产品信息后返回产品Id,刚开始遇到一些坑,这里做下笔记,以防今后忘记. 类似下面这段代码一样获取插入后的主键 User user = new User ...

  3. [原创]mybatis中整合ehcache缓存框架的使用

    mybatis整合ehcache缓存框架的使用 mybaits的二级缓存是mapper范围级别,除了在SqlMapConfig.xml设置二级缓存的总开关,还要在具体的mapper.xml中开启二级缓 ...

  4. 【SSM框架】Spring + Springmvc + Mybatis 基本框架搭建集成教程

    本文将讲解SSM框架的基本搭建集成,并有一个简单demo案例 说明:1.本文暂未使用maven集成,jar包需要手动导入. 2.本文为基础教程,大神切勿见笑. 3.如果对您学习有帮助,欢迎各种转载,注 ...

  5. mybatis plugins实现项目【全局】读写分离

    在之前的文章中讲述过数据库主从同步和通过注解来为部分方法切换数据源实现读写分离 注解实现读写分离: http://www.cnblogs.com/xiaochangwei/p/4961807.html ...

  6. MyBatis基础入门--知识点总结

    对原生态jdbc程序的问题总结 下面是一个传统的jdbc连接oracle数据库的标准代码: public static void main(String[] args) throws Exceptio ...

  7. Mybatis XML配置

    Mybatis常用带有禁用缓存的XML配置 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE ...

  8. MyBatis源码分析(一)开篇

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

  9. (整理)MyBatis入门教程(一)

    本文转载: http://www.cnblogs.com/hellokitty1/p/5216025.html#3591383 本人文笔不行,根据上面博客内容引导,自己整理了一些东西 首先给大家推荐几 ...

  10. MyBatis6:MyBatis集成Spring事物管理(下篇)

    前言 前一篇文章<MyBatis5:MyBatis集成Spring事物管理(上篇)>复习了MyBatis的基本使用以及使用Spring管理MyBatis的事物的做法,本文的目的是在这个的基 ...

随机推荐

  1. day13-迭代器及生成器

    iterable:可迭代的:iterator:迭代器: print(dir([ ]))  #打印出列表所拥有的所有方法: 可迭代协议:只要含有__iter__方法的都是可迭代的. 迭代器协议:含有__ ...

  2. jquery 第五章 jQuery操作表单与表格

    1.回顾 对象.bind("事件名称",function(){ // }) 阻止冒泡事件 return false,   event stopProapagation() 模拟事件 ...

  3. Postman 安装及使用入门教程(我主要使用接口测试)

    1.Postman 安装及使用入门教程(我主要使用接口测试)Postman的English官网:https://www.getpostman.com/chrome插件整理的Postman中文使用教程( ...

  4. “System.FormatException”类型的未经处理的异常在 System.IdentityModel.dll 中发生 其他信息: 十六进制字符串格式无效。

    如果你的 WebService 客户端证书配置都没问题,唯独调用接口会出现这个错误 “System.FormatException”类型的未经处理的异常在 System.IdentityModel.d ...

  5. 无法执行该VI,必须使用LabVIEW完整版开发系统才可以解决该错误

    该错误99%是因为你在某个vi中使用了外部系统组件,比如api,.net组件,ActiveX组件,com组件,所有不是Labview原生的接口,在你打包后,在其他没有安装这些组件的电脑上运行,就会出现 ...

  6. 如何手写Ajax实现异步刷新

    所谓的异步刷新,就是不刷新整个网页进行更新数据. 只有通过js才能实现Ajax,进而实行异步刷新 表单提交数据和Ajax提交数据的区别:表单提交是提交的整个页面中的数据,提交数据之后会抛弃之前的页面( ...

  7. Crypto支付宝模块的安装

    沙箱环境地址:https://openhome.alipay.com/platform/appDaily.htm?tab=info 1.将Crypto放到site-packages下 2.OSErro ...

  8. Windows API教程文件系统

    本篇文章主要介绍了"Windows API教程文件系统",主要涉及到Windows API教程文件系统方面的内容,对于Windows API教程文件系统感兴趣的同学可以参考一下. ...

  9. JZOJ5431 捕老鼠

    JZOJ 5341 Description 为了加快社会主义现代化,建设新农村,农夫约(Farmer Jo)决定给农庄里的仓库灭灭鼠.于是,猫被农夫约派去捕老鼠. 猫虽然擅长捕老鼠,但是老鼠们太健美了 ...

  10. 图片懒加载、selenium和PhantomJS

    1.图片懒加载 1.1 概念及实现原理 图片懒加载是一种网页优化技术.图片作为一种网络资源,在被请求时也与普通静态资源一样,将占用网络资源,而一次性将整个页面的所有图片加载完, 将大大增加页面的首屏加 ...