动态SQL

定义:SQL语句执行时,会根据传入的参数的个数及参数的内容而发生变化。


上代码:

application.properties

#MySQL数据源
spring.datasource.url=jdbc:mysql://121.41.98.23:3306/hr
#数据库名
spring.datasource.username=root
#数据库密码
spring.datasource.password=root
#数据库引擎
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver#显示日志信息
logging.level.web=debug#显示详细信息
spring.http.log-request-details=true

Staff.java

package com.newer.dsql1.pojo;
/*** Staff实体类* @author Admin**/
public class Staff {/*** 员工编号*/int id;/*** 员工名字*/String name;/*** 员工职位*/String job;/*** 员工联系方式*/String phone;/*** 部门id*/Dept dept=new Dept();public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getJob() {return job;}public void setJob(String job) {this.job = job;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public Dept getDept() {return dept;}public void setDept(Dept dept) {this.dept = dept;}@Overridepublic String toString() {return "Staff [id=" + id + ", name=" + name + ", job=" + job + ", phone=" + phone + ", dept=" + dept + "]";}}

Dept.java

package com.newer.dsql1.pojo;
/*** Dept实体类* @author Admin**/
public class Dept {/*** 部门编号*/int id;/*** 部门名称*/String title;/*** 部门地址*/String loc;/*** getters setters方法* @return*/public int getId() {return id;}public void setId(int id) {this.id = id;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getLoc() {return loc;}public void setLoc(String loc) {this.loc = loc;}/*** tostring方法*/@Overridepublic String toString() {return "Dept [id=" + id + ", title=" + title + ", loc=" + loc + "]";}}

StaffMapper.java

package com.newer.dsql1.mapper;import java.util.List;import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;import org.apache.ibatis.annotations.SelectProvider;
import org.apache.ibatis.jdbc.SQL;import com.newer.dsql1.pojo.Dept;
import com.newer.dsql1.pojo.Staff;/*** MySQL映射,数据持久化* @author Admin**/
@Mapper
public interface StaffMapper {/*** 查询staff的数据*/@SelectProvider(type = SqlProvider.class,method = "findStaff")@Results(id = "staffResultMap",value = {@Result(column = "dept_id",property = "dept",javaType = Dept.class,one=@One(select="com.newer.dsql1.mapper.DeptMapper.findById"))})List<Staff> findAll(Staff staff);/*** 定义一个内部类*/static class SqlProvider{/*** 定义一个返回字符串的方法*/public String findStaff(Staff staff) {return new SQL() {{SELECT("*");FROM("staff");if(staff !=null) {if(staff.getName() !=null && staff.getName().length()>0) {WHERE("name like concat('%',#{name},'%')");}if(staff.getJob() !=null && staff.getJob().length()>0) {WHERE("job like #{job}");}if(staff.getPhone() !=null && staff.getPhone().length()>0) {WHERE("phone like #{phone}");}if(staff.getDept().getId()>0) {WHERE("dept_id=#{dept.id}");}}}}.toString();}}
}

DeptMapper.java

package com.newer.dsql1.mapper;import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;import com.newer.dsql1.pojo.Dept;/*** MySQL映射,数据持久化存储* @author Admin**/
@Mapper
public interface DeptMapper {/*** 根据id查找dept表的数据*/@Select("select * from dept where id=#{id}")Dept findById(int id);
}

HomeController.java

package com.newer.dsql1.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;/*** 普通控制器* @author Admin**/
@Controller
public class HomeController {/*** 返回视图名* @return*/@GetMapping("/")public String home() {return "index.html";}
}

StaffController.java

package com.newer.dsql1.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.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import com.newer.dsql1.mapper.StaffMapper;
import com.newer.dsql1.pojo.Staff;/*** RESTful控制器* @author Admin**/
@RestController
public class StaffController {/*** * 自动注入依赖*/@AutowiredStaffMapper staffMapper;/*** 查询staff表的方法*/
//  BeanUtil 反射,自动把参数填充特定的对象@GetMapping("/staff")public List<Staff> findAll(Staff staff,@RequestParam(required = false) Integer deptId){//        如果deptId不为空if(deptId !=null) {
//          手动填充不匹配的参数staff.getDept().setId(deptId);}return staffMapper.findAll(staff);}
}

index.html

<!doctype html>
<html lang="en"><head><title>hr数据库的操作</title><!-- Required meta tags --><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"><!-- Bootstrap CSS --><link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"><!-- 导入axios --><script src="https://unpkg.com/axios/dist/axios.min.js"></script><!-- 导入vue --><script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script></head><body><!-- 展板 --><div class="jumbotron jumbotron-fluid"><div class="container"><h1 class="display-3">动态 SQL</h1></div></div><div id="app" class="container"><div class="row"><div class="col"><!-- 卡片 --><div class="card my-3"><div class="card-body"><label for="">姓名</label><input type="text" v-model="name" class="mr-3"><label for="">电话</label><input type="text" v-model="phone" class="mr-3"><label for="">职位</label><input type="text" v-model="job" class="mr-3"><label for="">部门</label><!-- 下拉框 --><select v-model="dept"><option value="0">-</option><option value="1">产品</option><option value="2">研发</option><option value="3">测试</option><option value="4">实施</option></select><!-- 搜索按钮 --><button @click="search" type="button" class="btn btn-outline-danger float-right">搜索</button></div></div><!-- 表格 --><table class="table"><thead><tr><th>编号</th><th>姓名</th><th>职位</th><th>电话</th><th>部门</th></tr></thead><tbody><tr v-for="(item, index) in  staffList" :key="index"><td>{{ item.id }}</td><td>{{ item.name }}</td><td>{{ item.job }}</td><td>{{ item.phone }}</td><td>{{ item.dept.title }}</td></tr></tbody></table></div></div></div><!-- vue --><script>new Vue({el: '#app',data: {// 员工列表staffList: [],name: '',job: '',phone: '',// 员工的编号dept: 0},methods: {// 搜索的方法search: function () {let url = `http://127.0.0.1:8080/staff`;params = {name: this.name,job: this.job,phone: this.phone,deptId: this.dept}// 从服务端获取数据axios.get(url, {params: params}).then(res => {console.log(res);// 把从服务端获的数据给staffListthis.staffList = res.data;})}},created() {let url = `http://127.0.0.1:8080/staff`;axios.get(url).then(res => {console.log(res)// 把从服务端获的数据给staffListthis.staffList = res.data;}).catch(err => {console.error(err);})},})</script><!-- Optional JavaScript --><!-- jQuery first, then Popper.js, then Bootstrap JS --><script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo"crossorigin="anonymous"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1"crossorigin="anonymous"></script><script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM"crossorigin="anonymous"></script>
</body></html>

代码到这差不多结束啦!现在需要一个数据库来测试:


运行程序,打开浏览器查看效果

这里可以取到数据库里的数据:


现在看我们的主界面:(实现了模糊查询)

MyBatis 中的动态 SQL 特性相关推荐

  1. 6.Mybatis中的动态Sql和Sql片段(Mybatis的一个核心)

    视频地址:http://edu.51cto.com/sd/be679 动态Sql是Mybatis的核心,就是对我们的sql语句进行灵活的操作,他可以通过表达式,对sql语句进行判断,然后对其进行灵活的 ...

  2. Java - MyBatis中的动态SQL是什么意思?

    分享一个大牛的人工智能教程.零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net 对于一些复杂的查询,我们可能会指定多个查询条件,但是 ...

  3. Mybatis中的动态SQL,一对一,一对多以及标签

    文章目录 动态SQL中的结果集映射 一对一 一对多 where标签 where..if...标签(作用和Java中的if一样,只要满足if条件的都可以拼接) where..choose..标签(作用和 ...

  4. Mybatis 中update动态SQL语句

    Mybatis中的CRUD操作(增删改查)中,简单的SQL操作比较直观,如查找操作: <select id="findBySrcId" resultMap="ent ...

  5. mybatis中实现动态SQL

    动态SQL语句,也就意味着SQL语句不在是一成不变的而是具有多样性. if if的用法还是跟平常差不多的(不过没有else if也没有else) <update id="modify& ...

  6. mybatis中的动态sql

    if标签 parameterType类型是pojo test中的属性必须是pojo中的属性并且严格区分大小写(sql语句中不区分大小写) 使用NGNL语言进行查询 标准的判断非空形式为<if t ...

  7. Mybatis中的动态SQL记录

    if判断 <mapper namespace="cn.wideth.mapper.CarMapper"><select id="selectByCarI ...

  8. mybatis中mapper文件中的动态sql语句

    有时候在检索时,用户提供的数据不一样多,我们很难使用静态的sql语句进行判别,所以这个时候需要使用动态的sql语句 这里主要针对Mapper.xml文件中的sql语句,笔者在下面所有的例子中只提供了M ...

  9. Mybatis映射文件动态SQL语句-01

    因为在很多业务逻辑复杂的项目中,往往不是简单的sql语句就能查询出来自己想要的数据,所有mybatis引入了动态sql语句, UserMapper.xml <?xml version=" ...

最新文章

  1. GAITC 2021智媒论坛丨曹立宏:AI和BI互助发展 智能媒体任重道远
  2. Android -- Volley解析
  3. Basic脚本解释器移植到STM32
  4. 线性变化和非线性变化
  5. CRNN:端到端不定长文字识别算法
  6. Scrapy框架的学习(3.pipeline介绍以及多个爬虫的pipeline的使用)
  7. wxWidgets:wxPropertyGrid类用法
  8. android radiobutton_时隔一年,用新知识重构一个Android控件老库
  9. [MS bug]安装SQL Server 2008 错误:is not a valid login or you do not have permission
  10. 企业运维几百个重点面试题汇总(老男孩)
  11. boost::property_tree读取解析ini文件--推荐
  12. 怎样利用通达信公式选股?
  13. 阿里云ECS更换系统时提示主机名不支持windows镜像要求的解决方法
  14. mockserver
  15. 小韦XPSP3 V10.0_Ghost精简版
  16. 获得资源配置文件的路径
  17. 越狱Season 1-Episode 9: Tweener
  18. 小博老师解析Java核心技术 ——JDBC参数化查询(一)
  19. Java调用Zebra800条码打印机
  20. 求根节点到叶节点数字之和(C语言)

热门文章

  1. 河南省小学计算机教室配备目录,河南省小学功能室 教育技术装备标准.doc
  2. 【MSD6A648】VSYNC_LIKE和PWM2冲突
  3. 自学习式,智能万能空调遥控-----纠结了我一个多礼拜的问题
  4. 【读书】领导梯队-从管理自我到管理他人
  5. RTKLIB学习记录 dops值输出
  6. 怎么让文字转换成语音?一步一步让你学会
  7. 微信百度网盘小程序文件分享链接提取
  8. 自动化管理工具Rundeck
  9. 晶体(crystal)和晶振(oscillator)
  10. 游戏营销中关于平台的差异