[MyBatis学习笔记] 二、Mybatis基本操作及相关标签介绍
[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
是一款基于ORM
(Object/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如下:
其中,transactionManager
和datasource
两个标签的含义参见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
其中,关于properties
4及typeAliases
5标签,请查看相应的含义解释,数据源适配器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配置方式实现
实体类Order
和User
:
// 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>
|
一组结果映射,指定了对某个特定结果列,映射到某个属性或字段的方式。属性:value 、id 。value 属性是一个 Result 注解的数组。而 id 属性则是结果映射的名称。
|
@Result
|
N/A |
<result> 、<id>
|
在列和属性或字段之间的单个结果映射。属性:id 、column 、javaType 、jdbcType 、typeHandler 、one 、many 。id 属性和 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.xml
中mappers
标签下添加RoleMapper
的位置信息,否则mybatis
将无法定位RoleMapper
接口:
<mapper class="com.gavin11.study.mybatis.mapper.RoleMapper" />
参考:
Mybatis简介; ↩︎
构建SqlSessionFactory; ↩︎ ↩︎
environment配置; ↩︎ ↩︎
properties标签说明; ↩︎
typeAliases标签说明; ↩︎
映射文件说明; ↩︎
动态sql说明; ↩︎
关于resultMap; ↩︎ ↩︎ ↩︎
JavaAPI-注解含义; ↩︎ ↩︎
[MyBatis学习笔记] 二、Mybatis基本操作及相关标签介绍相关推荐
- 【台大郭彦甫】Matlab入门教程超详细学习笔记二:基本操作与矩阵运算(附PPT链接)
Matlab入门教程超详细学习笔记二:基本操作与矩阵运算 前言 一.基本操作 1.把matlab当作计算器使用 2.变量 3.控制格式输出 二.矩阵运算 1.矩阵 2.矩阵索引 3.使用:创建向量 4 ...
- Polyworks脚本开发学习笔记(二)-TREEVIEW基本操作
Polyworks脚本开发学习笔记(二)-TREEVIEW对象基本操作 TREEVIEW对象选择 选择/不选对象 TREEVIEW OBJECT SELECT ALL 全部对象选择,包括参考/数据/对 ...
- 【最全Mybatis学习笔记(导入mybatis相关jar包)】
目录 1. 什么是Mybatis 2. 如何引入Mybatis? 3.编写Mybatis工具类 4. 万能Map 5. 模糊查询怎么写? 6. 作用域(Scope)和生命周期SqlSessionFac ...
- Mybatis学习笔记(一) —— mybatis介绍
一.Mybatis介绍 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名 ...
- Mybatis学习笔记13 - 动态sql之set标签
示例代码: 接口定义: package com.mybatis.dao;import com.mybatis.bean.Employee;public interface EmployeeMapper ...
- mybatis学习笔记二(接口注解)
直接上代码,全部在代码里讲解. 1.实体类 package com.home.entity;/*** 此类是:user实体类* @author hpc* @2017年1月10日下午9:36:59*/ ...
- mybatis 学习笔记:mybatis 初认识
简介 MyBatis是一个Java持久层框架,它通过XML描述符或注解把对象与存储过程或SQL语句关联起来.mybatis 可以将 preparedStatement 中的输入参数自动进行映射,将查询 ...
- MyBatis学习笔记(一)——MyBatis快速入门
转自孤傲苍狼的博客:http://www.cnblogs.com/xdp-gacl/p/4261895.html 一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优 ...
- JS学习笔记二 DOM,正则表达式简单例子介绍
一.正则表达式 例子: var patt = /w3school/i; 例子解释: /w3school/i 是一个正则表达式. w3school 是模式(pattern)(在搜索中使用). i 是修饰 ...
最新文章
- 微信小程序页面跳转的方法
- 从入门到精通:卷积神经网络初学者指南
- SWJTU 2208 最大覆盖
- 存储过程中SELECT INTO的使用
- 达梦数据库(简称DM)的初级教程分享
- 基于 FPGA 的 SATA 3.0 IP 核简介
- 南挚seo:参加白杨seo师徒群培训后两个月感悟总结!
- android控制音量大小,Android AudioTrack音量控制笔记总结
- 智能清洁新消费的2021:不止营销造势,还有实力突围
- dexpathlist.java_java.lang.ClassNotFoundException: Didn't find class xxx on path: DexPathList
- Vs code 进行硬件设计实用插件-语法高亮、语法检查、自动例化、Testbench生成、对齐、代码块等
- cocoapods was not able to update the 'master' repo.if it is a unexpected issue and persists you can
- linux 脚本设置定时,脚本添加定时任务(Linux)
- 如何使用$.message
- 段码液晶屏驱动芯片如何选择
- 硬件行业知识体系概要
- VM-CtenOS-8+Linux-8+LANMP环境中安装phpMyAdmin
- 李一男离开华为时的忠告
- 2019年学习java还有前途吗?
- 服务器导出表为dmp文件,Oracle导入导出dmp表