ORM框架三种映射在Springboot上的使用

ORM(对象/关系映射)是数据库层非常重要的一部分,有三种常用的映射关系

1.多对一

tbl_clazz

clazz{
id
name
description
grade_id
charge_id
}

clazz {
id
name
description
grade:{
id:
name:
...
},
charge:{
id
name
gender
}
}

提供多对一的查询   -------班级表对应年级表和班主任表

bean
extend
ClazzVM.java

dao
extend
ClazzVMMapper.java(接口)

mapper
extend
ClazzVMMapper.xml

ClazzVMMapper主要实现sql语句,是非常重要的一部分,关键代码如下

<select id="selectByPrimaryKey" parameterType="long" resultMap="ClazzVMMapper">
        select * from poll_clazz
        where id=#{id}
    </select>
<resultMap type="com.briup.apps.poll.bean.extend.ClazzVM" id="ClazzVMMapper">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="description" property="description"/>
        <association
        column="grade_id" property="grade"
        select="com.briup.apps.poll.dao.GradeMapper.selectByPrimaryKey">
        </association>
        <association
        column="charge_id" property="charge"
        select="com.briup.apps.poll.dao.UserMapper.selectByPrimaryKey">
        </association>
    </resultMap>

2.一对多

一对多 查询  ------一个问题包括多个问题选项

查找所有问题,包括问题选项

bean:

package com.briup.apps.poll.bean.extend;

import java.util.List;

import com.briup.apps.poll.bean.Options;

public class QuestionVM {

    private Long id;
    private String name;
    private String questionType;

    private List<Options> options;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getQuestionType() {
        return questionType;
    }

    public void setQuestionType(String questionType) {
        this.questionType = questionType;
    }

    public List<Options> getOptions() {
        return options;
    }

    public void setOptions(List<Options> options) {
        this.options = options;
    }

}

dao:

public interface QuestionVMMapper {
List<QuestionVM> selectAll() throws Exception;

List<QuestionVM> selectByQuestionnaireId(long id) throws Exception;
}

QuestionVMMapper.xml(对应实现dao层的selectAll功能)

<mapper namespace="com.briup.apps.poll.dao.extend.QuestionVMMapper">
     <select id="selectAll" resultMap="QuestionVMResultMap">
        select * from poll_question
        <!-- id,name,questionType -->
     </select>
 <resultMap type="com.briup.apps.poll.bean.extend.QuestionVM" id="QuestionVMResultMap">
         <id column="id" property="id"/>
         <result column="name" property="name" />
         <result column="questionType" property="questionType"/>
         <collection
            column="id"
            property="options"
            javaType="ArrayList"
             ofType="com.briup.apps.poll.bean.Options"
            select="selectOptionsByQuestionId">
          </collection>
       </resultMap>
            <!-- 通过题目id查询问题选项 -->
        <select id="selectOptionsByQuestionId"
            resultType="com.briup.apps.poll.bean.Options"
            parameterType="long">
            select * from poll_options where question_id = #{id}
        </select>

</mapper>

service层:

接口

package com.briup.apps.poll.service;

import java.util.List;

import com.briup.apps.poll.bean.Question;
import com.briup.apps.poll.bean.extend.QuestionVM;

public interface IQuestionService {
    //查找所有问题,并查找出问题的所有选项
     List<QuestionVM> findAll() throws Exception; 

     //更新或者保存问题,并保存更新问题选项
     void saveOrUpdateQuestionVM(QuestionVM questionVM) throws Exception;

     //删除问题,级联删除选项
     void deleteById(long id) throws Exception;

     //关键字查询
    List<Question> query(String keywords) throws Exception;

    //批量删除题目

    void deleteBach(Long[] id)throws Exception;
}

接口实现层

package com.briup.apps.poll.service.Impl;

import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.briup.apps.poll.bean.Options;
import com.briup.apps.poll.bean.OptionsExample;
import com.briup.apps.poll.bean.Question;
import com.briup.apps.poll.bean.QuestionExample;
import com.briup.apps.poll.bean.extend.QuestionVM;
import com.briup.apps.poll.dao.OptionsMapper;
import com.briup.apps.poll.dao.QuestionMapper;
import com.briup.apps.poll.dao.extend.QuestionVMMapper;
import com.briup.apps.poll.service.IQuestionService;

@Service
public class QuestionServiceImpl implements IQuestionService {
    @Autowired
    private QuestionVMMapper questionVMMapper;
    @Autowired
    private OptionsMapper optionsMapper;
    @Autowired
    private QuestionMapper questionMapper;
    @Override
    public List<QuestionVM> findAll() throws Exception {

        return questionVMMapper.selectAll();
    }
    /*
     * 保存或者修改问题,带选项
     */
    @Override
    public void saveOrUpdateQuestionVM(QuestionVM questionVM) throws Exception {
       /*
        * 1.得到question和options实体,因为保存是分别保存的
        * 2.判断是否是保存还是修改操作
        * 3.判断题目类型(简答还是选择)
        *
        */

        Question question=new Question();
        question.setId(questionVM.getId());
        question.setName(questionVM.getName());
        question.setQuestiontype(questionVM.getQuestionType());
        List<Options> options=questionVM.getOptions();
              if(questionVM.getId()==null){
            /*保存操作
             * 1.保存题目
             * 2.保存选型
             */
                      if(questionVM.getQuestionType().equals("简答题")){
                          //仅仅保存题目
                          questionMapper.insert(question);
                      }else{
                         //先保存题目
                          questionMapper.insert(question);
                          //获取question的id
                          long id=question.getId();
                         //保存选项
                        for(Options option : options){
                            //遍历所有选项,进行保存
                            option.setQuestionId(id);
                            optionsMapper.insert(option);
                        }
                      }

                  }else{
                      //修改
                      /*
                       * 1.修改题目信息
                       * 2.删除选项
                       * 3.重新添加选项
                       */
                      questionMapper.updateByPrimaryKey(question);

                      OptionsExample example=new OptionsExample();
                      example.createCriteria().andQuestionIdEqualTo(question.getId());
                      optionsMapper.deleteByExample(example);
                      long id=question.getId();
                      for(Options option : options){
                        //遍历所有选项,进行保存
                        option.setQuestionId(id);
                        optionsMapper.insert(option);
                    }

             }   

    }
    @Override
    public void deleteById(long id) throws Exception {

        questionMapper.deleteByPrimaryKey(id);
    }
    @Override
    public List<Question> query(String keywords) throws Exception {

            QuestionExample example=new QuestionExample();
            example.createCriteria().andNameLike(keywords);
            return  questionMapper.selectByExample(example);
        }
    @Override
    public void deleteBach(Long[] ids) throws Exception {
        for(long id : ids){
            questionMapper.deleteByPrimaryKey(id);
        }

    }    

}

Controll层

package com.briup.apps.poll.web.controller;

import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.briup.apps.poll.bean.Question;
import com.briup.apps.poll.bean.extend.QuestionVM;
import com.briup.apps.poll.service.IQuestionService;
import com.briup.apps.poll.util.MsgResponse;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;

@Api(description="问题模块接口")
@RestController
@RequestMapping("/question")
public class QuestionController {
@Autowired
private IQuestionService questionService;

@ApiOperation(value="删除问题",notes="同时级联删除options")
@GetMapping("deleteQuestionById")
public MsgResponse deleteQuestionQuestionById(long id){
try{
questionService.deleteById(id);
return MsgResponse.success("删除成功", null);
}catch(Exception e){
return MsgResponse.error(e.getMessage());
}
}

@ApiOperation(value="保存或者更新问题",notes="如果id为空,执行保存操作,如果id不为空,执行更新操作")
@PostMapping("saveOrUpdateQuestion")
public MsgResponse saveOrUpdateQuestion(QuestionVM questionVM){
try {
questionService.saveOrUpdateQuestionVM(questionVM);
return MsgResponse.success("success", null);
} catch (Exception e) {

e.printStackTrace();
return MsgResponse.error(e.getMessage());

}

}

@ApiOperation(value="查找所有问题",notes="并查找出所有问题的选项")
@GetMapping("findAllQuestion")
public MsgResponse findAllQuestion(){
try{
List<QuestionVM> list=questionService.findAll();
return MsgResponse.success("success", list);
}catch(Exception e){
e.printStackTrace();
return MsgResponse.error(e.getMessage());
}
}

@ApiOperation(value="批量删除问题",notes="输入问题id")
@GetMapping("deleteBatch")
public MsgResponse deleteBatch(Long[] ids){
try{
questionService.deleteBach(ids);
return MsgResponse.success("success", null);
}catch(Exception e){
e.printStackTrace();
return MsgResponse.error(e.getMessage());
}
}

@ApiOperation(value="关键字查询",notes="输入题目的关键字")
@GetMapping("findByQuery")
public MsgResponse findByQuery(String keywords){
try{
List<Question> list=questionService.query(keywords);
return MsgResponse.success("success", list);
}catch(Exception e){
e.printStackTrace();
return MsgResponse.error(e.getMessage());
}
}
}

3.多对多

问卷模块
1. 查询所有问卷/通过关键字查询问卷(单表)
2. 预览问卷、课调
通过问卷id查询问卷下所有信息(问卷,问题,选项)
2.1 数据库级别表示多对多
问卷 questionnaire
id name
1 主讲问卷
2 辅讲问卷

问题 question
id name
1 授课质量
2 技术水平
3 亲和力

qq
id questionnaire_id question_id
1 1 1
2 1 2
3 1 3
4 2 1
5 2 3

# 通过问卷id查找问卷信息
select * from poll_questionnaire where id =1;
// id name description
# 通过问卷id查找属于问卷的问题信息
select * from poll_question where id in (
select question_id
from poll_qq
where questionnaire_id = 1;
);

2.2 面向对象级别上多对多
QuestionnaireVM{

private Long id;
private String name;
private List<Question> questions;
}

QuestionVM{
private Long id
private String name;
private List<Questionnaire> questionnaires;
}

bean层:

package com.briup.apps.poll.bean.extend;

import java.util.List;

public class QuestionnaireVM {
     private Long id;
     private String name;
     private String description;

     private List<QuestionVM> questionVMs;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public List<QuestionVM> getQuestionVMs() {
        return questionVMs;
    }

    public void setQuestionVMs(List<QuestionVM> questionVMs) {
        this.questionVMs = questionVMs;
    }

}

dao层:

package com.briup.apps.poll.dao.extend;

import java.util.List;

import com.briup.apps.poll.bean.extend.QuestionnaireVM;

public interface QuestionnaireVMMapper {
       List<QuestionnaireVM> selectById(long id);
}

QuestionnaireVM.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.briup.apps.poll.dao.extend.QuestionnaireVMMapper">
     <select id="selectById" resultMap="QuestionnaireVMResultMap">
        select * from poll_questionnaire where id = #{id}
        <!-- id,name,description -->
     </select>

     <!-- 定义结果集 -->
     <resultMap type="com.briup.apps.poll.bean.extend.QuestionnaireVM" id="QuestionnaireVMResultMap">
         <id column="id" property="id"/>
         <result column="name" property="name" />
         <result column="description" property="description"/>
         <collection
            column="id"
            property="questionVMs"
            javaType="ArrayList"
             ofType="com.briup.apps.poll.bean.extend.QuestionVM"
            select="com.briup.apps.poll.dao.extend.QuestionVMMapper.selectByQuestionnaireId">
          </collection>
       </resultMap>

</mapper>
  <select id="selectByQuestionnaireId" parameterType="long" resultMap="QuestionVMResultMap">
       select * from poll_question where id in(
       select question_id from poll_qq where questionnaire_id = #{id}
       )
        <!-- id,name,questionType -->
     </select>

根据问卷id查找所有该问卷的问题,在QuestionVMMapper.java中声名了一个根据问卷id查找所有问题的方法

该方法在QuestionVMMapper.xml中对应的代码为:

<select id="selectByQuestionnaireId" parameterType="long" resultMap="QuestionVMResultMap">
       select * from poll_question where id in(
       select question_id from poll_qq where questionnaire_id = #{id}
       )
        <!-- id,name,questionType -->
     </select>

service层

接口

package com.briup.apps.poll.service;

import java.util.List;

import com.briup.apps.poll.bean.Questionnaire;
import com.briup.apps.poll.bean.extend.QuestionnaireVM;

public interface IQuestionnaireVMService {
    //查询所有问卷
   List<Questionnaire> findAll();

   //查询所有问卷及问卷的问题
   List<QuestionnaireVM> findQuestionById(long id);

}

实现

package com.briup.apps.poll.service.Impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.briup.apps.poll.bean.Questionnaire;
import com.briup.apps.poll.bean.QuestionnaireExample;
import com.briup.apps.poll.bean.extend.QuestionnaireVM;
import com.briup.apps.poll.dao.QuestionnaireMapper;
import com.briup.apps.poll.dao.extend.QuestionnaireVMMapper;
import com.briup.apps.poll.service.IQuestionnaireVMService;
@Service
public class QuestionnaireVMServiceImpl implements IQuestionnaireVMService{
@Autowired
private QuestionnaireMapper questionnaireMapper;

@Autowired
private QuestionnaireVMMapper questionnaireVMMapper;

    @Override
    public List<Questionnaire> findAll() {
        QuestionnaireExample example=new QuestionnaireExample();
        return questionnaireMapper.selectByExampleWithBLOBs(example);

    }

    @Override
    public List<QuestionnaireVM> findQuestionById(long id) {
        return questionnaireVMMapper.selectById(id);
    }

}

controll层

package com.briup.apps.poll.web.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.briup.apps.poll.bean.Questionnaire;
import com.briup.apps.poll.bean.extend.QuestionnaireVM;
import com.briup.apps.poll.service.IQuestionnaireVMService;
import com.briup.apps.poll.util.MsgResponse;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;

@Api(description="问卷模块接口")
@RestController
@RequestMapping("/questionnaire")
public class QuestionnaireVMController {
@Autowired
private IQuestionnaireVMService qnvs;

@ApiOperation(value="查找所有问卷",notes="仅仅只查找问卷")
@PostMapping("findAllQuestionnaire")

public MsgResponse findAllQuestionnaire(){
         try{
             List<Questionnaire> list=qnvs.findAll();
            return MsgResponse.success("success", list);
         }catch(Exception e){
             e.printStackTrace();
             return MsgResponse.error(e.getMessage());
         }
}

@ApiOperation(value="预览问卷信息",notes="预览包括问卷上的问题")
@GetMapping("findAllQuestionnaireById")
public MsgResponse findAllQuestionnaireById(long id){
    try{
        List<QuestionnaireVM> list=qnvs.findQuestionById(id);
        return MsgResponse.success("success", list);
    }catch(Exception e){
        e.printStackTrace();
        return MsgResponse.error(e.getMessage());
    }
}
}

原文地址:https://www.cnblogs.com/zzuli/p/9245801.html

时间: 2024-10-19 15:26:24

ORM框架三种映射在Springboot上的使用的相关文章

SpringMVC实战(三种映射处理器)

1.前言 上一篇博客,简单的介绍了一下SpringMVC的基础知识,这篇博客来说一下SpringMVC中的几种映射处理器机制. 2.三种映射处理器 2.1 BeanNameUrlHandlerMapping  (默认) 在上一篇实例中,我们通过在springmvc-servlet.xml中就是通过这个默认的映射机制,来找到具体的处理器的请求.这通常是默认设置,然后通过Bean的名称,就可以找到相应的控制器信息. <?xml version="1.0" encoding="

三种传值方式遇上两个数的交换

最近在学习数据结构的时候发现以前学的C++的有些东西都忘了,特别是老师提到的三种传值的方式——单向值传递,地址传递,双向引用传递:为此,我这里用如何交换两个数的例子来说明一下三种传值方式的机制. 先看看源代码: 1 #include<iostream> 2 using namespace std; 3 int swap1(int m1,int m2)//单向值传递 4 { 5 int temp = m1; 6 m1 = m2; 7 m2 = temp; 8 cout<<m1<

Spring Boot (三): ORM 框架 JPA 与连接池 Hikari

前面两篇文章我们介绍了如何快速创建一个 Spring Boot 工程<Spring Boot(一):快速开始>和在 Spring Boot 中如何使用模版引擎 Thymeleaf 渲染一个Web页面<Spring Boot (二):模版引擎 Thymeleaf 渲染 Web 页面>,本篇文章我们继续介绍在 Spring Boot 中如何使用数据库. 1. 概述 数据库方面我们选用 Mysql , Spring Boot 提供了直接使用 JDBC 的方式连接数据库,毕竟使用 JDBC

打造android ORM框架opendroid(一)——ORM框架的使用

一.我的看法 我记得曾经有一篇博客是介绍的litepal的使用,在这篇博客中我提到过:本来以为android本身提供的API已经封装的够好了,根本不需要什么ORM框架了,但是在使用了litepal后,我感觉使用ORM框架还是很有必要的,下面是我对ORM和android API的几点看法: 1.做为API级别, android只能广义封装,而不能特定去封装一个API,所以android 对sqlite的封装已经很强大了. 2.作为开发者,我们需要为项目提供足够适配的解决方案,可能ORM框架比API

iOS的三种多线程技术NSThread/NSOperation/GCD

1.iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的"并发"技术,使得程序员可以不再去关心线程的具体使用问题 NSOperation/NSOperationQueue 面向对象的线程技术 GCD -- Grand Central Dispatch(派发) 是基于C语言的框架,可以充分利用多核,是苹果推荐使用的多线程技术. 以上这三种编程方式从上到下,抽象度层次是从低到高的,抽象度越高的使用越简单,

iOS- NSThread/NSOperation/GCD 三种多线程技术的对比及实现 -- 转

1.iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的“并发”技术,使得程序员可以不再去关心线程的具体使用问题 ØNSOperation/NSOperationQueue 面向对象的线程技术 ØGCD —— Grand Central Dispatch(派发) 是基于C语言的框架,可以充分利用多核,是苹果推荐使用的多线程技术 以上这三种编程方式从上到下,抽象度层次是从低到高的,抽象度越高的使用越简单,也是Ap

Spring学习(二)spring ioc注入的三种方式

一.spring ioc注入有哪三种方式: a setter 原理 : 在目标对象中,定义需要注入的依赖对象对应的属性和setter方法:"让ioc容器调用该setter方法",将ioc容器实例化的依赖对象通过setter注入给目标对象,封装在目标对象的属性中. b 构造器 原理 : 为目标对象提供一个构造方法,在构造方法中添加一个依赖对象对应的参数.ioc容器解析时,实例化目标对象时会自动调用构造方法,ioc只需要为构造器中的参数进行赋值:将ioc实例化的依赖对象作为构造器的参数传入

SQL Server中Upsert的三种方式

本文介绍了SQL Server中Upsert的三种常见写法以及他们的性能比较. SQL Server并不支持原生的Upsert语句,通常使用组合语句实现upsert功能. 假设有表table_A,各字段如下所示: int型Id为主键. 方法1:先查询,根据查询结果判断使用insert或者update IF EXISTS (SELECT 1 FROM table_A WHERE Id = @Id) BEGIN UPDATE dbo.table_A SET Value = @Value WHERE

iOS开发——程序员必备&amp;iOS安装包的三种格式 deb、ipa 和 pxl的解释和说明

iOS安装包的三种格式 deb.ipa 和 pxl的解释和说明 目前 iOS 平台上常见的安装包有三种,deb.ipa 和 pxl.转自链接:http://fanlb.blogbus.com/logs/80466716.html  多谢作者分享!其中 deb 格式是 Debian 系统(包含 Debian 和 Ubuntu )专属安装包格式,配合 APT 软件管理系统,成为了当前在 Linux 下非常流行的一种安装包.进入 2.x 时代之后有 Cydia 作者 Jay Freeman(sauri