Java Mybatis框架多表操作与注解开发详解分析

作者:龍弟-idea 时间:2023-12-04 17:15:14 

一对一查询

一对一查询的模型

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

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

Java Mybatis框架多表操作与注解开发详解分析

一对一查询的语句

对应的sql语句: select * from orders o,user u where o.uid=u.id;查询的结果如下:

Java Mybatis框架多表操作与注解开发详解分析

创建Order和User实体

Java Mybatis框架多表操作与注解开发详解分析

创建OrderMapper接口


public interface OrderMapper {

//查询全部的方法
   public List<Order> findAll();
}

配置OrderMapper.xml


<?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.longdi.mapper.OrderMapper">

<resultMap id="orderMap" type="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>-->

<!--
           property: 当前实体(order)中的属性名称(private User user)
           javaType: 当前实体(order)中的属性的类型(User)
       -->
       <association property="user" javaType="user">
           <id column="uid" property="id"></id>
           <result column="username" property="username"></result>
           <result column="password" property="password"></result>
           <result column="birthday" property="birthday"></result>
       </association>

</resultMap>

<select id="findAll" resultMap="orderMap">
        SELECT *,o.id oid FROM orders o,USER u WHERE o.uid=u.id
   </select>

</mapper>

配置UserMapper.xml


<?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.longdi.mapper.UserMapper">

<resultMap id="userMap" type="user">
       <id column="uid" property="id"></id>
       <result column="username" property="username"></result>
       <result column="password" property="password"></result>
       <result column="birthday" property="birthday"></result>
       <!--配置集合信息
           property:集合名称
           ofType:当前集合中的数据类型
       -->
       <collection property="orderList" ofType="order">
           <!--封装order的数据-->
           <id column="oid" property="id"></id>
           <result column="ordertime" property="ordertime"></result>
           <result column="total" property="total"></result>
       </collection>
   </resultMap>

<select id="findAll" resultMap="userMap">
       SELECT *,o.id oid FROM USER u,orders o WHERE u.id=o.uid
   </select>

<!--#############################################################################-->

<resultMap id="userRoleMap" type="user">
       <!--user的信息-->
       <id column="userId" property="id"></id>
       <result column="username" property="username"></result>
       <result column="password" property="password"></result>
       <result column="birthday" property="birthday"></result>
       <!--user内部的roleList信息-->
       <collection property="roleList" ofType="role">
           <id column="roleId" property="id"></id>
           <result column="roleName" property="roleName"></result>
           <result column="roleDesc" property="roleDesc"></result>
       </collection>
   </resultMap>

<select id="findUserAndRoleAll" resultMap="userRoleMap">
       SELECT * FROM USER u,sys_user_role ur,sys_role r WHERE u.id=ur.userId AND ur.roleId=r.id
   </select>

</mapper>

配置sqlMapConfig.xml


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

<!--通过properties标签加载外部properties文件-->
   <properties resource="jdbc.properties"></properties>

<!--自定义别名-->
   <typeAliases>
       <typeAlias type="com.longdi.domain.User" alias="user"></typeAlias>
       <typeAlias type="com.longdi.domain.Order" alias="order"></typeAlias>
       <typeAlias type="com.longdi.domain.Role" alias="role"></typeAlias>
   </typeAliases>

<!--数据源环境-->
   <environments default="developement">
       <environment id="developement">
           <transactionManager type="JDBC"></transactionManager>
           <dataSource type="POOLED">
               <property name="driver" value="${jdbc.driver}"/>
               <property name="url" value="${jdbc.url}"/>
               <property name="username" value="${jdbc.username}"/>
               <property name="password" value="${jdbc.password}"/>
           </dataSource>
       </environment>
   </environments>

<!--加载映射文件-->
   <mappers>
       <mapper resource="com/longdi/mapper/UserMapper.xml"></mapper>
       <mapper resource="com/longdi/mapper/OrderMapper.xml"></mapper>
   </mappers>
</configuration>

测试代码


   @Test
   public void test1() throws IOException {
       InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
       SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
       SqlSession sqlSession = sqlSessionFactory.openSession();

OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);
       List<Order> orderList = mapper.findAll();
       for (Order order : orderList) {
           System.out.println(order);
       }
       sqlSession.close();
   }

一对多查询

一对多查询模型

用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户一对多查询的需求:查询一个用户,与此同时查询出该用户具有的订单

Java Mybatis框架多表操作与注解开发详解分析

对应的sql语句: select *,o.id oid from user u left join orders o on u.id=o.uid;查询的结果如下:

Java Mybatis框架多表操作与注解开发详解分析

SELECT *,o.id oid FROM USER u, orders o WHERE u.id=o.uid

Java Mybatis框架多表操作与注解开发详解分析

修改User实体

Java Mybatis框架多表操作与注解开发详解分析

创建UserMapper接口

Java Mybatis框架多表操作与注解开发详解分析

配置UserMapper.xml
测试结果

Java Mybatis框架多表操作与注解开发详解分析

多对多查询

多对多查询的模型
用户表和角色表的关系为,一个用户有多个角色,一个角色被多个用户使用多对多查询的需求:查询用户同时查询出该用户的所有角色

Java Mybatis框架多表操作与注解开发详解分析

多对多查询的语句

对应的sql语句: select u.*,r.*,r.id rid from user u left join user_role ur on u.id=ur.user_idinner join role r on ur.role_id=r.id;
查询的结果如下:

Java Mybatis框架多表操作与注解开发详解分析

创建Role实体,修改User实体

Java Mybatis框架多表操作与注解开发详解分析

添加UserMapper接口方法

Java Mybatis框架多表操作与注解开发详解分析

配置UserMapper.xml(上面)
测试代码

Java Mybatis框架多表操作与注解开发详解分析

总结:

MyBatis多表配置方式:

一对一配置:使用<resultMap>做配置
一对多配置:使用<resultMap>+<collection>做配置

多对多配置:使用<resultMap>+<collection>做配置

Mybatis的注解开发

Mybatis的常用注解

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

Mybatis的增删查改


   private UserMapper mapper;

@Before
   public void before() throws IOException {
       InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
       SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
       SqlSession sqlSession = sqlSessionFactory.openSession(true);
       mapper = sqlSession.getMapper(UserMapper.class);
   }

  @Test
   public void testSave(){
       User user = new User();
       user.setUsername("tom");
       user.setPassword("abc");
       mapper.save(user);
   }

@Test
   public void testUpdate(){
       User user = new User();
       user.setId(18);
       user.setUsername("lucy");
       user.setPassword("123");
       mapper.update(user);
   }

@Test
   public void testDelete(){
       mapper.delete(18);
   }

@Test
   public void testFindById(){
       User user = mapper.findById(2);
       System.out.println(user);
   }

@Test
   public void testFindAll(){
       List<User> all = mapper.findAll();
       for (User user : all) {
           System.out.println(user);
       }
   }

修改MyBatis的核心配置文件,我们使用了注解替代的映射文件,所以我们只需要加载使用了注解的Mapper接口即可


   <!--加载映射关系-->
   <mappers>
       <!--扫描使用注解的类-->
       <package name="com.longdi.mapper.UserMapper"></package>
   </mappers>

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


   <!--加载映射关系-->
   <mappers>
       <!--指定接口所在的包-->
       <package name="com.longdi.mapper"></package>
   </mappers>

UserMapper:


public interface UserMapper {

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

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

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

@Select("select * from user where id=#{id}")
   public User findById(int id);

@Select("select * from user")
   public List<User> findAll();

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

@Select("SELECT * FROM USER")
   @Results({
           @Result(id = true,column = "id",property = "id"),
           @Result(column = "username",property = "username"),
           @Result(column = "password",property = "password"),
           @Result(
                   property = "roleList",
                   column = "id",
                   javaType = List.class,
                   many = @Many(select = "com.longdi.mapper.RoleMapper.findByUid")
           )
   })
   public List<User> findUserAndRoleAll();

}

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

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

Java Mybatis框架多表操作与注解开发详解分析

Java Mybatis框架多表操作与注解开发详解分析

一对一查询(使用注解配置Mapper)

Java Mybatis框架多表操作与注解开发详解分析

测试代码:

Java Mybatis框架多表操作与注解开发详解分析

一对多查询(使用注解配置Mapper)

Java Mybatis框架多表操作与注解开发详解分析

测试代码;

Java Mybatis框架多表操作与注解开发详解分析

多对多查询(使用注解配置mapper)

Java Mybatis框架多表操作与注解开发详解分析

测试代码:

Java Mybatis框架多表操作与注解开发详解分析

来源:https://blog.csdn.net/weixin_48838340/article/details/120919790

标签:Java,Mybatis,多表操作,注解开发
0
投稿

猜你喜欢

  • springboot2.3 整合mybatis-plus 高级功能及用法详解

    2023-02-23 23:31:55
  • 利用反射获取Java类中的静态变量名及变量值的简单实例

    2022-12-09 17:56:06
  • Android中微信小程序支付倒计时功能

    2022-04-02 09:18:23
  • idea 有时提示找不到类或者符号的解决

    2023-11-29 04:10:43
  • Opencv图像处理之轮廓外背景颜色改变

    2022-02-17 01:33:34
  • SpringBoot配置Profile实现多环境支持

    2023-07-29 21:53:20
  • 在Spring环境中正确关闭线程池的姿势

    2023-11-25 08:07:29
  • Spring JPA联表查询之OneToOne源码详解

    2022-08-06 13:57:55
  • Java中id,pid格式数据转树和森林结构工具类实现

    2021-07-10 08:46:17
  • 探究Java常量本质及三种常量池(小结)

    2023-06-17 10:28:17
  • Android中使用Gson解析JSON数据的两种方法

    2021-10-13 23:25:39
  • java调用外部程序的方法及代码演示

    2023-11-13 22:42:55
  • 详解Flutter网络图片本地缓存的实现

    2023-08-18 19:44:43
  • 利用Java+Selenium+OpenCV模拟实现网页滑动验证

    2021-07-23 02:45:18
  • Winform之TextBox输入日期格式验证yyyy-mm-dd

    2023-04-14 21:35:05
  • springboot自定义Starter过程解析

    2023-07-24 22:24:55
  • 实例化JFileChooser对象报空指针异常问题的解决办法

    2023-10-05 11:36:18
  • java为何不能多继承的原因详解

    2023-10-12 04:45:00
  • Android官方下拉刷新控件SwipeRefreshLayout使用详解

    2021-11-27 16:38:33
  • Java 8 中 Function 接口使用方法介绍

    2022-12-08 23:54:39
  • asp之家 软件编程 m.aspxhome.com