【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.hqwc.cn/news/217749.html

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

相关文章

张弛声音变现课,枪战电影高能量、快速节奏

在执行枪战片的声音配音任务时&#xff0c;配音员应该致力于传递出戏剧性的紧张氛围与动作场面的激烈感。枪战场景往往是高能量、快速节奏的&#xff0c;这就要求配音不仅要与视觉动作紧密结合&#xff0c;还要通过声音来增强动作的逼真度和观众的紧迫感。以下是针对枪战电影进…

科研/比赛必备工具及系列笔记集合

科研/比赛必备工具及系列笔记集合 零、前言一、常用工具系列1.1 笔记平台使用感受系列1.2 常用开发平台系列 二、论文系列2.1 检索工具系列2.2 投稿调研系列2.3 常见国际期刊/会议2.4 常见中文核心期刊/会议 三、文献系列3.1 画图工具系列3.2 翻译工具系列3.3 英文纠正系列3.4 …

【刷题宝典NO.5】

有效的括号 https://leetcode.cn/problems/valid-parentheses/ 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必…

pat实现基于邻接表表示的深度优先遍历[含非递归写法]

文章目录 1.递归2.非递归 1.递归 void DFS(ALGraph G, int v) {visited[v] 1;printf("%c ", G.vertices[v].data);for (ArcNode* cur G.vertices[v].firstarc; cur ! nullptr; cur cur->nextarc){if (!visited[cur->adjvex])DFS(G, cur->adjvex);} }2.非…

【MATLAB】VMD分解+FFT+HHT组合算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 VMD&#xff08;Variational Mode Decomposition&#xff09;是一种信号分解方法&#xff0c;基于HHT&#xff08;Hilbert-Huang Transform&#xff0c;希尔伯特-黄变换&#xff09;。HH…

探究Kafka原理-4.API使用

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码、Kafka原理&#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44…

NX二次开发UF_CURVE_ask_int_parms 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_ask_int_parms Defined in: uf_curve.h int UF_CURVE_ask_int_parms(tag_t int_curve_object, int * num_objects_set_1, tag_t * * object_set_1, int * num_objects_set_…

Qt 软件调试(二)使用dump捕获崩溃信息

Qt应用程序异常崩溃该怎么办&#xff0c;生成dump文件再回溯分析&#xff0c;可以快速且准确的帮助我们定位到崩溃的点。那么&#xff0c;本章我们分享下如何在Qt中生成dump文件。 一、使用minudump捕获崩溃信息 #include <QCoreApplication> #include <QDir> #i…

Mysql数据库 20.DCL数据控制语言

因这类SQL语言开发人员操作较少&#xff0c;主要是数据库管理员&#xff08;DBA&#xff09;使用&#xff0c;所以前文没有提及&#xff0c;这篇文章进行补充说明 DCL数据控制语言 用来管理数据库用户&#xff0c;控制数据库的访问权限 1.管理用户 1.1 查询用户 select * f…

AI和人工智能与机器学习全景报告

今天分享的是AI系列深度研究报告&#xff1a;《AI和人工智能与机器学习全景报告》。 &#xff08;报告出品方&#xff1a;appen&#xff09; 报告共计&#xff1a;30页 获取 数据获取仍是AI应用构建团队的主要瓶颈。 原因各不相同。例如&#xff0c;特定用例的数据可能不足…

【仿写实现move函数】

仿写实现move函数 一、值的类型 1.左值 描述&#xff1a;能够取地址的值成为左值 int a 10; const int b 15; int *pa &a; const int *pb &b;2.纯右值 描述&#xff1a;赤裸裸的字面值 eg(false , 3 , 12.23等) int a 13; int *p &a; //取a的地址 int …

数仓中数据清洗的方法

在数据采集的过程中&#xff0c;需要从不同渠道获取数据并汇集在数仓中&#xff0c;采集的原始数据首先需要进行解析&#xff0c;然后对不准确、不完整、不合理、格式、字符等不规范数据进行过滤清洗&#xff0c;清洗过的数据才能更加符合需求&#xff0c;从而使后续的数据分析…