mybatis学习教程中级(六)一对一查询

简介: 1 复习引言从前面5章学习看完的同学,进入第6章,才真正开始中级学习了哦,里面会有一对多等学习     mybatis是一个持久层框架,是apache下的开源项目,前身是itbatis,是一个不完全的ORM框架,mybatis提供输入和输出的映射,需要程序员自己写sql语句,mybatis重点对sql语句的灵活操作。

1 复习引言

从前面5章学习看完的同学,进入第6章,才真正开始中级学习了哦,里面会有一对多等学习

     mybatis是一个持久层框架,是apache下的开源项目,前身是itbatis,是一个不完全的ORM框架,mybatis提供输入和输出的映射,需要程序员自己写sql语句,mybatis重点对sql语句的灵活操作。适合用于:需求变化频繁, 数据模型不固定的项目。


mybatis架构

SqlMapConfig.xml(名称不固定),配置内容:数据源、事务、propertiestypeAliasessettingsmapper配置。

SqlSessionFactory--会话工厂,作用是创建SqlSession,实际开发中以单例模式管理 SqlSessionFactory

SqlSession--会话,是一个面向用户(程序员)的接口,使用mapper代理方法开发是不需要程序员直接调用sqlSession的方法。是线程不安全,最佳适用场合方法体内。

mybatis开发dao的方法:

1、原始dao开发方法,需要程序员编写dao接口和实现类,此方法在当前企业中还有使用,因为ibatis使用的就是原始dao开发方法。

2mapper代理方法,程序员只需要写mapper接口(相当于dao接口),mybatis自动根据mapper接口和mapper接口对应的statement自动生成代理对象(接口实现类对象)。

开发需要遵循规则:

 1mapper.xmlnamespacemapper接口的全限定名

 2mapper.xmlstatementidmapper接口方法名

 3mapper.xmlstatement的输入映射类型(parameterType)和mapper接口方法输入参数类型一致

 4) mapper.xmlstatement的输出映射类型(resultType)和mapper接口方法返回结果类型一致

 

resultTyperesultMap都可以完成输出映射:

resultType映射要求sql查询的列名和输出映射pojo类型的属性名一致

resultMap映射时对sql查询的列名和输出映射pojo类型的属性名作一个对应关系。

 

动态sql

#{}${}完成输入参数的属性值获取,通过OGNL获取parameterType指定pojo的属性名。

    #{}:占位符号,好处防止sql注入

   ${}sql拼接符号

   if

  where 

  foreach

热身:跟我提供的1-5章的sql文件建立数据表,先建立数据表 sql_table.sql ,再导入数据sql_data.sql

数据表分析

分析表与表之间的关系:

 

用户user和订单orders

user---->orders:一个用户可以创建多个订单   一对多

orders-->user:一个订单只能由一个用户创建  一对一 

 

订单orders和订单明细orderdetail

orders-->orderdetail:一个订单可以包括多个订单明细  一对多

orderdetail-->orders:一个订单明细只属于一个订单  一对一

 

订单明细orderdetail和商品信息items

orderdetail-->items:一个订单明细对应一个商品信息 一对一

items--> orderdetail:一个商品对应多个订单明细  一对多


2、一对一查询(resultType实现)

项目结构:

别忘记加入sqlconfig.xml

需求:查询订单信息关联查询用户信息
OrdersCustomMapper编写
package com.ycy.mybatis.dao;

import com.ycy.mybatis.module.Orders;
import com.ycy.mybatis.module.OrdersCustom;

import java.util.List;

/**
 * Created by Administrator on 2015/9/9 0009.
 */
public interface OrdersCustomMapper {
   public List<OrdersCustom> findOrderCustomer() throws  Exception;
}

OrdersCustomMapper.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">
<!--命名空间:分类管理sql隔离,方便管理-->
<mapper namespace="com.ycy.mybatis.dao.OrdersCustomMapper">
   <select id="findOrderCustomer" resultType="OrdersCustom">
               SELECT
          o.*,
          u.username,
          u.address
        FROM
          orders o,
          USER u
        WHERE o.user_id = u.id
   </select>

</mapper>
OrdersCustomMapper测试编写
package com.ycy.mybatis.test;

import com.ycy.mybatis.dao.OrdersCustomMapper;
import com.ycy.mybatis.dao.UserMapper;
import com.ycy.mybatis.module.OrdersCustom;
import com.ycy.mybatis.module.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.util.List;

/**
 * Created by Administrator on 2015/8/31 0031.
 */
public class MybatisTest6 {
    private SqlSessionFactory sqlSessionFactory = null;
    @Before
    public void  before() throws IOException {
        String resource="SqlMapConfig.xml";
        InputStream in = Resources.getResourceAsStream(resource);
        sqlSessionFactory= new SqlSessionFactoryBuilder().build(in);
    }
    @Test
    public  void findOrderCustomer() throws Exception {
        SqlSession sqlSession=sqlSessionFactory.openSession();
        OrdersCustomMapper ordersCustomMapper=     sqlSession.getMapper(OrdersCustomMapper.class);
        List<OrdersCustom>  ordersCustoms=  ordersCustomMapper.findOrderCustomer();
        sqlSession.close();
        for (OrdersCustom ordersCustom : ordersCustoms) {
            System.out.println(ordersCustom.getUsername());
        }

    }


}


2、一对一查询(resultMap实现)

这次我们使用order里面包含User对象
 
   
<pre name="code" class="html">public class Orders {
    private Integer id;

    private Integer userId;

    private String number;

    private Date createtime;

    private String note;

    //用户信息
    private User user;
    //getset 省略 篇幅问题
}


 
  
OrdersCustomMapper.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">
<!--命名空间:分类管理sql隔离,方便管理-->
<mapper namespace="com.ycy.mybatis.dao.OrdersCustomMapper">
  <resultMap id="orderResultMap" type="orders">
        <id column="id" property="id"/>
        <result column="user_id" property="userId"/>
        <result column="number" property="number"/>
        <result column="createtime" property="createtime"/>
        <result column="note" property="note"/>
        <association property="user" javaType="user">
            <id  column="user_id" property="id"/>
            <result column="username" property="username"/>
            <result column="address" property="address"/>
        </association>
    </resultMap>
    <!--resultType进行查询-->
   <select id="findOrderCustomer" resultType="OrdersCustom">
               SELECT
          o.*,
          u.username,
          u.address
        FROM
          orders o,
          USER u
        WHERE o.user_id = u.id
   </select>
   <!--使用resultmap进行查询-->
    <select id="findOrderResultMap" resultMap="orderResultMap">
                       SELECT
          o.*,
          u.username,
          u.address
        FROM
          orders o,
          USER u
        WHERE o.user_id = u.id
   </select>

</mapper>

OrdersCustomMapper.java
package com.ycy.mybatis.dao;

import com.ycy.mybatis.module.Orders;
import com.ycy.mybatis.module.OrdersCustom;

import java.util.List;

/**
 * Created by Administrator on 2015/9/9 0009.
 */
public interface OrdersCustomMapper {
   public List<OrdersCustom> findOrderCustomer() throws  Exception;

   public  List<Orders> findOrderResultMap() throws  Exception;
}

测试:MybatisTest6
package com.ycy.mybatis.test;

import com.ycy.mybatis.dao.OrdersCustomMapper;
import com.ycy.mybatis.dao.UserMapper;
import com.ycy.mybatis.module.Orders;
import com.ycy.mybatis.module.OrdersCustom;
import com.ycy.mybatis.module.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.util.List;

/**
 * Created by Administrator on 2015/8/31 0031.
 */
public class MybatisTest6 {
    private SqlSessionFactory sqlSessionFactory = null;
    @Before
    public void  before() throws IOException {
        String resource="SqlMapConfig.xml";
        InputStream in = Resources.getResourceAsStream(resource);
        sqlSessionFactory= new SqlSessionFactoryBuilder().build(in);
    }
    @Test
    public  void findOrderCustomer() throws Exception {
        SqlSession sqlSession=sqlSessionFactory.openSession();
        OrdersCustomMapper ordersCustomMapper=     sqlSession.getMapper(OrdersCustomMapper.class);
        List<OrdersCustom>  ordersCustoms=  ordersCustomMapper.findOrderCustomer();
        sqlSession.close();
        for (OrdersCustom ordersCustom : ordersCustoms) {
            System.out.println(ordersCustom.getUsername());
        }

    }
   @Test
    public  void findOrderResultMap() throws Exception {
        SqlSession sqlSession=sqlSessionFactory.openSession();
        OrdersCustomMapper ordersCustomMapper=     sqlSession.getMapper(OrdersCustomMapper.class);
        List<Orders>  ordersList=  ordersCustomMapper.findOrderResultMap();
        sqlSession.close();
        for (Orders ordersCustom : ordersList) {
            System.out.println(ordersCustom.getUser().getUsername());
        }

    }


}


3、resultMap与resultType初步总结

resultType:要自定义pojo 保证sql查询列和pojo的属性对应,这种方法相对较简单,所以应用广泛。

 

resultMap:使用association完成一对一映射需要配置一个resultMap,过程有点复杂,如果要实现延迟加载就只能用resultMap实现 ,如果为了方便对关联信息进行解析,也可以用association将关联信息映射到pojo中方便解析。


目录
相关文章
|
1月前
|
XML Java 数据库连接
Mybatis一对一,一对多关联查询
## MyBatis一对一、一对多关联查询详解 MyBatis是一款优秀的持久层框架,提供了灵活的SQL映射功能,支持复杂的数据库操作。本文将详细介绍MyBatis中一对一和一对多关联查询的实现。 ### 一对一关联查询 一对一关联关系指的是一个表中的一条记录与另一个表中的一条记录相关联。例如,一个用户有一个地址信息。 #### 数据库表设计 假设有两个表:`user`和 `address`。 ``` CREATE TABLE user ( id INT PRIMARY KEY, name VARCHAR(50) ); CREATE TABLE address
43 18
|
1月前
|
SQL Java 数据库连接
【潜意识Java】MyBatis中的动态SQL灵活、高效的数据库查询以及深度总结
本文详细介绍了MyBatis中的动态SQL功能,涵盖其背景、应用场景及实现方式。
112 6
|
1月前
|
缓存 NoSQL Java
Mybatis学习:Mybatis缓存配置
MyBatis缓存配置包括一级缓存(事务级)、二级缓存(应用级)和三级缓存(如Redis,跨JVM)。一级缓存自动启用,二级缓存需在`mybatis-config.xml`中开启并配置映射文件或注解。集成Redis缓存时,需添加依赖、配置Redis参数并在映射文件中指定缓存类型。适用于查询为主的场景,减少增删改操作,适合单表操作且表间关联较少的业务。
|
2月前
|
XML Java 数据库连接
Mybatis实现RBAC权限模型查询
通过对RBAC权限模型的理解和MyBatis的灵活使用,我们可以高效地实现复杂的权限管理功能,为应用程序的安全性和可维护性提供有力支持。
77 5
|
3月前
|
SQL Java 数据库连接
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
MyBatis-Plus是一个MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。本文讲解了最新版MP的使用教程,包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段等核心功能。
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
|
3月前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
2月前
|
SQL Java 数据库连接
spring和Mybatis的各种查询
Spring 和 MyBatis 的结合使得数据访问层的开发变得更加简洁和高效。通过以上各种查询操作的详细讲解,我们可以看到 MyBatis 在处理简单查询、条件查询、分页查询、联合查询和动态 SQL 查询方面的强大功能。熟练掌握这些操作,可以极大提升开发效率和代码质量。
185 3
|
3月前
|
SQL 安全 Java
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
MyBatis-Plus 提供了一套强大的条件构造器(Wrapper),用于构建复杂的数据库查询条件。Wrapper 类允许开发者以链式调用的方式构造查询条件,无需编写繁琐的 SQL 语句,从而提高开发效率并减少 SQL 注入的风险。
67 1
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
|
3月前
|
SQL 存储 数据库
深入理解@TableField注解的使用-MybatisPlus教程
`@TableField`注解在MyBatis-Plus中是一个非常灵活和强大的工具,能够帮助开发者精细控制实体类与数据库表字段之间的映射关系。通过合理使用 `@TableField`注解,可以实现字段名称映射、自动填充、条件查询以及自定义类型处理等高级功能。这些功能在实际开发中,可以显著提高代码的可读性和维护性。如果需要进一步优化和管理你的MyBatis-Plus应用程
306 3
|
1月前
|
前端开发 Java 数据库连接
Java后端开发-使用springboot进行Mybatis连接数据库步骤
本文介绍了使用Java和IDEA进行数据库操作的详细步骤,涵盖从数据库准备到测试类编写及运行的全过程。主要内容包括: 1. **数据库准备**:创建数据库和表。 2. **查询数据库**:验证数据库是否可用。 3. **IDEA代码配置**:构建实体类并配置数据库连接。 4. **测试类编写**:编写并运行测试类以确保一切正常。
64 2