服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - Java Mybatis框架多表操作与注解开发详解分析

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

2022-03-03 00:36龍弟-idea Java教程

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO为数据库中

一对一查询

一对一查询的模型

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

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

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框架多表操作与注解开发详解分析

到此这篇关于Java Mybatis框架多表操作与注解开发详解分析的文章就介绍到这了,更多相关Java Mybatis内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/weixin_48838340/article/details/120919790

延伸 · 阅读

精彩推荐
  • Java教程Java反应式框架Reactor中的Mono和Flux

    Java反应式框架Reactor中的Mono和Flux

    这篇文章主要介绍了Java反应式框架Reactor中的Mono和Flux,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...

    码农小胖哥9802021-10-21
  • Java教程详解Spring Boot中MyBatis的使用方法

    详解Spring Boot中MyBatis的使用方法

    mybatis初期使用比较麻烦,需要各种配置文件、实体类、dao层映射关联、还有一大推其它配置。当然mybatis也发现了这种弊端。下面通过本文给大家详细介绍...

    winner_07152532020-12-04
  • Java教程SpringBoot整合Apache Ignite的实现

    SpringBoot整合Apache Ignite的实现

    本文主要介绍了SpringBoot整合Apache Ignite的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    DluT_eDdy10022022-02-21
  • Java教程mybatis中insert主键ID获取和多参数传递的示例代码

    mybatis中insert主键ID获取和多参数传递的示例代码

    这篇文章主要介绍了mybatis中insert主键ID获取和多参数传递的示例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋...

    Dark_King_8802021-08-27
  • Java教程java实现抖音代码舞源码

    java实现抖音代码舞源码

    这篇文章主要为大家详细介绍了java实现抖音代码舞的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    cole_白9342021-07-31
  • Java教程java变量的区别浅析

    java变量的区别浅析

    对于java的变量天天见到,但有时候别人问起它们的区别有时候也说不全,所以就找了些资料整理了整理... ...

    java教程网3562019-10-24
  • Java教程一篇文章带你深入了解Java对象与Java类

    一篇文章带你深入了解Java对象与Java类

    这篇文章主要给大家介绍了关于java中类和对象的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋...

    KookNut394622021-11-01
  • Java教程Sentinel实现动态配置的集群流控的方法

    Sentinel实现动态配置的集群流控的方法

    这篇文章主要介绍了Sentinel实现动态配置的集群流控,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...

    程序猿小亮4782021-09-03