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

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

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

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

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

}

}

相关推荐

当Frida来“敲”门(frida是什么)

0x1渗透测试瓶颈目前,碰到越来越多的大客户都会将核心资产业务集中在统一的APP上,或者对自己比较重要的APP,如自己的主业务,办公APP进行加壳,流量加密,投入了很多精力在移动端的防护上。而现在挖...

服务端性能测试实战3-性能测试脚本开发

前言在前面的两篇文章中,我们分别介绍了性能测试的理论知识以及性能测试计划制定,本篇文章将重点介绍性能测试脚本开发。脚本开发将分为两个阶段:阶段一:了解各个接口的入参、出参,使用Python代码模拟前端...

Springboot整合Apache Ftpserver拓展功能及业务讲解(三)

今日分享每天分享技术实战干货,技术在于积累和收藏,希望可以帮助到您,同时也希望获得您的支持和关注。架构开源地址:https://gitee.com/msxyspringboot整合Ftpserver参...

Linux和Windows下:Python Crypto模块安装方式区别

一、Linux环境下:fromCrypto.SignatureimportPKCS1_v1_5如果导包报错:ImportError:Nomodulenamed'Crypt...

Python 3 加密简介(python des加密解密)

Python3的标准库中是没多少用来解决加密的,不过却有用于处理哈希的库。在这里我们会对其进行一个简单的介绍,但重点会放在两个第三方的软件包:PyCrypto和cryptography上,我...

怎样从零开始编译一个魔兽世界开源服务端Windows

第二章:编译和安装我是艾西,上期我们讲述到编译一个魔兽世界开源服务端环境准备,那么今天跟大家聊聊怎么编译和安装我们直接进入正题(上一章没有看到的小伙伴可以点我主页查看)编译服务端:在D盘新建一个文件夹...

附1-Conda部署安装及基本使用(conda安装教程)

Windows环境安装安装介质下载下载地址:https://www.anaconda.com/products/individual安装Anaconda安装时,选择自定义安装,选择自定义安装路径:配置...

如何配置全世界最小的 MySQL 服务器

配置全世界最小的MySQL服务器——如何在一块IntelEdison为控制板上安装一个MySQL服务器。介绍在我最近的一篇博文中,物联网,消息以及MySQL,我展示了如果Partic...

如何使用Github Action来自动化编译PolarDB-PG数据库

随着PolarDB在国产数据库领域荣膺桂冠并持续获得广泛认可,越来越多的学生和技术爱好者开始关注并涉足这款由阿里巴巴集团倾力打造且性能卓越的关系型云原生数据库。有很多同学想要上手尝试,却卡在了编译数据...

面向NDK开发者的Android 7.0变更(ndk android.mk)

订阅Google官方微信公众号:谷歌开发者。与谷歌一起创造未来!受Android平台其他改进的影响,为了方便加载本机代码,AndroidM和N中的动态链接器对编写整洁且跨平台兼容的本机...

信创改造--人大金仓(Kingbase)数据库安装、备份恢复的问题纪要

问题一:在安装KingbaseES时,安装用户对于安装路径需有“读”、“写”、“执行”的权限。在Linux系统中,需要以非root用户执行安装程序,且该用户要有标准的home目录,您可...

OpenSSH 安全漏洞,修补操作一手掌握

1.漏洞概述近日,国家信息安全漏洞库(CNNVD)收到关于OpenSSH安全漏洞(CNNVD-202407-017、CVE-2024-6387)情况的报送。攻击者可以利用该漏洞在无需认证的情况下,通...

Linux:lsof命令详解(linux lsof命令详解)

介绍欢迎来到这篇博客。在这篇博客中,我们将学习Unix/Linux系统上的lsof命令行工具。命令行工具是您使用CLI(命令行界面)而不是GUI(图形用户界面)运行的程序或工具。lsoflsof代表&...

幻隐说固态第一期:固态硬盘接口类别

前排声明所有信息来源于网络收集,如有错误请评论区指出更正。废话不多说,目前固态硬盘接口按速度由慢到快分有这几类:SATA、mSATA、SATAExpress、PCI-E、m.2、u.2。下面我们来...

新品轰炸 影驰SSD多款产品登Computex

分享泡泡网SSD固态硬盘频道6月6日台北电脑展作为全球第二、亚洲最大的3C/IT产业链专业展,吸引了众多IT厂商和全球各地媒体的热烈关注,全球存储新势力—影驰,也积极参与其中,为广大玩家朋友带来了...