Mybatis—注解开发

Mybatis的注解开发

MyBatis的常用注解

这几年来注解开发越来越流行,Mybatis也可以使用注解开发方式,这样我们就可以减少编写Mapper映射文件了。

@Insert:实现新增

@Update:实现更新

@Delete:实现删除

@Select:实现查询

@Result:实现结果集封装

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

@One:实现一对一结果集封装

@Many:实现一对多结果集封装

MyBatis的增删改查

我们完成简单的user表的增删改查的操作
修改MyBatis的核心配置文件,我们使用了注解替代的映射文件,所以我们只需要加载使用了注解的Mapper接口即可

<mappers><!--扫描使用注解的类--><mapper class="com.itheima.mapper.UserMapper"></mapper>
</mappers>

或者指定扫描包含映射关系的接口所在的包也可以

<mappers><!--扫描使用注解的类所在的包--><package name="com.itheima.mapper"></package>
</mappers>
    userMapper mapper;@Beforepublic void before(){InputStream resourceAsStream = null;try {resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");} catch (IOException ioException) {ioException.printStackTrace();}SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(resourceAsStream);SqlSession sqlSession = sqlSessionFactory.openSession(true);mapper = sqlSession.getMapper(userMapper.class);}@Testpublic void tset4() {User user = new User();user.setUsername("cx");user.setPassword("159");mapper.add(user);}@Testpublic void tset5() {mapper.delete(5);}@Testpublic void tset6() {User user = new User();user.setId(4);user.setPassword("159");mapper.update(user);}@Testpublic void tset7() {System.out.println(mapper.findById(1));}
public interface userMapper {@Select(" select * from  user")public List<User> findAll();@Select("select * from  user where id=#{id}")public User findById(int i);@Insert(" insert into user values (#{id},#{username},#{password},#{birthday})")public void add(User user);@Update(" update user set password=#{password} where id=#{id}")public void update(User user);@Delete("delete from user where id=#{id}")public void delete(int i);}

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

实现复杂关系映射之前我们可以在映射文件中通过配置来实现,使用注解开发后,我们可以使用@Results注解,@Result注解,@One注解,@Many注解组合完成复杂关系的配置

一对一查询

一对一查询的模型

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

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

创建Order和User实体
public class Order {private int id;private Date ordertime;private double total;//代表当前订单从属于哪一个客户private User user;
}public class User {private int id;private String username;private String password;private Date birthday;}
创建OrderMapper接口
public interface OrderMapper {List<Order> findAll();
}
使用注解配置Mapper
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.controller.userMapper.findById"))})List<Order> findAll();
}
测试结果
    @Testpublic void tset3() {InputStream resourceAsStream = null;try {resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");} catch (IOException ioException) {ioException.printStackTrace();}SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(resourceAsStream);SqlSession sqlSession = sqlSessionFactory.openSession(true);OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);System.out.println(mapper.findAll());}

一对多查询

一对多查询的模型

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

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

修改User实体
public class Order {private int id;private Date ordertime;private double total;//代表当前订单从属于哪一个客户private User user;
}public class User {private int id;private String username;private String password;private Date birthday;//代表当前用户具备哪些订单private List<Order> orderList;
}
创建UserMapper接口
List<User> findAllUserAndOrder();
使用注解配置Mapper
    @Select( "select * from user")@Results({@Result(property = "username" ,column = "username"),@Result(property = "password",column = "password"),@Result(property = "birthday" ,column = "birthday"),@Result(id=true,property = "id",column = "id"),@Result(property = "orderList",column = "id",javaType = List.class,many = @Many(select = "com.controller.OrderMapper.findByUid"))})public  List<User> findAllUserAndOrder();
    @Select("select * from  orders where uid=#{uid}")Order findByUid(int i);
测试结果
    userMapper mapper;@Beforepublic void before(){InputStream resourceAsStream = null;try {resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");} catch (IOException ioException) {ioException.printStackTrace();}SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(resourceAsStream);SqlSession sqlSession = sqlSessionFactory.openSession(true);mapper = sqlSession.getMapper(userMapper.class);}  @Testpublic void tset7() {System.out.println(mapper.findAllUserAndOrder());}

多对多查询

多对多查询的模型

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

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

public class User {private int id;private String username;private String password;private Date birthday;//代表当前用户具备哪些订单private List<Order> orderList;//代表当前用户具备哪些角色private List<Role> roleList;
}public class Role {private int id;private String rolename;}
添加UserMapper接口方法
List<User> findAllUserAndRole();
使用注解配置Mapper
    @Select( "select * from user")@Results({@Result(property = "username" ,column = "username"),@Result(property = "password",column = "password"),@Result(property = "birthday" ,column = "birthday"),@Result(id=true,property = "id",column = "id"),@Result(property = "roleList",column = "id",javaType = List.class,many = @Many(select = "com.controller.RoleMapper.findById"))})public  List<User> findAllUserAndRole();
public interface RoleMapper {@Select("select r.* from sys_user_role ur,sys_role r where ur.roleid=r.id and #{id}=ur.userid")List<Role> findById(int i);
}
测试结果
    @Beforepublic void before(){InputStream resourceAsStream = null;try {resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");} catch (IOException ioException) {ioException.printStackTrace();}SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(resourceAsStream);SqlSession sqlSession = sqlSessionFactory.openSession(true);mapper = sqlSession.getMapper(userMapper.class);}@Testpublic void tset7() {System.out.println(mapper.findAllUserAndRole());}

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

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

相关文章

道路工程结构计算软件_我从软件工程到产品管理的道路

道路工程结构计算软件by Sari Harrison莎莉哈里森(Sari Harrison) 我从软件工程到产品管理的道路 (My path from software engineering to product management) 以及一些有关如何自己做的建议 (And some advice on how to do it yourself) I am often asked how to make the m…

Vue 指令

下面列举VUE的HTML页面模板指令&#xff0c;并进行分别练习。 1. templates 2. v-if, v-for <div idapp><ol><li v-for"todo in todos>{{ todo.text}}</li></ol> </div><script>app new Vue({ el: #app, data: { return…

iOS-FMDB

2019独角兽企业重金招聘Python工程师标准>>> #import <Foundation/Foundation.h> #import <FMDatabase.h> #import "MyModel.h"interface FMDBManager : NSObject {FMDatabase *_dataBase; }(instancetype)shareInstance;- (BOOL)insert:(MyM…

解决朋友圈压缩_朋友中最有趣的朋友[已解决]

解决朋友圈压缩We live in uncertain times.我们生活在不确定的时代。 We don’t know when we’re going back to school or the office. We don’t know when we’ll be able to sit inside at a restaurant. We don’t even know when we’ll be able to mosh at a Korn co…

西安项目分析

西安物流 西安高考补习 西安艺考 转载于:https://www.cnblogs.com/wpxuexi/p/7294269.html

MapServer应用开发平台示例

MapServer为当前开源WebGIS的应用代表&#xff0c;在西方社会应用面极为广泛&#xff0c;现介绍几个基于它的开源应用平台。 1.GeoMOOSE GeoMoose is a Web Client Javascript Framework for displaying distributed cartographic data. Among its many strengths, it can hand…

leetcode 995. K 连续位的最小翻转次数(贪心算法)

在仅包含 0 和 1 的数组 A 中&#xff0c;一次 K 位翻转包括选择一个长度为 K 的&#xff08;连续&#xff09;子数组&#xff0c;同时将子数组中的每个 0 更改为 1&#xff0c;而每个 1 更改为 0。 返回所需的 K 位翻转的最小次数&#xff0c;以便数组没有值为 0 的元素。如果…

kotlin数据库_如何在Kotlin应用程序中使用Xodus数据库

kotlin数据库I want to show you how to use one of my favorite database choices for Kotlin applications. Namely, Xodus. Why do I like using Xodus for Kotlin applications? Well, here are a couple of its selling points:我想向您展示如何在Kotlin应用程序中使用我…

使用route add添加路由,使两个网卡同时访问内外网

route add命令格式&#xff1a;route [-f] [-p] [Command] [Destination] [mask Netmask] [Gateway] [metric Metric] [if Interface] 通过配置电脑的静态路由来实现同时访问内外网的。电脑的网络IP配置不用变&#xff0c;两个网卡都按照正常配置&#xff08;都配置IP地址、子网…

基于JavaConfig配置的Spring MVC的构建

上一篇讲了基于XML配置的构建&#xff0c;这一篇讲一讲基于JavaConfig的构建。为什么要写这篇文章&#xff0c;因为基于xml配置的构建&#xff0c;本人认为很麻烦&#xff0c;要写一堆的配置&#xff0c;不够简洁&#xff0c;而基于JavacConfig配置的构建符合程序员的编码习惯&…

pymc3 贝叶斯线性回归_使用PyMC3进行贝叶斯媒体混合建模,带来乐趣和收益

pymc3 贝叶斯线性回归Michael Johns, Zhenyu Wang, Bruno Dupont, and Luca Fiaschi迈克尔约翰斯&#xff0c;王振宇&#xff0c;布鲁诺杜邦和卢卡菲亚斯基 “If you can’t measure it, you can’t manage it, or fix it”“如果无法衡量&#xff0c;就无法管理或修复它” –…

webkit中对incomplete type指针的处理技巧

近日在研究webkit的时候发现了一个函数 template<typename T> inline void deleteOwnedPtr(T* ptr) {typedef char known[sizeof(T) ? 1 : -1];if(sizeof(known))delete ptr; } 一开始对这个函数非常费解&#xff0c;为什么作者不直接 delete ptr; 通过上stackoverflow提…

leetcode 1004. 最大连续1的个数 III(滑动窗口)

给定一个由若干 0 和 1 组成的数组 A&#xff0c;我们最多可以将 K 个值从 0 变成 1 。 返回仅包含 1 的最长&#xff08;连续&#xff09;子数组的长度。 示例 1&#xff1a; 输入&#xff1a;A [1,1,1,0,0,0,1,1,1,1,0], K 2 输出&#xff1a;6 解释&#xff1a; [1,1,1…

我如何找到工作并找到理想的工作

By Julius Zerwick朱利叶斯泽威克(Julius Zerwick) This article is about how I went through my job hunt for a full time position as a software engineer in New York City and ended up with my dream job. I had spent two years building my skills and had aspirati…

synchronized 与 Lock 的那点事

synchronized 与 Lock 的那点事 最近在做一个监控系统&#xff0c;该系统主要包括对数据实时分析和存储两个部分&#xff0c;由于并发量比较高&#xff0c;所以不可避免的使用到了一些并发的知识。为了实现这些要求&#xff0c;后台使用一个队列作为缓存&#xff0c;对于请求只…

ols线性回归_普通最小二乘[OLS]方法使用于机器学习的简单线性回归变得容易

ols线性回归Hello Everyone!大家好&#xff01; I am super excited to be writing another article after a long time since my previous article was published.自从上一篇文章发表很长时间以来&#xff0c;我很高兴能写另一篇文章。 A Simple Linear Regression [SLR] is…

ubuntu安装配置jdk

先去 Oracle下载Linux下的JDK压缩包&#xff0c;我下载的是jdk-7u4-linux-i586.tar.gz文件&#xff0c;下好后直接解压Step1:# 将解压好的jdk1.7.0_04文件夹用最高权限复制到/usr/lib/jvm目录里sudo cp -r ~/jdk1.7.0_04/ /usr/lib/jvm/Step2:# 配置环境变量sudo gedit ~/.prof…

leetcode 697. 数组的度(hashmap)

给定一个非空且只包含非负数的整数数组 nums&#xff0c;数组的度的定义是指数组里任一元素出现频数的最大值。 你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组&#xff0c;返回其长度。 示例 1&#xff1a; 输入&#xff1a;[1, 2, 2, 3, 1] 输出&…

facebook机器学习_如何为您的页面创建Facebook Messenger机器人

facebook机器学习by Paul Pinard保罗皮纳德(Paul Pinard) 如何为您的页面创建Facebook Messenger机器人 (How to create a Facebook messenger bot for your page) When it comes to sharing your chatbot, Facebook Messenger is a must. We created a very easy step-by-ste…

Logstash配置语法及相关命令

配置结构以及插件位置 输入插件&#xff1a; input{ … } 过滤插件&#xff1a; filter{ … } 输出插件&#xff1a; output{ … } 数据类型 - Array users > [{id > 1,name > N1},{id > 2,name > N2}] - lists path > ["/var/log/messages"…