一、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

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

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

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

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

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

    <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 查询。这种情况通常在多条件组合查询中遇到

<mapper namespace="com.mfc.dao.UserDao">
<select id="selectList" resultType="com.mfc.entity.User" parameterType="com.mfc.entity.User">
select * from user
<where>
<if test="id != 0">
and id = #{id}
</if>
<if test="username != null">
and username = #{username}
</if>
</where>
</select>
</mapper>

动态 SQL 之 标签

标签的属性含义:

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

标签使用:

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

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

四、MyBatis 映射

1. 一对一

实体类

public class Orders {
private Integer id;
private String ordertime;
private Double total;
private User user;
// set、get、toString 方法省略。。。
}
public class User {
private Integer id;
private String username;
// set、get、toString 方法省略。。。
}

映射文件

<mapper namespace="com.mfc.dao.OrdersDao">
<resultMap id="orderMap" type="com.mfc.entity.Orders">
<result property="id" column="id"></result>
<result property="ordertime" column="ordertime"></result>
<result property="total" column="total"></result>
<association property="user" javaType="com.mfc.entity.User">
<id property="id" column="uid"></id>
<result property="username" column="username"></result>
</association>
</resultMap>
<select id="selectOrders" resultMap="orderMap">
select * from orders o,user u where o.uid=u.id
</select>
</mapper>

2. 一对多

实体类

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

映射文件

<mapper namespace="com.mfc.dao.UserDao">
<resultMap id="userMap" type="com.mfc.entity.User">
<result property="id" column="id"></result>
<result property="username" column="username"></result>
<collection property="orders" ofType="com.mfc.entity.Orders">
<id property="id" column="oid"></id>
<result property="ordertime" column="ordertime"></result>
<result property="total" column="total"></result>
</collection>
</resultMap> <select id="selectUser" resultMap="userMap">
select *,o.id oid from user u left join orders o on o.uid=u.id
</select>
</mapper>

3. 多对多

实体类

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

映射文件

<mapper namespace="com.mfc.dao.UserDao">
<resultMap id="userMap" type="com.mfc.entity.User">
<result property="id" column="id"></result>
<result property="username" column="username"></result>
<collection property="roles" ofType="com.mfc.entity.Role">
<id property="id" column="rid"></id>
<result property="rolename" column="rolename"></result>
</collection>
</resultMap> <select id="selectUser" resultMap="userMap">
SELECT
u.*, r.id rid,
r.rolename rolename
FROM
USER u
LEFT JOIN user_role ur ON u.id = ur.uid
INNER JOIN role r ON ur.rid = r.id
</select>
</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. python28day

    内容回顾 classmethod: 用不到对象,并且要用类名的时候 装饰一个方法,被装饰的方法会变成类方法 staticmethod: 把一个函数放到类里,变成一个静态方法 这个方法既用不到对象,也用 ...

  2. 【第十四期】高德go面经

    自我介绍 选一个比较熟悉的项目讲讲 筛选日志的时候,日志格式是不一样的,你们是如何处理的? 处理日志的时候如果日志量比较大会堆积吗?怎么处理的? 日志落盘到机器上,是如何采集的? 采集服务有问题的话可 ...

  3. python编写购物车-实时购买

    本次编写的是实时购买(输入商品直接进行购买),余额不足可以进行充值或结束购物 1 goods = [ 2 {"name": "电脑", "price& ...

  4. Git起始操作之设置全局用户名和Email地址

    引自:廖雪峰老师的Git教程 因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址.你也许会担心,如果有人故意冒充别人怎么办?这个不必担心,首先我们相信大家都是善良无 ...

  5. DLL链接库

    转载请注明来源:https://www.cnblogs.com/hookjc/ 2. 静态链接库 对静态链接库的讲解不是本文的重点,但是在具体讲解 DLL 之前,通过一个静态链接库的例子可以快速地帮助 ...

  6. C++输入多行数据

    动机 编程题常用需求,比如输入两行数据. 解决思路:使用getline 程序 #include <iostream> #include <vector> #include &l ...

  7. 关于Miller-Rabin与Pollard-Rho算法的理解(素性测试与质因数分解)

    前置 费马小定理(即若P为质数,则\(A^P\equiv A \pmod{P}\)). 欧几里得算法(GCD). 快速幂,龟速乘. 素性测试 引入 素性测试是OI中一个十分重要的事,在数学毒瘤题中有着 ...

  8. java+selenium自动化脚本编写

    实训项目:创盟后台管理,页面自动化脚本编写 使用工具:java+selenium 1)java+selenium环境搭建文档 2)创盟项目后台管理系统链接 java+selenium环境搭建 一.Se ...

  9. 虫师Selenium2+Python_5、自动化测试模型

    P138--模块化驱动测试实例 P142--参数化搜索关键字 from selenium import webdriver search_text = ['python','中文','text'] # ...

  10. tarjan2

    反过来调过去,我还是感觉没学明白缩点 讲一个有向图中的所有强连通分量缩成一个点后,构成的新图是一个DAG. 一个点所在的强连通分量一定被该点所在DFS搜索树所包含 树上的边大致分为:树枝边,前向边(从 ...