【Spring集成MyBatis】MyBatis注解开发

文章目录

  • 1. MyBatis的常用注解
  • 2. 基于注解的MyBatis增删改查
    • 完整代码
    • 加载映射关系
    • 测试代码
  • 3. MyBatis的注解实现复杂映射开发
    • 一对一操作的实现
    • 一对一操作实现的第二种方式
    • 一对多操作的实现
    • 多对多操作实现

1. MyBatis的常用注解

在这里插入图片描述

2. 基于注解的MyBatis增删改查

使用注解开发,就可以删掉原本写MyBatis语句的xml文件了,注解只要在UserMapper.java接口上进行实现即可

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

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

@Update("update user set username=#{username}, password=#{password}, birthday=#{birthday} where id=#{id}")
void update(User user);

@Select("select * from user where id=#{id}")
User findById(int id);@Select("select * from user")
List<User> findAll();

完整代码

package com.example.demo.mapper;import com.example.demo.domain.User;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;import java.util.List;public interface UserMapper {@Insert("insert into user values(#{id}, #{username}, #{password}, #{birthday})")void save(User user);@Delete("delete from user where id=#{id}")void delete(int id);@Update("update user set username=#{username}, password=#{password}, birthday=#{birthday} where id=#{id}")void update(User user);@Select("select * from user where id=#{id}")User findById(int id);@Select("select * from user")List<User> findAll();
}

加载映射关系

原本在sqlMapConfig.xml文件中的加载映射文件修改为加载映射关系:

<!-- 加载映射关系 -->
<mappers><package name="com.example.demo.mapper"/>
</mappers>

测试代码

原本数据库中的内容:
在这里插入图片描述

package com.example.demo;import com.example.demo.domain.User;
import com.example.demo.mapper.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;public class DemoApplication {public static void main(String[] args) throws IOException {
//        1. 创建SqlSessionFactoryBuilder对象SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//        2. 加载SqlMapConfig.xml配置文件InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
//        3. 创建SqlSessionFactory对象SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
//        4. 获取SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//        增加User信息User saveUser = new User();saveUser.setUsername("newUser");saveUser.setPassword("aaaaaa");saveUser.setBirthday(new Date());mapper.save(saveUser);
//        删除User信息int deleteUserId = 3;mapper.delete(deleteUserId);
//        修改User信息User updateUser = new User();updateUser.setId(2);updateUser.setUsername("ccc");updateUser.setPassword("1234567update");mapper.update(updateUser);
//        根据Id查询UserUser user = mapper.findById(1);System.out.println(user);
//        查询所有userList<User> userList = mapper.findAll();System.out.println(userList);sqlSession.commit();//        6. 释放资源sqlSession.close();}
}

打印的信息:
在这里插入图片描述

更新后的内容:
在这里插入图片描述

3. MyBatis的注解实现复杂映射开发

在这里插入图片描述
此处对应于【Spring集成MyBatis】MyBatis的多表查询的内容,来写一下对应的注解实现。

一对一操作的实现

原本基于配置是这么写的

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.dao.OrderMapper"><resultMap id="orderMap" type="com.example.demo.domain.Order">
<!--        手动指定字段与实体属性的映射关系-->
<!--        column:数据表的字段名称-->
<!--        property:实体的属性名称--><id column="oid" property="id"></id><result column="ordertime" property="orderTime"></result><result column="total" property="total"></result><result column="uid" property="user.id"></result><result column="username" property="user.username"></result><result column="password" property="user.password"></result><result column="birthday" property="user.birthday"></result></resultMap><select id="findAll" resultMap="orderMap">SELECT *, o.id `orderid`, u.id `userid` FROM `order` o, `user` u WHERE o.uid=u.id</select></mapper>

使用注解后如下修改

package com.example.demo.mapper;import com.example.demo.domain.Order;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;import java.util.List;public interface OrderMapper {@Select("select *, o.id oid from `order` o, user u where o.uid=u.id")@Results({@Result(column = "oid", property = "id"),@Result(column = "ordertime", property = "orderTime"),@Result(column = "total", property = "total"),@Result(column = "uid", property = "user.id"),@Result(column = "username", property = "user.username"),@Result(column = "password", property = "user.password")})List<Order> findAll();}

一对一操作实现的第二种方式

其中,在要封装的User对象中,我们可以在@Result注解中写明属性名称、数据库查询到的值、要封装的实体类型等等等,有点类似于之前的注解中的那些属性,不同的事这里通过一个@One来指定通过哪个接口的方法来获得对应的数据,这时候会将column的值注入到这个方法中来获得具体的结果
也就是,首先使用

select * from `order`

来查询出order下的所有信息,包括id、ordertime、total、uid,接着,我们需要根据里面的uid可以查出对应的User信息并封装到Order实体类下的user属性中

select * from `user` where id=(上面查询结果的所有uid)

这里就需要在@Result注解中进一步指定property、column、javaType、one(由于是一对一所以使用one,一对多使用many)

package com.example.demo.mapper;import com.example.demo.domain.Order;
import com.example.demo.domain.User;
import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;import java.util.List;public interface OrderMapper {@Select("select * from `order`")@Results({@Result(column = "id", property = "id"),@Result(column = "ordertime", property = "orderTime"),@Result(column = "total", property = "total"),@Result(property = "user", // 要封装的属性名称column = "uid", // 根据哪个字段去查询user表的数值javaType = User.class, // 要封装的实体类型// select属性 代表查询哪个接口的方法获得数据one = @One(select = "com.example.demo.mapper.UserMapper.findById"))})List<Order> findAll();}

以上两种一对一操作的测试代码:

package com.example.demo;import com.example.demo.domain.Order;
import com.example.demo.domain.User;
import com.example.demo.mapper.OrderMapper;
import com.example.demo.mapper.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;public class DemoApplication {public static void main(String[] args) throws IOException {
//        1. 创建SqlSessionFactoryBuilder对象SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//        2. 加载SqlMapConfig.xml配置文件InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
//        3. 创建SqlSessionFactory对象SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
//        4. 获取SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);List<Order> orderList = orderMapper.findAll();for (Order order : orderList) {System.out.println(order);}//        6. 释放资源sqlSession.close();}
}

结果:
在这里插入图片描述

一对多操作的实现

查询User对应的订单,和【Spring集成MyBatis】MyBatis的多表查询中一样,首先需要再User里面加上一个orderList属性,用于封装所有的订单,并写好对应的set、get方法以及对应的toString方法。
类似于一对一操作的第二种实现方式,我们需要在@Result里面指定property、column、javaType,由于返回的是List,就不用one而用many
首先查询出所有的用户,并在用户下面封装其订单列表。
通过

select * from user

查出了用户的id,username,password,birthday的信息,我们需要根据里面的id到order表里查询对应的订单

select * from `order` where uid=(上面user查询出来的所有id)

即再通过一个@Result注解指定根据uid查询订单的方法。目前Order类里还没有根据uid查询订单的方法,所以我们需要再去实现一下根据uid查询订单的方法
在OrderMapper里写:

@Select("select * from `order` where uid=#{id}")
List<Order> findByUid(int id);

在UserMapper里写根据userid查询指定订单

@Select("select * from user")
@Results({@Result(column = "id", property = "id"),@Result(column = "username", property = "username"),@Result(column = "password", property = "password"),@Result(column = "birthday", property = "birthday"),@Result(property = "orderList",column = "id",javaType = List.class,many = @Many(select = "com.example.demo.OrderMapper.findByUid"))
})
List<User> findUserAndOrderAll();

测试:

package com.example.demo;import com.example.demo.domain.User;
import com.example.demo.mapper.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;
import java.util.List;public class DemoApplication {public static void main(String[] args) throws IOException {
//        1. 创建SqlSessionFactoryBuilder对象SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//        2. 加载SqlMapConfig.xml配置文件InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
//        3. 创建SqlSessionFactory对象SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
//        4. 获取SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);List<User> userList = mapper.findUserAndOrderAll();for (User user : userList) {System.out.println(user);}//        6. 释放资源sqlSession.close();}
}

查询出来的结果如下:
在这里插入图片描述

多对多操作实现

查询User对应的角色,和【Spring集成MyBatis】MyBatis的多表查询中一样,首先需要再User里面加上一个roleList属性,用于封装所有的角色,并写好对应的set、get方法以及对应的toString方法。
实现过程如下:
先查询所有的User信息

select * from USER

根据userid查询所有的对应的role及其信息

select * from user_role ur, role r where ur.roleId=r.id and userid=(上面查出来的所有id)

那么首先我们需要建立roleMapper,并在RoleMapper中写上对应的查询语句:

package com.example.demo.mapper;import com.example.demo.domain.Role;
import org.apache.ibatis.annotations.Select;import java.util.List;public interface RoleMapper {@Select("select * from user_role ur, role r where ur.roleId=r.id and userid=#{id}")List<Role> findByUid(int id);
}

接着,在UserMapper中类似一对多一样补充如下方法:

@Select("select * from User")
@Results({@Result(column = "id", property = "id"),@Result(column = "username", property = "username"),@Result(column = "password", property = "password"),@Result(column = "birthday", property = "birthday"),@Result(property = "roleList",column = "id",javaType = List.class,many = @Many(select = "com.example.demo.mapper.RoleMapper.findByUid"))
})
List<User> findUserAndRoleAll();

最后测试:

package com.example.demo;import com.example.demo.domain.User;
import com.example.demo.mapper.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;
import java.util.List;public class DemoApplication {public static void main(String[] args) throws IOException {
//        1. 创建SqlSessionFactoryBuilder对象SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//        2. 加载SqlMapConfig.xml配置文件InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
//        3. 创建SqlSessionFactory对象SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
//        4. 获取SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);List<User> userList = mapper.findUserAndRoleAll();for (User user : userList) {System.out.println(user);}//        6. 释放资源sqlSession.close();}
}

结果如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/171570.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux加强篇004-Vim编辑器与Shell命令脚本

目录 前言 1. Vim文本编辑器 1.1 编写简单文档 1.2 配置主机名称 1.3 配置网卡信息 1.4 配置软件仓库 2. 编写Shell脚本 2.1 编写简单的脚本 2.2 接收用户的参数 2.3 判断用户的参数 3. 流程控制语句 3.1 if条件测试语句 3.2 for条件循环语句 3.3 while条件循环语…

【开源】基于JAVA的高校学院网站

项目编号&#xff1a; S 020 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S020&#xff0c;文末获取源码。} 项目编号&#xff1a;S020&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 学院院系模块2.2 竞赛报名模块2.3 教…

Postman如何使用(三):使用数据文件

数据文件是非常强大的方式使用不同的测试数据来测试我们的API&#xff0c;以检查它们是否在各种情况下都能正常运行。我们可以认为数据文件是“Collection Runner”中每个请求的参数。下面&#xff0c;我们通过一个例子来说明如何使用数据文件。 这篇文章需要结合下面两个文件进…

史上最全前端知识点+高频面试题合集,十二大专题,命中率高达95%

前言&#xff1a; 下面分享一些关于阿里&#xff0c;美团&#xff0c;深信服等公司的面经&#xff0c;供大家参考一下。大家也可以去收集一些其他的面试题&#xff0c;可以通过面试题来看看自己有哪里不足。也可以了解自己想去的公司会问什么问题&#xff0c;进行有针对的复习。…

《数据结构与算法之美》读书笔记2

链表操作的技巧 1.理解指针 将摸个变量赋值给指针&#xff0c;实际上就是将这个变量的地址赋给指针&#xff0c;或者&#xff0c;指针中存储了这个变量的地址&#xff0c;指向了这个变量&#xff0c;所以可以通过指针找到这个变量。 2.内存泄漏或指针丢失 删除链表节点时&a…

人工智能|机器学习——循环神经网络的简洁实现

循环神经网络的简洁实现 如何使用深度学习框架的高级API提供的函数更有效地实现相同的语言模型。 我们仍然从读取时光机器数据集开始。 import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2lbatch_size, num_steps 32, 35 t…

itop4412移植lrzsz工具踩坑笔记

4412开发板在传输文件一直用的都是tftp文件传输&#xff0c;但这样效率有点慢&#xff0c;平常在linux上习惯用lrzsz工具来传输文件&#xff0c;特此记录下&#xff0c;因为不熟悉linux编译 踩坑了很多地方 在操作前 我们的虚拟机要线安装好编译环境 下载lrzsz源码&#xff0…

一起学docker系列之十docker安装tomcat实践

目录 前言1 安装tomcat的步骤步骤 1: 查找并拉取 Tomcat 镜像步骤 2: 运行 Tomcat 容器步骤 3: 管理 Tomcat 容器步骤 4: 访问 Tomcat 首页 2 解决访问首页的404访问不到的问题2.1 Tomcat 10 的默认设置问题2.2 端口映射或防火墙问题 3 推荐使用 Tomcat 8.5 版本总结 前言 当安…

【华为OD题库-037】跳房子2-java

题目 跳房子&#xff0c;也叫跳飞机&#xff0c;是一种世界性的儿童游戏游戏。参与者需要分多个回合按顺序跳到第1格直到房子的最后一格&#xff0c;然后获得一次选房子的机会&#xff0c;直到所有房子被选完&#xff0c;房子最多的人获胜。 跳房子的过程中&#xff0c;如果有踩…

【Docker】从零开始:11.Harbor搭建企业镜像仓库

【Docker】从零开始&#xff1a;11.Harbor搭建企业镜像仓库 1. Harbor介绍2. 软硬件要求(1). 硬件要求(2). 软件要求 3.Harbor优势4.Harbor的误区5.Harbor的几种安装方式6.在线安装(1).安装composer(2).配置内核参数,开启路由转发(3).下载安装包并解压(4).创建并修改配置文件(5…

python+pytest接口自动化(1)-接口测试基础

一般我们所说的接口即API&#xff0c;那什么又是API呢&#xff0c;百度给的定义如下&#xff1a; API&#xff08;Application Programming Interface&#xff0c;应用程序接口&#xff09;是一些预先定义的接口&#xff08;如函数、HTTP接口&#xff09;&#xff0c;或指软件系…

3款免费的语音视频转文本AI神器

最近有很多粉丝让我出一期关于语音转文本的免费AI神器&#xff0c;毕竟这类工具在学习和工作中经常会用到&#xff0c;那今天就给大家安排。 我亲测了好几款软件之后&#xff0c;最终评选留下了三款 剪映hugging face飞书妙记 接下来一一给大家讲解 1.剪映 剪映其实是一款视…

引用、动态内存分配、函数、结构体

引用 定义和初始化 **数据类型 &引用名 目标名;**引用和目标共用同一片空间&#xff08;相当于对一片空间取别名&#xff09;。 引用的底层实现&#xff1a;数据类型 * const p&#xff1b; ------> 常指针 int const *p; -----> 修饰 *p const int *p; ----->…

stm32实现0.96oled图片显示,菜单功能

stm32实现0.96oled图片显示&#xff0c;菜单功能 功能展示简介代码介绍oled.coled.holedfont.h&#xff08;字库文件&#xff09;main函数 代码思路讲解 本期内容&#xff0c;我们将学习0.96寸oled的进阶使用&#xff0c;展示图片&#xff0c;实现菜单切换等功能&#xff0c;关…

QT visual stdio加载动态库报错126问题

报错126是找不到指定的模块 QT 查看构建目录&#xff0c;将依赖的动态库放到该目录下即可成功 visual stdio将依赖的动态库放到运行目录 在vs中使用导出类的动态库时&#xff0c;不但需要将对应的.dll放到对应的目录下&#xff0c;还需要将该动态库对应的.lib添加到如下配置才…

【SAS Planet 下载地图瓦片】

SAS Planet是一位俄罗斯爱好者创建的的开源应用&#xff0c;该应用可以浏览与下载主流网络地图&#xff0c;包括Google地图、Google地球、Bing地图、Esri 地图、Yandex地图等&#xff0c;支持100多图源。 安装包下载地址&#xff1a;https://www.sasgis.org/download/ github…

337. 打家劫舍III (二叉树)

题目 题解 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution:def rob(self, root: Optional[TreeNode]) ->…

指针的进阶

重中之重&#xff1a; 目录 1.字符指针&#xff1a; 2.指针数组 3.数组指针 4.数组参数、指针参数 5.函数指针 1.字符指针&#xff1a; 一般实现&#xff1a; int main() {char ch w;char *pc &ch;*pc w;return 0; } 二班实现&#xff1a; int main() {const c…

什么是闭包和作用域链?

1. 什么是闭包 闭包指的是那些引用了另一个函数作用域中变量的函数&#xff0c;通常是在嵌套函数中实现的。 举个栗子&#xff0c;createCounter 接受一个参数 n&#xff0c;然后返回一个匿名函数&#xff0c;这个匿名函数是闭包&#xff0c;它可以访问外部函数 createCounte…

智能优化算法应用:基于鲸鱼算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于鲸鱼算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于鲸鱼算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.鲸鱼算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…