Mybatis全网最详细教程(纯注解编程),包看包会! 您所在的位置:网站首页 mybatis注解一对一查询 Mybatis全网最详细教程(纯注解编程),包看包会!

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

2024-07-17 09:39| 来源: 网络整理| 查看: 265

Mybatis的注解开发

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

private UserMapper sm; @Before public 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); //使用哪个接口就根据实际情况调用就OK sm = 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; @Before public 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表的相关操作 @Test public void save() { User user1 = new User(); user1.setUsername("尼古拉斯"); user1.setPassword("abc"); user1.setBirthday(LocalDateTime.now()); sm.saveUser(user1); } @Test public void update() { User user1 = new User(); user1.setId(13); user1.setUsername("尼古拉斯·赵四"); user1.setPassword("123"); user1.setBirthday(LocalDateTime.now()); sm.updateUser(user1); } @Test public void delete() { sm.deleteUser(13); } @Test public void findUserById() { User user = sm.findUserById(3); log.debug(String.valueOf(user)); } @Test public void findUserAll() { List 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: [[email protected]] * @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: [[email protected]] * @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 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 findOrderALl(); UserMapper public interface UserMapper { @Select("select * from test.user where id=#{id}") public User findUserById(int id); } 6. 测试结果 @Test public void findOrderAll() { List 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: [[email protected]] * @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 orderList; } /** * @Author: [seim] * @emil: [[email protected]] * @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 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 findUserAndOrderAll(); OrderMapper @Select("select * from orders where uid=#{uid}") public List findByUid(int uid); 2.6 测试结果 @Test public void findUserAndOrderAll(){ List 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: [[email protected]] * @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: [[email protected]] * @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 orderList; //表示当前用户具有的角色 private List roleList; } 3.4添加UserMapper接口方法 public List 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 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 findRoleByUid(int uid); 3.6 测试结果 @Test public void findUserAndRoleALl(){ List all = sm.findUserAndRoleALl(); for (User user : all) { log.debug(String.valueOf(user)); } }


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有