百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

三、mybatis高级使用(mybatis操作)

bigegpt 2024-08-01 11:50 6 浏览

声明:内容来源于互联网,笔者主要进行了相关整理。

一、Mybatis复杂映射开发

1.1 一对一查询

一对一查询的模型(MapperScannerConfigurer)

用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户

一对一的查询需求:查询一个订单,与此同时查询该订单所属的用户

创建数据库

create database my_order character set = utf8;

use my_order;

create table user(

id int(10),

username varchar(50),

password varchar(50),

birthday varchar(50),

primary key(id)

);

insert into user values (1,'zhangsan','123','153975063457');

insert into user values (2,'tom','123','153975063457');

create table orders(

id int(10),

ordertime varchar(50),

total double,

uid int(10),

primary key(id)

);

insert into orders values (1,'2019-10-12',3000,1);

insert into orders values (2,'2019-10-13',4000,1);

insert into orders values (3,'2019-10-14',5000,2);

一对一查询的语句

select * from orders o,user u where o.uid=u.id

编码过程

public class User {

private Integer id;

private String username;

private String password;

private String birthday;

//set,get,toString方法忽略

}

public class Order {

private Integer id;

private String orderTime;

private Double total;

private User user;

//set,get,toString方法忽略

}

public interface IOrderMapper {

//查询订单的同时还查询该订单所属的用户

List<Order> findOrderAndUser();

}

<mapper namespace="org.example.mybatis.high.mapper.IOrderMapper">

<resultMap id="orderMap" type="org.example.mybatis.high.pojo.Order">

<result property="id" column="id"></result>

<result property="orderTime" column="ordertime"></result>

<result property="total" column="total"></result>

<!--配置集合实体-->

<association property="user" javaType="org.example.mybatis.high.pojo.User">

<result property="id" column="uid"></result>

<result property="username" column="username"></result>

<result property="password" column="password"></result>

<result property="birthday" column="birthday"></result>

</association>

</resultMap>

<!--

resultType:自动按照字段名和属性名完成映射封装。

resultMap:手动配置实体属性与表字段的映射关系。

-->

<select id="findOrderAndUser" resultMap="orderMap">

select * from orders o,user u where o.uid=u.id

</select>

</mapper>

1.2 一对多查询

一对多查询的模型

用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户

一对多的查询需求:查询所有用户,与此同时查询该用户下的所有订单

一对多查询的语句

select * from user u left join orders o on u.id = o.uid

编码过程

public class User {

private Integer id;

private String username;

private String password;

private String birthday;上

private List<Order> orders = new ArrayList<>();

//set,get,toString方法忽略

}

public class Order {

private Integer id;

private String orderTime;

private Double total;

//set,get,toString方法忽略

}

public interface IUserMapper {

//查询用户的所有订单

List<User> findUserAndOrder();

}

<resultMap id="userMap" type="org.example.mybatis.high.pojo.User">

<result property="id" column="uid"></result>

<result property="username" column="username"></result>

<result property="password" column="password"></result>

<result property="birthday" column="birthday"></result>

<!--集合数据实体-->

<collection property="orders" ofType="org.example.mybatis.high.pojo.Order">

<result property="id" column="uid"></result>

<result property="orderTime" column="ordertime"></result>

<result property="total" column="total"></result>

</collection>

</resultMap>

<select id="findUserAndOrder" resultMap="userMap">

select * from user u left join orders o on u.id = o.uid

</select>

1.3多对多查询

用户表和角色表的关系为一个用户有多个角色,一个角色被多个用户使用。

多对多查询的需求:查询用户同时查询出该用户的所有角色

创建数据库表和数据

create table role(

id int(10),

rolename varchar(255),

primary key(id)

);

insert into role values (1,'CEO');

insert into role values (2,'CFO');

insert into role values (3,'COO');

create table user_role(

user_id int(10),

role_id int(10),

primary key(user_id,role_id)

);

insert into user_role values (1,1);

insert into user_role values (1,2);

insert into user_role values (2,2);

insert into user_role values (2,3);

多对多查询的语句

select u.*,r.*,r.id rid

from user u

left join user_role ur on u.id = ur.user_id

inner join role r on ur.role_id = r.id;

编码过程

List<User> findUserAndRole();

public class User {

private Integer id;

private String username;

private String password;

private String birthday;

private List<Role> roles = new ArrayList<>();

//set,get,toString方法忽略

}

public class Role {

private int id;

private String rolename;

//set,get,toString方法忽略

}

<resultMap id="roleMap" type="org.example.mybatis.high.pojo.User">

<result property="id" column="user_id"></result>

<result property="username" column="username"></result>

<result property="password" column="password"></result>

<result property="birthday" column="birthday"></result>

<!--集合数据实体-->

<collection property="roles" ofType="org.example.mybatis.high.pojo.Role">

<result property="id" column="role_id"></result>

<result property="rolename" column="rolename"></result>

</collection>

</resultMap>

<select id="findUserAndRole" resultMap="roleMap">

select u.*,r.*,ur.* from user u left join user_role ur on u.id = ur.user_id

inner join role r on ur.role_id = r.id

</select>

编码过程中注意重复字段取值时,尽量通过关联表的外键字段来获取。避免无法区分主键。

二、Mybatis注解开发

1.Mybatis的常用注解

@Insert:新增

@Update:更新

@Delete:删除

@Select:查询

@Result:结果集封装

@Results:与@Result一起使用,封装多个结果集

@One:一对一结果集封装

@Many:一对多结果集封装

测试类中,先写入公共的方法,方便重复使用

private IUserMapper userMapper;

@Before

public void before() throws IOException {

InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

SqlSession sqlSession = sqlSessionFactory.openSession(true);

userMapper = sqlSession.getMapper(IUserMapper.class);

}

2.@Insert使用

//添加用户

@Insert("insert into user values (#{id},#{username},#{password},#{birthday})")

void addUser(User user);

@Test

public void addUser(){

User user = new User();

user.setId(3);

user.setUsername("test");

user.setPassword("1234");

user.setbirthday("12123456789");

userMapper.addUser(user);

}

3.@Update使用

//更新用户

@Update("update user set username =#{username} where id = #{id}")

void updateUser(User user);

@Test

public void updateUser(){

User user = new User();

user.setId(3);

user.setUsername("test test");

userMapper.updateUser(user);

}

4.@Delete使用

//删除用户

@Delete("delete from user where id = #{id}")

void deleteUser(Integer id);

@Test

public void deleteUser(){

userMapper.deleteUser(3);

}

5.@Select使用

//查询用户

@Select("select * from user")

List<User> findAll();

@Test

public void findUser(){

List<User> userList = userMapper.findAll();

for (User user:userList){

System.out.println(user);

}

}

6.@One使用

//查询订单及用户信息

@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 = "org.example.mybatis.high.mapper.IUserMapper.findUserById"))


})

@Select("select * from orders")

List<Order> findUserAndOrderByAnnotation();

@Test

public void findUserAndOrderByAnnotation() {

List<Order> orderList = orderMapper.findUserAndOrderByAnnotation();

for(Order order:orderList){

System.out.println(order);

}

}

7.@Many使用

//查询用户的所有订单

@Results({

@Result(property = "id",column = "id"),

@Result(property = "username",column = "username"),

@Result(property = "password",column = "password"),

@Result(property = "birthday",column = "birthday"),

@Result(property = "orders",column = "id",javaType = List.class,

many = @Many(select = "org.example.mybatis.high.mapper.IOrderMapper.findOrderByUid"))


})

@Select("select * from user")

List<User> findUserAndOrderByAnnotation();

//根据用户id查询订单

@Select("select * from orders where uid = #{uid}")

List<Order> findOrderByUid(int uid);

@Test

public void findUserAndOrderByAnnotation() {

List<User> userList = userMapper.findUserAndOrderByAnnotation();

for(User user:userList){

System.out.println(user);

}

}

8.多对多

//查询用户的同时还查询用户对应的权限信息

@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 = "org.example.mybatis.high.mapper.IRoleMapper.findRoleByUid"))


})

@Select("select * from user")

List<User> findUserAndRoleByAnnotation();

@Select("select * from role r,user_role ur where r.id = ur.role_id and ur.user_id = #{uid}")

List<Role> findRoleByUid(int uid);

@Test

public void findUserAndRoleByAnnotation() {

List<User> userList = userMapper.findUserAndRoleByAnnotation();

for(User user:userList){

System.out.println(user);

}

}

相关推荐

得物可观测平台架构升级:基于GreptimeDB的全新监控体系实践

一、摘要在前端可观测分析场景中,需要实时观测并处理多地、多环境的运行情况,以保障Web应用和移动端的可用性与性能。传统方案往往依赖代理Agent→消息队列→流计算引擎→OLAP存储...

warm-flow新春版:网关直连和流程图重构

本期主要解决了网关直连和流程图重构,可以自此之后可支持各种复杂的网关混合、多网关直连使用。-新增Ruoyi-Vue-Plus优秀开源集成案例更新日志[feat]导入、导出和保存等新增json格式支持...

扣子空间体验报告

在数字化时代,智能工具的应用正不断拓展到我们工作和生活的各个角落。从任务规划到项目执行,再到任务管理,作者深入探讨了这款工具在不同场景下的表现和潜力。通过具体的应用实例,文章展示了扣子空间如何帮助用户...

spider-flow:开源的可视化方式定义爬虫方案

spider-flow简介spider-flow是一个爬虫平台,以可视化推拽方式定义爬取流程,无需代码即可实现一个爬虫服务。spider-flow特性支持css选择器、正则提取支持JSON/XML格式...

solon-flow 你好世界!

solon-flow是一个基础级的流处理引擎(可用于业务规则、决策处理、计算编排、流程审批等......)。提供有“开放式”驱动定制支持,像jdbc有mysql或pgsql等驱动,可...

新一代开源爬虫平台:SpiderFlow

SpiderFlow:新一代爬虫平台,以图形化方式定义爬虫流程,不写代码即可完成爬虫。-精选真开源,释放新价值。概览Spider-Flow是一个开源的、面向所有用户的Web端爬虫构建平台,它使用Ja...

通过 SQL 训练机器学习模型的引擎

关注薪资待遇的同学应该知道,机器学习相关的岗位工资普遍偏高啊。同时随着各种通用机器学习框架的出现,机器学习的门槛也在逐渐降低,训练一个简单的机器学习模型变得不那么难。但是不得不承认对于一些数据相关的工...

鼠须管输入法rime for Mac

鼠须管输入法forMac是一款十分新颖的跨平台输入法软件,全名是中州韵输入法引擎,鼠须管输入法mac版不仅仅是一个输入法,而是一个输入法算法框架。Rime的基础架构十分精良,一套算法支持了拼音、...

Go语言 1.20 版本正式发布:新版详细介绍

Go1.20简介最新的Go版本1.20在Go1.19发布六个月后发布。它的大部分更改都在工具链、运行时和库的实现中。一如既往,该版本保持了Go1的兼容性承诺。我们期望几乎所...

iOS 10平台SpriteKit新特性之Tile Maps(上)

简介苹果公司在WWDC2016大会上向人们展示了一大批新的好东西。其中之一就是SpriteKitTileEditor。这款工具易于上手,而且看起来速度特别快。在本教程中,你将了解关于TileE...

程序员简历例句—范例Java、Python、C++模板

个人简介通用简介:有良好的代码风格,通过添加注释提高代码可读性,注重代码质量,研读过XXX,XXX等多个开源项目源码从而学习增强代码的健壮性与扩展性。具备良好的代码编程习惯及文档编写能力,参与多个高...

Telerik UI for iOS Q3 2015正式发布

近日,TelerikUIforiOS正式发布了Q32015。新版本新增对XCode7、Swift2.0和iOS9的支持,同时还新增了对数轴、不连续的日期时间轴等;改进TKDataPoin...

ios使用ijkplayer+nginx进行视频直播

上两节,我们讲到使用nginx和ngixn的rtmp模块搭建直播的服务器,接着我们讲解了在Android使用ijkplayer来作为我们的视频直播播放器,整个过程中,需要注意的就是ijlplayer编...

IOS技术分享|iOS快速生成开发文档(一)

前言对于开发人员而言,文档的作用不言而喻。文档不仅可以提高软件开发效率,还能便于以后的软件开发、使用和维护。本文主要讲述Objective-C快速生成开发文档工具appledoc。简介apple...

macOS下配置VS Code C++开发环境

本文介绍在苹果macOS操作系统下,配置VisualStudioCode的C/C++开发环境的过程,本环境使用Clang/LLVM编译器和调试器。一、前置条件本文默认前置条件是,您的开发设备已...