一、MyBatis相关概念

  1. 对象 / 关系数据库映射(ORM)

    • ORM全称Object/Relation Mapping:表示对象-关系映射的缩写
    • ORM完成⾯向对象的编程语⾔到关系数据库的映射。当ORM框架完成映射后,程序员既可以利⽤⾯向对象程序设计语⾔的简单易⽤性,⼜可以利⽤关系数据库的技术优势。ORM把关系数据库包装成⾯向对象的模型。ORM框架是⾯向对象设计语⾔与关系数据库发展不同步时的中间解决⽅案。采⽤ORM框架后,应⽤程序不再直接访问底层数据库,⽽是以⾯向对象的放松来操作持久化对象,⽽ORM框架则将这些⾯向对象的操作转换成底层SQL操作。ORM框架实现的效果:把对持久化对象的保存、修改、删除等操作,转换为对数据库的操作
  2. Mybatis 简介
    • MyBatis是⼀款优秀的基于ORM的半⾃动轻量级持久层框架,它⽀持定制化SQL、存储过程以及⾼级映射。MyBatis避免了⼏乎所有的JDBC代码和⼿动设置参数以及获取结果集。MyBatis可以使⽤简单的XML或注解来配置和映射原⽣类型、接⼝和 Java 的 POJO (Plain Old Java Objects,普通⽼式Java对 象)为数据库中的记录。
  3. Mybatis 优势
    • Mybatis是⼀个半⾃动化的持久层框架,对开发⼈员开说,核⼼sql还是需要⾃⼰进⾏优化,sql和java编码进⾏分离,功能边界清晰,⼀个专注业务,⼀个专注数据。

二、MyBatis基本使用

不做赘述,有需要的小伙伴可关注公众号......

三、MyBatis 配置文件

1. 核心配置文件

MyBatis 核心配置文件层级关系

environments 标签

数据库环境的配置,支持多环境配置

其中,事务管理器(transactionManager)类型有两种

  • JDBC:这个配置就是直接使用了 JDBC 的提交和回滚设置,它依赖于从数据源得到的链接来管理事务作用域
  • MANAGED:此配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将 closeConnection 属性设置为 false 来阻止它默认的关闭行为

其中,数据源(DataSource)类型有三种:

  • UNPOOLED:这个数据源的实现只是每次被请求时打开和关闭连接
  • POOLED:这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来
  • JNDI:这个数据源的实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用

mapper

该标签的作用是加载映射,加载方式有下面几种

  • 使用相对于类路径的资源引用:

    1. <mapper resource="mapper/UserMapper.xml"></mapper>
  • 使用完全限定资源定位符(URL):

    1. <mapper url="file:///var/mappers/UserMapper.xml"/>
  • 使用映射器接口实现类的完全限定类名:

    1. <mapper class="com.mfc.dao.UserDao"/>
  • 将包内的映射器接口实现全部注册为映射器:

    1. <package name="com.mfc.dao"/>

properties 标签

实际开发中,习惯将数据源的配置信息单独抽取成一个 properties 文件,该标签可以加载额外配置的 properties 文件

typeAliases 标签

类型别名是为 Java 类型设置一个短的名字。原来的类型名称如下:

配置 typeAliases ,为 com.mfc.entity.User 定义别名为 user

  • 方法一:使用 typeAlias 标签取别名

  • 方法二:使用 package 标签取别名。给实体类所在的包下面的所有实体类取别名,别名就是类名,并且不区分大小写

上面是程序员可以自定义的别名,Mybatis 框架已经为我们设置好了一些常用的别名

2. 映射配置文件

2.1 动态SQL

MyBatis 的映射文件中,前面我们使用的 SQL 都比较简单,有些时候业务逻辑复杂时,SQL 会是动态变化的,此时前面那些简单的 SQL 就不能满足要求了

动态 SQL 之 标签

根据实体类的不同取值,使用不同的 SQL 语句来进行查询。比如 id 不为空的时候,可以根据 id 查询,username 不为空的时候,可以根据 username 查询。这种情况通常在多条件组合查询中遇到

  1. <mapper namespace="com.mfc.dao.UserDao">
  2. <select id="selectList" resultType="com.mfc.entity.User" parameterType="com.mfc.entity.User">
  3. select * from user
  4. <where>
  5. <if test="id != 0">
  6. and id = #{id}
  7. </if>
  8. <if test="username != null">
  9. and username = #{username}
  10. </if>
  11. </where>
  12. </select>
  13. </mapper>

动态 SQL 之 标签

标签的属性含义:

  • collection:代表要遍历的几何元素,注意编写时不要写 #{}
  • open:代表语句的开始部分
  • close:代表语句的结束部分
  • item:代表遍历集合的每个元素,生成的变量名
  • sperator:代表分隔符

标签使用:

  1. <mapper namespace="com.mfc.dao.UserDao">
  2. <select id="findByIds" parameterType="list" resultType="com.mfc.entity.User">
  3. select * from user
  4. <where>
  5. <foreach collection="array" open="id in(" close=")" item="id" separator=",">
  6. #{id}
  7. </foreach>
  8. </where>
  9. </select>
  10. </mapper>
2.2 SQL 片段抽取

Sql 中可以将重复的 Sql 提取出来,使用时用 include 引用即可,最终达到 SQL 重用的目的

四、MyBatis 映射

1. 一对一

实体类

  1. public class Orders {
  2. private Integer id;
  3. private String ordertime;
  4. private Double total;
  5. private User user;
  6. // set、get、toString 方法省略。。。
  7. }
  1. public class User {
  2. private Integer id;
  3. private String username;
  4. // set、get、toString 方法省略。。。
  5. }

映射文件

  1. <mapper namespace="com.mfc.dao.OrdersDao">
  2. <resultMap id="orderMap" type="com.mfc.entity.Orders">
  3. <result property="id" column="id"></result>
  4. <result property="ordertime" column="ordertime"></result>
  5. <result property="total" column="total"></result>
  6. <association property="user" javaType="com.mfc.entity.User">
  7. <id property="id" column="uid"></id>
  8. <result property="username" column="username"></result>
  9. </association>
  10. </resultMap>
  11. <select id="selectOrders" resultMap="orderMap">
  12. select * from orders o,user u where o.uid=u.id
  13. </select>
  14. </mapper>

2. 一对多

实体类

  1. public class Orders {
  2. private Integer id;
  3. private String ordertime;
  4. private Double total;
  5. private Integer uid;
  6. // set、get、toString 方法省略。。。
  7. }
  1. public class User {
  2. private Integer id;
  3. private String username;
  4. private List<Orders> orders = new ArrayList<>();
  5. // set、get、toString方法省略。。。
  6. }

映射文件

  1. <mapper namespace="com.mfc.dao.UserDao">
  2. <resultMap id="userMap" type="com.mfc.entity.User">
  3. <result property="id" column="id"></result>
  4. <result property="username" column="username"></result>
  5. <collection property="orders" ofType="com.mfc.entity.Orders">
  6. <id property="id" column="oid"></id>
  7. <result property="ordertime" column="ordertime"></result>
  8. <result property="total" column="total"></result>
  9. </collection>
  10. </resultMap>
  11. <select id="selectUser" resultMap="userMap">
  12. select *,o.id oid from user u left join orders o on o.uid=u.id
  13. </select>
  14. </mapper>

3. 多对多

实体类

  1. public class User {
  2. private Integer id;
  3. private String username;
  4. private List<Role> roles = new ArrayList<>();
  5. // set、get、toString方法省略。。。
  6. }
  1. public class Role {
  2. private Integer id;
  3. private String rolename;
  4. // set、get、toString方法省略。。。
  5. }

映射文件

  1. <mapper namespace="com.mfc.dao.UserDao">
  2. <resultMap id="userMap" type="com.mfc.entity.User">
  3. <result property="id" column="id"></result>
  4. <result property="username" column="username"></result>
  5. <collection property="roles" ofType="com.mfc.entity.Role">
  6. <id property="id" column="rid"></id>
  7. <result property="rolename" column="rolename"></result>
  8. </collection>
  9. </resultMap>
  10. <select id="selectUser" resultMap="userMap">
  11. SELECT
  12. u.*, r.id rid,
  13. r.rolename rolename
  14. FROM
  15. USER u
  16. LEFT JOIN user_role ur ON u.id = ur.uid
  17. INNER JOIN role r ON ur.rid = r.id
  18. </select>
  19. </mapper>

MyBatis 使用(XML版本)的更多相关文章

  1. spring boot 整合mybatis 的xml版本【包括逆向工程以及分页插件】

    逆向工程很方便,可以直接根据数据库和配置文件生成pojo,mapper接口和相应的映射文件. xml版本和全注解版本其实差不多,大部分情况下,都会保留xml文件方便其他人去扩展新的dml方法. 文章旨 ...

  2. springboot使用之二:整合mybatis(xml方式)并添加PageHelper插件

    整合mybatis实在前面项目的基础上进行的,前面项目具体整合请参照springboot使用之一. 一.整合mybatis 整合mybatis的时候可以从mybatis官网下载mybatis官网整合的 ...

  3. Java DB 访问之 mybatis mapper xml 配置方式

    1 项目说明 项目采用 maven 组织 ,jdbc 唯一的依赖就是 mysql-connector-java pom 依赖如下: mysql 数据连接 : mysql-connector-java ...

  4. 【mybatis xml】数据层框架应用--Mybatis 基于XML映射文件实现数据的CRUD

    使用MyBatis框架进行持久层开发 MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架. MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索. MyBa ...

  5. Mybatis系列全解(四):全网最全!Mybatis配置文件XML全貌详解

    封面:洛小汐 作者:潘潘 做大事和做小事的难度是一样的.两者都会消耗你的时间和精力,所以如果决心做事,就要做大事,要确保你的梦想值得追求,未来的收获可以配得上你的努力. 前言 上一篇文章 <My ...

  6. MyBatis Mapper.xml文件中 $和#的区别

    MyBatis Mapper.xml文件中 $和#的区别   网上有很多,总之,简略的写一下,作为备忘.例子中假设参数名为 paramName,类型为 VARCHAR . 1.优先使用#{paramN ...

  7. mybatis 与 xml

    mybatis的两大重要组件:配置和映射文件,都是可以通过xml配置的(新版本新增了注解的方式配置Mapper),下面来解析下mybatis是怎么做的 其中,关于配置文件解析的主要是在这个类XMLCo ...

  8. mybatis mapper.xml 配置文件问题(有的错误xml是不报的) 导致服务无法启动 。

    转载自 开源编程 一舟mybatsi xml编译报错,tomcat启动一直循环,导致内存溢出,启动失败 mapper.xml怎么知道有没有编译错误,哪个位置有错误 这应该是mybatis的一个bug, ...

  9. mybatis的xml文件中如何处理大小于号

    在mybatis的xml配置文件中会遇到大小于号转化的问题,解决问题的方法如下: 1.用转义字符把>和<替换掉 SELECT * FROM test WHERE AND start_dat ...

随机推荐

  1. mysql加强(4)~多表查询

    mysql加强(4)~多表查询:笛卡尔积.消除笛卡尔积操作(等值.非等值连接),内连接(隐式连接.显示连接).外连接.自连接 一.笛卡尔积 1.什么是笛卡尔积: 数学上,有两个集合A={a,b},B= ...

  2. TCP Wrappers

    TCP Wrappers 是 RHEL 7 系统中默认启用的一款流量监控程序,它能够根据来访主机的地址与本机的目标服务程序作出允许或拒绝的操作.换句话说,Linux 系统中其实有两个层面的防火墙,第一 ...

  3. Java 书写规范简单整理

    本文带有华为Logo的PPT图片,引自:华为云课堂 目录 Java基础语句使用规范 选择结构 switch 默认要有default分支 注意break的使用 如果使用枚举,并且选项已全部列出,可以没有 ...

  4. JavaScript检查Date对象是否为Invalid Date

    使用Date()构造日期对象,如果传入非日期格式的字符串,仍然能构造出Date对象. 在chrome控制台 >var date = new Date("hello"); &g ...

  5. 深入解析HashMap、HashTable (转)

    集合类之番外篇:深入解析HashMap.HashTable Java集合类是个非常重要的知识点,HashMap.HashTable.ConcurrentHashMap等算是集合类中的重点,可谓&quo ...

  6. Sping高质量博文链接集合

    1. Spring事务传播行为详解 https://segmentfault.com/a/1190000013341344

  7. shell脚本一键部署——Redis(直接复制执行)亲测100% 有效

    首先所需软件包拖进目录,然后编辑一个脚本,复制一下脚本,source执行一下即可 #!/bin/bash echo -e "\033[31m =====正在验证当前为仅主机还是NAT模式== ...

  8. Hyperledger Fabric 2.x 自定义智能合约

    一.说明 为了持续地进行信息的更新,以及对账本进行管理(写入交易,进行查询等),区块链网络引入了智能合约来实现对账本的访问和控制:智能合约在 Fabric 中称之为 链码,是区块链应用的业务逻辑. 本 ...

  9. 2、网络并发编程--套接字编程、黏包问题、struct模块、制作简易报头、上传文件数据

    昨日内容回顾 面向对象复习(json序列化类) 对象.类.父类的概念 三大特性:封装 继承 多态 双下开头的方法(达到某个条件自动触发) __init__:对象实例化自动触发 __str__:对象执行 ...

  10. Solution -「多校联训」最小点覆盖

    \(\mathcal{Description}\)   Link.   求含有 \(n\) 个结点的所有有标号简单无向图中,最小点覆盖为 \(m\) 的图的数量的奇偶性.\(T\) 组数据.   \( ...