Mybatis全网最详细教程(纯注解编程),包看包会!

2024-01-10 05:58

本文主要是介绍Mybatis全网最详细教程(纯注解编程),包看包会!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Mybatis的注解开发

说明:因为是纯注解,所以没有任何xml配置文件,只需要写一个before()方法,将配置代码放入即可,这里面的配置相当于sqlMapConfig.xml配置文件,后面直接调用即可,接口对应的xml不要,直接在接口上面注解sql语句就ok。如下

 private UserMapper sm;@Beforepublic void before() throws IOException {//建立数据源DruidDataSource ds = new DruidDataSource();Properties properties = new Properties();//ds.setDriverClassName();//ds.setUrl();//ds.setUsername();//ds.setPassword(); 这四行相当于properties文//作者这里使用的properties数据文件,也可以直接走编程方式properties.load(Resources.getResourceAsStream("jdbc.properties"));ds.setConnectProperties(properties);//相当于sql的核心配置文件JdbcTransactionFactory jdbcTransactionFactory = new JdbcTransactionFactory();Environment environment = new Environment("environment", jdbcTransactionFactory, ds);Configuration configuration = new Configuration(environment);configuration.addMappers("cn.seim.mapper");//添加分页插件(可用可不用)// PageInterceptor pi = new PageInterceptor();//  configuration.addInterceptor(pi);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);SqlSession sqlSession = sqlSessionFactory.openSession(true);//使用哪个接口就根据实际情况调用就OKsm = sqlSession.getMapper(UserMapper.class);//测试User表使用}

1.一对一查询

1.1 MyBatis的常用注解

这几年来注解开发越来越流行,Mybatis也可以使用注解开发方式,这样我们就可以减少编写Mapper
映射文件了。我们先围绕一些基本的CRUD来学习,再学习复杂映射多表操作。
@Insert:实现新增
@Update:实现更新
@Delete:实现删除
@Select:实现查询
@Result:实现结果集封装
@Results:可以与@Result 一起使用,封装多个结果集
@One:实现一对一结果集封装
@Many:实现一对多结果集封装

1.2 MyBatis的增删改查

完成简单的user表的增删改查的操作

@Slf4j
public class MybatisUserTest {private UserMapper sm;@Beforepublic void before() throws IOException {//建立数据源DruidDataSource ds = new DruidDataSource();Properties properties = new Properties();properties.load(Resources.getResourceAsStream("jdbc.properties"));ds.setConnectProperties(properties);//相当于sql的核心配置文件JdbcTransactionFactory jdbcTransactionFactory = new JdbcTransactionFactory();Environment environment = new Environment("environment", jdbcTransactionFactory, ds);Configuration configuration = new Configuration(environment);configuration.addMappers("cn.seim.mapper");//添加分页插件(可用可不用)// PageInterceptor pi = new PageInterceptor();//  configuration.addInterceptor(pi);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);SqlSession sqlSession = sqlSessionFactory.openSession(true);sm = sqlSession.getMapper(UserMapper.class);//测试User表使用}//user表的相关操作@Testpublic void save() {User user1 = new User();user1.setUsername("尼古拉斯");user1.setPassword("abc");user1.setBirthday(LocalDateTime.now());sm.saveUser(user1);}@Testpublic void update() {User user1 = new User();user1.setId(13);user1.setUsername("尼古拉斯·赵四");user1.setPassword("123");user1.setBirthday(LocalDateTime.now());sm.updateUser(user1);}@Testpublic void delete() {sm.deleteUser(13);}@Testpublic void findUserById() {User user = sm.findUserById(3);log.debug(String.valueOf(user));}@Testpublic void findUserAll() {List<User> all = sm.findUserAll();for (User user : all) {log.debug(String.valueOf(user));}}

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

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

注解说明
@Results代替的是标签该注解中可以使用单个@Result注解,也可以使用@Result集合。使用格式:@Results({@Result(),@Result()})或@Results(@Result())
@Resut代替了标签和标签@Result中属性介绍:column:数据库的列名property:需要装配的属性名one:需要使用的@One 注解(@Result(one=@One)()))many:需要使用的@Many 注解(@Result(many=@many)()))
@One (一对一)代替了 标签,是多表查询的关键,在注解中用来指定子查询返回单一对象。@One注解属性介绍:select: 指定用来多表查询的 sqlmapper使用格式:@Result(column=" “,property=”",one=@One(select=""))
@Many (多对一)代替了标签, 是是多表查询的关键,在注解中用来指定子查询返回对象集合。使用格式:@Result(property="",column="",many=@Many(select=""))

1.4 一对一查询

1. 一对一查询的模型

用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户
一对一查询的需求:查询一个订单,与此同时查询出该订单所属的用户
在这里插入图片描述

2. 一对一查询的语句

对应的sql语句:
select * from orders;
select * from user where id=查询出订单的uid;
在这里插入图片描述

3. 创建Order和User实体
/*** @Author: [seim]* @emil: [webseim@126.com]* @ClassName Order* @date 2021/7/15 21:49* @Version 15*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Order {private int id;private LocalDate ordertime;private double total;//表示当前订单属于哪一个用户private User user;
}
/*** @Author: [seim]* @emil: [webseim@126.com]* @ClassName User* @date 2021/7/15 16:45* @Version 15*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {private int id;private String username;private String password;private LocalDateTime birthday;
}
4. 创建OrderMapper接口
public interface OrderMapper {public List<Order> findOrderALl();
}
5. 使用注解配置Mapper
OrderMapper
//查询全部方法二(两张表分开查)
@Select("select *,o.id oid from test.orders o,test.user u where o.uid=u.id")
@Results({@Result(column = "oid",property = "id"),@Result(column = "ordertime",property = "ordertime"),@Result(column = "total",property = "total"),@Result(property = "user", //要封装的属性名称column = "uid",  //根据哪个字段来查user表的信息javaType = User.class, //要封装的实体类型one = @One(select = "cn.seim.mapper.UserMapper.findUserById"))
})
public List<Order> findOrderALl();
UserMapper
public interface UserMapper {@Select("select * from test.user where id=#{id}")public User findUserById(int id);
}
6. 测试结果
@Test
public void findOrderAll() {List<Order> orderALl = om.findOrderALl();for (Order order : orderALl) {log.debug(String.valueOf(order));}
}

在这里插入图片描述

2.一对多查询

2.1 一对多查询的模型

用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户
一对多查询的需求:查询一个用户,与此同时查询出该用户具有的订单
在这里插入图片描述

2.2 一对多查询的语句

对应的sql语句:
select * from user;
select * from orders where uid=查询出用户的id;
在这里插入图片描述

2.3 修改User、Order实体

在这里插入代码片/*** @Author: [seim]* @emil: [webseim@126.com]* @ClassName User* @date 2021/7/15 16:45* @Version 15*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {private int id;private String username;private String password;private LocalDateTime birthday;//表示当前用户具有的订单private List<Order> orderList;
}
/*** @Author: [seim]* @emil: [webseim@126.com]* @ClassName Order* @date 2021/7/15 21:49* @Version 15*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Order {private int id;private LocalDate ordertime;private double total;//表示当前订单属于哪一个用户private User user;
}

2.4 创建UserMapper接口

public interface UserMapper {public List<User> findUserAndOrderAll();
}

2.5 使用注解配置Mapper

UserMapper
@Select("select * from test.user")
@Results({@Result(id = true,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 = "cn.seim.mapper.OrderMapper.findByUid"))
})
public List<User> findUserAndOrderAll();
OrderMapper
@Select("select * from orders where uid=#{uid}")
public List<Order> findByUid(int uid);

2.6 测试结果

@Test
public  void findUserAndOrderAll(){List<User> all = sm.findUserAndOrderAll();for (User user : all) {log.debug(String.valueOf(user));}
}

3.多对多查询

3.1多对多查询的模型

用户表和角色表的关系为,一个用户有多个角色,一个角色被多个用户使用
多对多查询的需求:查询用户同时查询出该用户的所有角色
在这里插入图片描述

3.2 多对多查询的语句

对应的sql语句:
select * from user;
select * from role r,user_role ur where r.id=ur.role_id and ur.user_id=用户的id
在这里插入图片描述

3.3创建Role实体,修改User实体

/*** @Author: [seim]* @emil: [webseim@126.com]* @ClassName Role* @date 2021/7/16 9:41* @Version 15*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Role {private int id;private String roleName;private String roleDesc;
}
/*** @Author: [seim]* @emil: [webseim@126.com]* @ClassName User* @date 2021/7/15 16:45* @Version 15*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {private int id;private String username;private String password;private LocalDateTime birthday;//表示当前用户具有的订单private List<Order> orderList;//表示当前用户具有的角色private List<Role> roleList;
}

3.4添加UserMapper接口方法

public List<User> findUserAndRoleALl();

3.5使用注解配置Mapper

UserMapper
@Select("select * from user")
@Results({@Result(id = true,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 = "cn.seim.mapper.RoleMapper.findRoleByUid"))
})
public List<User> findUserAndRoleALl();
RoleMapper
@Select("select * from test.sys_user_role ur,test.sys_role r where ur.roleId=r.id and ur.userId=#{uid}")
public List<Role> findRoleByUid(int uid);

3.6 测试结果

@Test
public void findUserAndRoleALl(){List<User> all = sm.findUserAndRoleALl();for (User user : all) {log.debug(String.valueOf(user));}
}

这篇关于Mybatis全网最详细教程(纯注解编程),包看包会!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/589786

相关文章

VMware9.0详细安装

双击VMware-workstation-full-9.0.0-812388.exe文件: 直接点Next; 这里,我选择了Typical(标准安装)。 因为服务器上只要C盘,所以我选择安装在C盘下的vmware文件夹下面,然后点击Next; 这里我把√取消了,每次启动不检查更新。然后Next; 点击Next; 创建快捷方式等,点击Next; 继续Cont

持久层 技术选型如何决策?JPA,Hibernate,ibatis(mybatis)

转自:http://t.51jdy.cn/thread-259-1-1.html 持久层 是一个项目 后台 最重要的部分。他直接 决定了 数据读写的性能,业务编写的复杂度,数据结构(对象结构)等问题。 因此 架构师在考虑 使用那个持久层框架的时候 要考虑清楚。 选择的 标准: 1,项目的场景。 2,团队的技能掌握情况。 3,开发周期(开发效率)。 传统的 业务系统,通常业

零基础STM32单片机编程入门(一)初识STM32单片机

文章目录 一.概要二.单片机型号命名规则三.STM32F103系统架构四.STM32F103C8T6单片机启动流程五.STM32F103C8T6单片机主要外设资源六.编程过程中芯片数据手册的作用1.单片机外设资源情况2.STM32单片机内部框图3.STM32单片机管脚图4.STM32单片机每个管脚可配功能5.单片机功耗数据6.FALSH编程时间,擦写次数7.I/O高低电平电压表格8.外设接口

20.Spring5注解介绍

1.配置组件 Configure Components 注解名称说明@Configuration把一个类作为一个loC容 器 ,它的某个方法头上如果注册7@Bean , 就会作为这个Spring容器中的Bean@ComponentScan在配置类上添加@ComponentScan注解。该注解默认会扫描该类所在的包下所有的配置类,相当于之前的 <context:component-scan>@Sc

16.Spring前世今生与Spring编程思想

1.1.课程目标 1、通过对本章内容的学习,可以掌握Spring的基本架构及各子模块之间的依赖关系。 2、 了解Spring的发展历史,启发思维。 3、 对 Spring形成一个整体的认识,为之后的深入学习做铺垫。 4、 通过对本章内容的学习,可以了解Spring版本升级的规律,从而应用到自己的系统升级版本命名。 5、Spring编程思想总结。 1.2.内容定位 Spring使用经验

(超详细)YOLOV7改进-Soft-NMS(支持多种IoU变种选择)

1.在until/general.py文件最后加上下面代码 2.在general.py里面找到这代码,修改这两个地方 3.之后直接运行即可

SpringBoot集成Netty,Handler中@Autowired注解为空

最近建了个技术交流群,然后好多小伙伴都问关于Netty的问题,尤其今天的问题最特殊,功能大概是要在Netty接收消息时把数据写入数据库,那个小伙伴用的是 Spring Boot + MyBatis + Netty,所以就碰到了Handler中@Autowired注解为空的问题 参考了一些大神的博文,Spring Boot非controller使用@Autowired注解注入为null的问题,得到

Java注解详细总结

什么是注解?         Java注解是代码中的特殊标记,比如@Override、@Test等,作用是:让其他程序根据注解信息决定怎么执行该程序。         注解不光可以用在方法上,还可以用在类上、变量上、构造器上等位置。 自定义注解  现在我们自定义一个MyTest注解 public @interface MyTest{String aaa();boolean bbb()

Steam邮件推送内容有哪些?配置教程详解!

Steam邮件推送功能是否安全?如何个性化邮件推送内容? Steam作为全球最大的数字游戏分发平台之一,不仅提供了海量的游戏资源,还通过邮件推送为用户提供最新的游戏信息、促销活动和个性化推荐。AokSend将详细介绍Steam邮件推送的主要内容。 Steam邮件推送:促销优惠 每当平台举办大型促销活动,如夏季促销、冬季促销、黑色星期五等,用户都会收到邮件通知。这些邮件详细列出了打折游戏、

X-AnyLabeling使用教程

1.AI 模型自动分割标注使用教程 2.AI 模型自动目标检测标注使用教程