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());
}
}
}

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

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

    1.前言 上一篇博客,简单的介绍了一下SpringMVC的基础知识,这篇博客来说一下SpringMVC中的几种映射处理器机制. 2.三种映射处理器 2.1 BeanNameUrlHandlerMapp ...

  2. ORM框架(对象关系映射)

    Entity Framework 学习初级篇1--EF基本概况 http://www.cnblogs.com/xray2005/archive/2009/05/07/1452033.html ORM  ...

  3. Orm框架(AntOrm,Ktorm)在mac机器上如何使用代码生成

    Orm框架介绍 AntOrm 是我维护的一个开源csharp -netcore 项目 Ktorm 是一个大神开源的kotlin项目 由于我工作上都用到了,为了提高工作效率 我写了一个mac端工具帮助快 ...

  4. DjangoRestFramework框架三种分页功能的实现 - 在DjangoStarter项目模板中封装

    前言 继续Django后端开发系列文章.刚好遇到一个分页的需求,就记录一下. Django作为一个"全家桶"型的框架,本身啥都有,分页组件也是有的,但默认的分页组件没有对API开发 ...

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

    前面两篇文章我们介绍了如何快速创建一个 Spring Boot 工程<Spring Boot(一):快速开始>和在 Spring Boot 中如何使用模版引擎 Thymeleaf 渲染一个 ...

  6. 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理

    服务器文档下载zip格式   刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...

  7. PHP.23-ThinkPHP框架的三种模型实例化-(D()方法与M()方法的区别)

    三种模型实例化 原则上:每个数据表应对应一个模型类(Home/Model/GoodsModel.class.php --> 表tp_goods) 1.直接实例化 和实例化其他类库一样实例化模型类 ...

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

    1.iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的"并发"技术,使得程序员可以不再去关心 ...

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

    1.iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的“并发”技术,使得程序员可以不再去关心线程的具体使用问题 ...

随机推荐

  1. 如何配置STP

    一.搭建本次实验的拓扑结构 两台s5700交换机模拟核心交换,两台s3700交换机模拟接入交换机,核心上配置eth-trunk   二.开启所有交换机的stp功能 开启stp [S1]stp enab ...

  2. 学习数据结构Day4

    链表 之前看过了动态数组,栈和队列,虽然我们把第一个叫做动态数组,但是,他们的底层实质上还是静态数组.靠 resize来实现动态数组.而链表是真正的数据结构 链表需要一个节点. 数据存储在链表中 相当 ...

  3. [转帖]Windows 7寿终正寝 为何Windows 10屡被吐槽它却无比经典?

    Windows 7寿终正寝 为何Windows 10屡被吐槽它却无比经典? https://www.cnbeta.com/articles/tech/908897.htm 是的,一代经典操作系统Win ...

  4. STL源码剖析——Iterators与Traits编程#5 __type_traits

    上节给出了iterator_traits以及用到traits机制的部分函数的完整代码,可以看到traits机制能够提取迭代器的特性从而调用不同的函数,实现效率的最大化.显然这么好的机制不应该仅局限于在 ...

  5. 题解 P3957 【跳房子】

    对于这题有一个不用单调队列并且不是玄学设置区间最大值的做法 这题校内模拟考的时候打二分+枚举,结果写炸了,跑过来看题解发现为什么他们的区间最大值都是 $ 1005 $ ???特别懵,其实我的代码在dp ...

  6. Linux 下随机启动自己的应用 -请使用while(true) 不要Console.ReadKey()

    Linux 下随机启动 自己的应用 -请使用while(true) 不要Console.ReadKey() 开机启动脚本启动,某些程序无法启动 原因 例如写了一个服务,不能停止程序运行,所以主线程成不 ...

  7. Navicat 连接mysql 报错: Authentication plugin caching_ sha2_password cannot be loaded

    出现这个错误的时候, 网上的资料都是修改mysql的登录信息的, ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password ...

  8. 返璞归真——OO第四单元总结暨学期总结

    本次作业是第四单元的最后一次作业,也是本学期面向对象的最后一次作业,在此我将分别对第四单元和整个学期进行总结. 一.本单元的两次作业 第四单元的作业是关于UML的一些处理.UML语言是一种区别于具体语 ...

  9. 亲密字符串之Javascript解法

    本题为leetcode第859题,原题链接在此:https://leetcode-cn.com/problems/buddy-strings/submissions/ 给定两个由小写字母构成的字符串  ...

  10. Hibernate hql getHibernateTemplate()常用方法汇总

    转自:https://www.iteye.com/blog/zwdsmileface-2191943 getHibernateTemplate()常用方法 一.find(String queryStr ...