[MyBatis学习笔记] 二、Mybatis基本操作及相关标签介绍

  • 一、Mybatis简介
  • 二、简单的CRUD操作
    • 1、构建SqlSessionFactory
      • (1)编辑mybatis-config.xml
      • (2)使用SqlSessionFactoryBuilder来构建SqlSessionFactory
    • 2、从 SqlSessionFactory 中获取 SqlSession
      • (1)通过SqlSession中提供的方法来执行
      • (2)通过动态代理的方式来执行
    • 3、构建DAO接口及相应的映射文件
    • 4、简单的测试
  • 三、Mybatis复杂映射
    • 1、关于resultMap
    • 2、一对一映射
      • (1)xml配置方式实现
      • (2)注解方式实现
    • 3、一对多映射
      • (1)XML映射配置实现
      • (2)注解方式实现
    • 4、多对多映射
      • (1)XML配置实现
      • (2)注解实现

一、Mybatis简介

MyBatis 是一款基于ORMObject/Relation Mapping)的优秀的持久层框架。MyBatis 可以通过简单的 XML配置或注解形式,将原始类型、接口和 Java POJO(Plain Old Java Objects)映射为数据库中的记录1

二、简单的CRUD操作

相关环境参数如下:
Mariadb:

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 62
Server version: 10.4.16-MariaDB MariaDB Server

Jdk:

java version "1.8.0_152"
Java(TM) SE Runtime Environment (build 1.8.0_152-b16)
Java HotSpot(TM) 64-Bit Server VM (build 25.152-b16, mixed mode)

依赖:

<!-- mybatis3 -->
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.6</version>
</dependency><!-- mysql connector java -->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.23</version>
</dependency><!-- druid connection pool-->
<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.5</version>
</dependency>

1、构建SqlSessionFactory

SqlSessionFactory可通过XML配置构建,也可通过代码构建2。本文选择通过XML构建的方式。

(1)编辑mybatis-config.xml

mybatis-config.xml文件模板2如下:

其中,transactionManagerdatasource两个标签的含义参见envirionment配置3
由于本次使用了druid作为连接池,参考了文档3,设置自定义连接池的方式如下:
首先,需要构建数据源适配器:

其次,在xml文件中配置datasource

至此,最终的mybatis-config.xml文件如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- 数据库连接参数存放于.properties文件中 --><properties resource="jdbc.properties" /><!-- 设置别名 --><typeAliases><!-- 该包下的类可直接使用类名作为别名,且不区分大小写 --><package name="com.gavin11.study.mybatis.pojo"/></typeAliases>    <environments default="development"><environment id="development"><!-- 事务管理器 --><transactionManager type="JDBC"/><!-- 使用druid连接池 --><dataSource type="com.gavin11.study.mybatis.config.DruidDataSourceFactory"><property name="driverClassName" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${user}"/><property name="password" value="${password}"/></dataSource></environment></environments><!-- 设置映射文件路径 --><mappers><!-- UserMapper.xml --><mapper resource="mapper/UserMapper.xml"/><!-- OrderMapper.xml --><mapper resource="mapper/OrderMapper.xml" /><mapper class="com.gavin11.study.mybatis.mapper.RoleMapper" /></mappers>
</configuration>

jdbc.properties:

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://192.168.0.101:3306/ipersistance?useUnicode=true&characterEncoding=utf8
user=root
password=123456

其中,关于properties4typeAliases5标签,请查看相应的含义解释,数据源适配器DruidDataSourceFactory的相关代码如下:

public class DruidDataSourceFactory extends UnpooledDataSourceFactory {public DruidDataSourceFactory() {this.dataSource = new DruidDataSource();}
}

(2)使用SqlSessionFactoryBuilder来构建SqlSessionFactory

代码如下:

SqlSessionFactory sqlSessionFactory;
try (InputStream in = Resources.getResourceAsStream("mybatis-config.xml");InputStreamReader isr = new InputStreamReader(Objects.requireNonNull(in), StandardCharsets.UTF_8)
) {sqlSessionFactory = new SqlSessionFactoryBuilder().build(isr);
}

2、从 SqlSessionFactory 中获取 SqlSession

可调用SqlSessionFactory#openSession()方法来创建SqlSession。主要有以下两种方式来通过SqlSession执行数据库操作:

(1)通过SqlSession中提供的方法来执行

如图

(2)通过动态代理的方式来执行


本文采用第二种方式创建SqlSession,代码如下:

try (SqlSession session = sqlSessionFactory.openSession()
) {UserMapper userMapper = session.getMapper(UserMapper.class);
}

3、构建DAO接口及相应的映射文件

UserMapper接口及简单的增删改查方法:

public interface UserMapper {List<User> findAll();User findByIdName(@Param("ur") User ur);List<User> findByIds(@Param("ids") int[] ids);int insertOne(@Param("user") User user);int updateById(@Param("user") User user);int deleteById(@Param("id") int id);
}

相应的映射文件UserMapper.xml(映射文件的设置参见相关说明6动态sql说明7):

<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.gavin11.study.mybatis.mapper.UserMapper"><!-- 由于已在mybatis-config.xml中为com.gavin11.study.mybatis.pojo包下的所有类设置了别名,故所有类型直接用类名表示--><select id="findAll" resultType="user">select * from user</select><select id="findByIdName" resultType="user" parameterType="user">select * from user<!-- 动态sql where/if 标签 --><where><if test="ur.id != 0">id = #{ur.id}</if><if test="ur.username != null">and username = #{ur.username}</if></where></select><!-- foreach标签 --><select id="findByIds" resultType="user">select * from user<where><foreach collection="ids" open="id in (" close=")" separator="," item="id">#{id}</foreach></where></select><insert id="insertOne" parameterType="user">insert into user(id,username,password,birthday)values(#{user.id},#{user.username},#{user.password},#{user.birthday})</insert><update id="updateById" parameterType="user">update user set username = #{user.username} where id = #{user.id}</update><delete id="deleteById" parameterType="java.lang.Integer">delete from user where id = #{id}</delete>
</mapper>

4、简单的测试

测试代码如下:

SqlSessionFactory sqlSessionFactory;try (InputStream in = Resources.getResourceAsStream("mybatis-config.xml");InputStreamReader isr = new InputStreamReader(Objects.requireNonNull(in), StandardCharsets.UTF_8)) {sqlSessionFactory = new SqlSessionFactoryBuilder().build(isr);}try (SqlSession session = sqlSessionFactory.openSession()) {UserMapper userMapper = session.getMapper(UserMapper.class);/*List<User> all = userMapper.findAll();all.forEach(System.out::println);*//*User user = userMapper.findByIdName(new User(1, "lucy", null, null));System.out.println(user);*//*int ct = userMapper.insertOne(new User(4, "xx", "sdkf", "1991-01-04"));// 手动提交事务session.commit();System.out.println(ct);*//*int ct = userMapper.updateById(new User(4, "lampard", null, null));session.commit();System.out.println(ct);*/int ct = userMapper.deleteById(4);// 需手动提交事务session.commit();System.out.println(ct);}

三、Mybatis复杂映射

本节将使用mybatis实现一对一、一对多、多堆多的映射关系。

1、关于resultMap

resultMap 元素是 MyBatis 中最重要最强大的元素8

2、一对一映射

本示例为查询订单及订单所属的用户。
数据表结构如下:

(1)xml配置方式实现

实体类OrderUser

// com.gavin11.study.mybatis.pojo.Order.java
public class Order {private int id;private String orderTime;private double total;private User user;
}
// com.gavin11.study.mybatis.pojo.User.java
public class User {private int id;private String username;private String password;private String birthday;
}

接口OrderMapper

// OrderMapper.java
public interface OrderMapper {List<Order> findOrderUser();
}

xml配置:

<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.gavin11.study.mybatis.mapper.OrderMapper"><!-- 一对一映射 --><resultMap id="orderUserMap" type="order"><!-- 以下为类的属性与数据表字段的映射关系 --><id property="id" column="id" /><result property="orderTime" column="ordertime" /><result property="total" column="total" /><!-- 映射到Order类中的user属性其javaType为:com.gavin11.study.mybatis.pojo.User由于在mybatis-config.xml中设置了别名,故此处可以直接使用类名--><association property="user" javaType="user"><id property="id" column="uid" /><result property="username" column="username" /><result property="password" column="password" /><result property="birthday" column="birthday" /></association></resultMap><select id="findOrderUser" resultMap="orderUserMap">select * from orders o, user u where o.uid = u.id</select>
</mapper>

其中,关于association标签的说明8

(2)注解方式实现

OrderMapper:

// OrderMapper.java
public interface OrderMapper {@Select("select * from orders")@Results({@Result(property = "id", column = "id"),@Result(property = "orderTime", column = "ordertime"),@Result(property = "total", column = "total"),@Result(property = "user", column = "uid", javaType = User.class, one = @One(select = "com.gavin11.study.mybatis.mapper.UserMapper.findByUid"))})List<Order> findOrderUserAnn();
}

UserMapper:

// UserMapper.java
public interface UserMapper {@Select("select * from user where id = #{uid}")User findByUid(@Param("uid") int uid);
}

相关注解说明如下9

注解 使用对象 XML等价形式 描述
@Select 方法 <select> 每个注解分别代表将会被执行的 SQL 语句
@Results 方法 <resultMap> 一组结果映射,指定了对某个特定结果列,映射到某个属性或字段的方式。属性:valueidvalue 属性是一个 Result 注解的数组。而 id 属性则是结果映射的名称。
@Result N/A <result><id> 在列和属性或字段之间的单个结果映射。属性:idcolumnjavaTypejdbcTypetypeHandleronemanyid 属性和 XML 元素 <id> 相似,它是一个布尔值,表示该属性是否用于唯一标识和比较对象。one 属性是一个关联,和 <association> 类似,而 many 属性则是集合关联,和 <collection> 类似。
@One N/A <association> 复杂类型的单个属性映射。属性: select,指定可加载合适类型实例的映射语句(也就是映射器方法)全限定名

更多的注解含义,请参见说明9

3、一对多映射

本节查询用户及其所关联的订单。

(1)XML映射配置实现

UserMapper.xml:

<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.gavin11.study.mybatis.mapper.UserMapper"><!-- 一对多映射 --><resultMap id="userOrderMap" type="user"><id property="id" column="id" /><result property="username" column="username" /><result property="password" column="password" /><result property="birthday" column="birthday" /><collection property="orders" ofType="order"><id property="id" column="oid" /><result property="orderTime" column="ordertime" /><result property="total" column="total" /></collection></resultMap><select id="findUserOrder" resultMap="userOrderMap">select u.*, o.id oid,o.ordertime ordertime,o.total total from user u left join orders o on u.id = o.uid</select>
</mapper>

关于collection标签8

(2)注解方式实现

UserMapper:

// UserMapper.java
public interface UserMapper {@Select("select * from user")@Results({@Result(property = "id", column = "id"),@Result(property = "username", column = "username"),@Result(property = "password", column = "password"),@Result(property = "birthday", column = "birthday"),// 根据id来进行查询,故column设置为id@Result(property = "orders", column = "id", javaType = List.class, many = @Many(select = "com.gavin11.study.mybatis.mapper.OrderMapper.findOrderByUidAnn")),})List<User> findUserOrderAnn();
}

OderMapper:

// OrderMapper.java
public interface OrderMapper {@Select("select * from orders where uid = #{uid}")@Results({@Result(property = "id", column = "id"),@Result(property = "orderTime", column = "ordertime"),@Result(property = "total", column = "total"),})List<Order> findOrderByUidAnn(@Param("uid") int uid);
}

关于@Many注解的说明:

注解 使用对象 XML等价形式 描述
@Many N/A <collection> 复杂类型的集合属性映射。属性: select,指定可加载合适类型实例集合的映射语句(也就是映射器方法)全限定名

4、多对多映射

数据表结构:


实体类定义如下:

// User.java
public class User {private int id;private String username;private String password;private String birthday;private List<Role> roles;
}
// Role.java
public class Role {private int id;private String roleName;private String roleDesc;
}

(1)XML配置实现

UserMapper:

// UserMapper.java
public interface UserMapper {List<User> findUserRole();
}

UserMapper.xml

<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.gavin11.study.mybatis.mapper.UserMapper"><!-- 多对多查询 --><resultMap id="userRoleMap" type="user"><result property="id" column="userid" /><result property="username" column="username" /><result property="password" column="password" /><result property="birthday" column="birthday" /><collection property="roles" ofType="role"><result property="id" column="roleid" /><result property="roleName" column="rolename" /><result property="roleDesc" column="roleDesc" /></collection></resultMap><select id="findUserRole" resultMap="userRoleMap">select * from user u left join sys_user_role ur on u.id = ur.useridleft join sys_role r on ur.roleid = r.id</select>
</mapper>

(2)注解实现

UserMapper:

public interface UserMapper {@Select("select * from user")@Results({@Result(property = "id", column = "id"),@Result(property = "username", column = "username"),@Result(property = "password", column = "password"),@Result(property = "birthday", column = "birthday"),@Result(property = "roles", column = "id", javaType = List.class, many = @Many(select = "com.gavin11.study.mybatis.mapper.RoleMapper.findRoleByUidAnn")),})List<User> findUserRoleAnn();
}

RoleMapper:

public interface RoleMapper {@Select("select r.* from sys_user_role ur,sys_role r where ur.userid=#{uid} and ur.roleid=r.id")@Results({@Result(property = "id", column = "id"),@Result(property = "roleName", column = "rolename"),@Result(property = "roleDesc", column = "roleDesc"),})List<Role> findRoleByUidAnn(@Param("uid") int uid);
}

特别说明,需在mybatis-config.xmlmappers标签下添加RoleMapper的位置信息,否则mybatis将无法定位RoleMapper接口:

<mapper class="com.gavin11.study.mybatis.mapper.RoleMapper" />

参考:


  1. Mybatis简介; ↩︎

  2. 构建SqlSessionFactory; ↩︎ ↩︎

  3. environment配置; ↩︎ ↩︎

  4. properties标签说明; ↩︎

  5. typeAliases标签说明; ↩︎

  6. 映射文件说明; ↩︎

  7. 动态sql说明; ↩︎

  8. 关于resultMap; ↩︎ ↩︎ ↩︎

  9. JavaAPI-注解含义; ↩︎ ↩︎

[MyBatis学习笔记] 二、Mybatis基本操作及相关标签介绍相关推荐

  1. 【台大郭彦甫】Matlab入门教程超详细学习笔记二:基本操作与矩阵运算(附PPT链接)

    Matlab入门教程超详细学习笔记二:基本操作与矩阵运算 前言 一.基本操作 1.把matlab当作计算器使用 2.变量 3.控制格式输出 二.矩阵运算 1.矩阵 2.矩阵索引 3.使用:创建向量 4 ...

  2. Polyworks脚本开发学习笔记(二)-TREEVIEW基本操作

    Polyworks脚本开发学习笔记(二)-TREEVIEW对象基本操作 TREEVIEW对象选择 选择/不选对象 TREEVIEW OBJECT SELECT ALL 全部对象选择,包括参考/数据/对 ...

  3. 【最全Mybatis学习笔记(导入mybatis相关jar包)】

    目录 1. 什么是Mybatis 2. 如何引入Mybatis? 3.编写Mybatis工具类 4. 万能Map 5. 模糊查询怎么写? 6. 作用域(Scope)和生命周期SqlSessionFac ...

  4. Mybatis学习笔记(一) —— mybatis介绍

    一.Mybatis介绍 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名 ...

  5. Mybatis学习笔记13 - 动态sql之set标签

    示例代码: 接口定义: package com.mybatis.dao;import com.mybatis.bean.Employee;public interface EmployeeMapper ...

  6. mybatis学习笔记二(接口注解)

    直接上代码,全部在代码里讲解. 1.实体类 package com.home.entity;/*** 此类是:user实体类* @author hpc* @2017年1月10日下午9:36:59*/ ...

  7. mybatis 学习笔记:mybatis 初认识

    简介 MyBatis是一个Java持久层框架,它通过XML描述符或注解把对象与存储过程或SQL语句关联起来.mybatis 可以将 preparedStatement 中的输入参数自动进行映射,将查询 ...

  8. MyBatis学习笔记(一)——MyBatis快速入门

    转自孤傲苍狼的博客:http://www.cnblogs.com/xdp-gacl/p/4261895.html 一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优 ...

  9. JS学习笔记二 DOM,正则表达式简单例子介绍

    一.正则表达式 例子: var patt = /w3school/i; 例子解释: /w3school/i 是一个正则表达式. w3school 是模式(pattern)(在搜索中使用). i 是修饰 ...

最新文章

  1. 微信小程序页面跳转的方法
  2. 从入门到精通:卷积神经网络初学者指南
  3. SWJTU 2208 最大覆盖
  4. 存储过程中SELECT INTO的使用
  5. 达梦数据库(简称DM)的初级教程分享
  6. 基于 FPGA 的 SATA 3.0 IP 核简介
  7. 南挚seo:参加白杨seo师徒群培训后两个月感悟总结!
  8. android控制音量大小,Android AudioTrack音量控制笔记总结
  9. 智能清洁新消费的2021:不止营销造势,还有实力突围
  10. dexpathlist.java_java.lang.ClassNotFoundException: Didn't find class xxx on path: DexPathList
  11. Vs code 进行硬件设计实用插件-语法高亮、语法检查、自动例化、Testbench生成、对齐、代码块等
  12. cocoapods was not able to update the 'master' repo.if it is a unexpected issue and persists you can
  13. linux 脚本设置定时,脚本添加定时任务(Linux)
  14. 如何使用$.message
  15. 段码液晶屏驱动芯片如何选择
  16. 硬件行业知识体系概要
  17. VM-CtenOS-8+Linux-8+LANMP环境中安装phpMyAdmin
  18. 李一男离开华为时的忠告
  19. 2019年学习java还有前途吗?
  20. 服务器导出表为dmp文件,Oracle导入导出dmp表

热门文章

  1. 中国康复学会综合年会首届脑功能检测与调控康复论坛
  2. 无法直视之纳税额计算器
  3. 查看本机的系统字符集
  4. 人工智能实践:Tensorflow2.0笔记 北京大学MOOC(2-1)
  5. 下载chrome离线安装程序的方法
  6. 计算机php是做什么的,最早的计算机是用来干什么的
  7. iMeta | 兰大张东等使用PhyloSuite进行分子系统发育及系统发育树的统计分析
  8. js实现一个获取url参数的方法-前端面试题
  9. 微信小程序中的快捷键
  10. Adobe 使用 AI 识别 PS “照骗”;Java 要被 kotlin 打败了?