首页 > 编程语言 >JavaWeb回顾与小结(五)

JavaWeb回顾与小结(五)

时间:2023-04-29 19:34:18浏览次数:43  
标签:JavaWeb 回顾 where 映射 接口 emp SQL 小结 id

Mybatis基础操作

环境准备工作

  1. 准备数据库表
  2. 创建一个新的springboot工程,选择引入对应的起步依赖(mybatis,mysql驱动,lombok)
  3. application.properties中引入数据库连接信息
  4. 创建对应的实体类Emp(实体类属性采用驼峰命名)
  5. 准备Mapper接口EmpMapper

根据主键删除

SQL语句
delete from emp where id = 17;
接口方法

@Delete("delete from emp where id = #{id}")
public void delete(Integer id);

注意事项

  • 如果mapper接口方法形参只有一个普通类型的参数,#{...}里面的属性名可以随便写,如:#{id},#{value}

日志输出

可以在application.properties中,打开mybatis的日志,并指定输出到控制台
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

预编译SQL

性能更高

更安全(防止SQL注入漏洞)

SQL注入是通过操作输入的数据来修改事先定义好的SQL语句,以达到执行代码对服务器进行攻击的方法

参数占位符

  1. #{...}
  • 执行SQL时,会将#{...}替换为?,生成预编译SQL,会自动设置参数值
  • 使用场景:参数传递,都使用#
  1. ${...}
  • 拼接SQL,直接将参数拼接在SQL语句中,存在SQL注入漏洞问题
  • 使用场景:如果对表名,列表进行动态设置时使用(使用很少)

新增信息(主键返回)

SQL语句

insert into emp(username,name,gender,dept_id) values ('songyuanqiao','宋远桥',1,2)

接口方法

@Insert("insert into emp(username,name,gender,dept_id)"+"values(#{username},#{name},#{gender},#{dept_id})")
public void insert (Emp emp);

主键返回

@Option(useGenratedKeys=true,keyProperty="id")
会自动将生成的主键值,赋值给参数对象的id属性

根据主键更新

SQL语句

update emp set username='songdaxia',name='宋大侠',gender=1,dept_id=2 where id = 19;

接口方法

@Update("update emp set username=#{username},name=#{name},gender=#{gender},dept_id=#{deptId} where id=#{id}")
public void update (Emp emp);

根据主键查询

SQL语句

select * from emp where id = 19;

接口方法

@Select("select * from emp where id = #{id}")
public Emp getById(Integer id);

数据封装

  • 实体类属性名和数据库表查询返回的字段名一致,mybatis会自动封装
  • 如果实体类属性名和数据库表查询返回的字段名不一致,不能自动封装
  • 三种解决方法
  1. 起别名:在SQL语句中,对不一样的列名起别名,别名和实体类属性名一样
  2. 手动结果映射:通过@Results及@Result进行手动结果映射
@Select("select * from emp where id =#{id}")
@Results({
    @Result(column="dept_id",property="deptId"),
    @Result(column="create_time",property="createTime"),
    @Result(column="update_time",property="updateTime")})
public Emp getById(Integer id);
  1. 开启驼峰命名:如果字段名与属性名符合驼峰命名规则,mybatis会自动通过驼峰命名规则映射
    开启自动映射
    mybatis.configuration.map-underscore-to-camel-case=true

根据条件查询

SQL语句

select *  from emp where name like '%张%' and gender = 1 and entrydate between '2010-01-01' and '2020-01-01 ' order by update_time desc;

接口方法

@Select("select * from emp where name like  concat('%',#{name},'%') and gender = #{gender} and entrydate between #{begin} and #{end} order by update_time desc")
public List<Emp> list(String name, Short gender , LocalDate begin , LocalDate end);

注意

  • MySQL中concat函数,使用方法:concat(str1,str2, ...)
  • 返回结果为连接参数产生的字符串

XML映射文件

规范

  • XML映射文件的名称与Mapper接口名称一致,并且XML映射文件的目录结构和Mapper接口的包结构相同(同名同位置)
  • XML映射文件的namespace属性为Mapper接口全限定名一致
  • XML映射文件中sql语句的id与Mapper接口中的方法名一致

XML映射文件---MybatisX插件的安装和使用

  • 简单的增删改查操作使用注解配置SQL,复杂的操作使用xml映射文件配置SQL
  • 如果xml映射文件和Mapper接口没有同名同位置,需要在application.properties属性文件中指定xml映射配置文件的位置

Mybatis动态SQL

<if>标签

<where>

  • <where>:代替where关键字,如果没有条件则不会被翻译成where关键字
  • 自动去除多余的and或者or

<if>

用于判断条件是否成立,使用test属性进行条件判断,如果条件为true,则拼接SQL

<set>

代替set关键字,并会删掉额外的逗号,用在update语句中

<foreach>

SQL语句

delete from emp where id in (1,2,3);

接口方法

public void deleteByIds(List<Integer> ids);

XML映射文件

<delete id = "deleteByIds">
   delete from emp where id in
   <foreach collection-"ids" item="id" separator="," open="(" close=")">
      #{id}
   </foreach>
</delete>
  • collection:被遍历的集合/数组名称
  • item:集合遍历出来的元素在,使用#{}引用
  • separator:每一次遍历使用的分隔符
  • open:遍历开始前拼接的片段
  • close:遍历结束后拼接的片段

<sql><include>

  • <sql>:定义可重用的SQL片段
  • <include>:通过属性refid,指定包含的sql片段

项目实战

准备工作

功能介绍&环境搭建

  1. 准备数据库表
  2. 创建springboot工程,引入对应的起步依赖(web,mybatis,mysql驱动,lombok)
  3. 配置文件application.properties中引入mybatis的配置信息,准备对应的实体类
  4. 准备对应的Mapper,Service(接口,实现类),Controller基础结构

Restful开发规范

风格

  • GET:查询id为1的用户
  • POST:新增用户
  • PUT:修改用户
  • DELETE:删除id为1的用户

注意事项

  • RESTful是一种风格,是约定的方式,约定不是规定,可以打破
  • 描述模块的功能通常使用复数,也就是加s的格式来描述,表示此类资源,而非单个资源,如user,emps,books

开发流程

  1. 查看页面原型,明确需求
  2. 阅读接口文档
  3. 思路分析
  4. 接口开发
  5. 接口测试
  6. 前后端联调

部门管理

查询思路

思路
  • 调用service查询部门,响应Result
    controller
  • 调用mapper接口查询
    service
  • select * from dept;
    mapper

前后端联调

(略)

删除部门

思路
  • 接收请求参数id,调用service删除部门,响应result
    @DeleteMapping
    @PathVariable
  • 调用mapper接口执行删除操作
  • delete from dept where id = ?;

新增部门

思路
  • 接收请求参数,调用service新增部门,响应result
    @PostMapping
    @RequestBody
  • 补充基础属性(创建时间,修改时间),调用mapper接口执行新增操作
  • insert into dept values(?,?,?);

一个完整的请求路径,应该是类上的@RequestMapping的value属性+方法上的@RequestMapping的value属性

员工管理

分页查询

分页插件PageHelper

  • 起步依赖
    pagehelper-spring-boot-starter
  • mapper
    由插件在sql后面添加limit分页
  • service实现类
  1. 设置分页参数
    PageHelper.startPage(pageNum:1, pageSize:2);
  2. 分页查询
    Page<Emp> page = (Page<Emp>)empMapper.list();
  3. 获取分页结果
log.info("总记录数:{}",page.getTotal());
log.info("当前页数据:{}",page.getResult());

思路

  • 接收分页参数page,pageSize(设置默认值),调用service进行分页查询,获取PageBean,响应Result
  • 设置分页参数,调用mapper接口分页查询,获取结果,封装成PageBean对象返回
  • select * from emp order by update_time desc;

@RequestParam的属性defaultValue可以来设置参数的默认值

分页查询(带条件)

思路

  • 接收参数(分页参数,查询条件),调用service进行分页条件查询,获取PageBean,响应Result
  • 调用Mapper接口方法,使用PageHelper完成分页条件查询,封装PageBean对象返回
  • select * from emp ... order by update_time desc;

删除员工

思路

  • 接收路径参数id数组,调用service进行批量删除,响应Result
    @DeleteMapping
    @PathVariable
  • 调用mapper接口进行批量删除操作
delete from emp
 where id in (?,?,?);
<foreach>

标签:JavaWeb,回顾,where,映射,接口,emp,SQL,小结,id
From: https://www.cnblogs.com/kyrie-66/p/17352858.html

相关文章

  • JavaWeb回顾与小结(四)
    数据库操作-DQLDQL英文全称是DataQueryLanguage(数据查询语言),用来查询数据库表中的记录基本查询条件查询where分组查询groupby排序查询orderby分页查询limit基本查询语法查询多个字段select字段1,字段2,字段3from表名;查询所有字段(通配符)select*from......
  • javaweb用户登录界面
    实验名称用户登录界面成绩评定所用仪器材料eclipsetomcatwin11实验目的或要求1.实验目的使用JSP实现用户登录验证。2.实验内容通过创建一个用户登录的页面,让用户输入正确的用户名、密码,并进行校验,若用户名和密码输入正确,则弹出您好,你的名字首字母,否则弹出用户名或密码错误,请重新输......
  • 电容知识点小结
    1、钽电容过滤纹波效果非常好,但是钽电容容易爆,质量不好,过压、接反均会导致其爆掉。爆的过程有明火,在爆炸火灾等级要求高的场合尽量不适用钽电容。应注意固体钽电容在高阻电路中瞬时击穿可自愈,使用时回路中应串联电阻器,阻值按照3欧姆每福特为宜。2、铝电解电容,一般最高电压就做......
  • 常见资产对比小结
    常见资产对比小结,存货固定资产无形资产。......
  • 区间DP小结(附经典例题) 转载
    区间DP转载自:原博客一、定义​区间DP是线性动态规划的扩展,适用场景为每段区间的最优解可以通过更小区间的最优解得到。所以我们一般的解题思路都是先在小区间得到最优解,然后总结出递推公式,利用小区间的最优解求大区间的最优解。二、实现伪代码//mst(dp,0)初始化dp数组for......
  • [C++11]左值、右值、左值引用、右值引用小结
     左值和右值左值:指表达式结束后依然存在的持久对象,可以取地址,具名变量或对象右值:表达式结束后就不再存在的临时对象,不可以取地址,没有名字。比如inta=b+c;,a就是一个左值,可以对a取地址,而b+c就是一个右值,对表达式b+c取地址会报错。C++11中右值又由两个概念组成:将亡值和纯......
  • 设计模式小结
    简单工厂模式将具有相同属性事物用一个抽象基类,里面具有抽象方法来作为父类,然后其他子类通过继承来实现这个基类,通过重写实现基类里面的抽象方法创建一个工厂方法,通过父类变量来策略模式就是在简单工厂模式的基础上,将工厂方法改成策略对象,然后去调用该对象的重写基类的抽象方法单一......
  • [生活日记]参与unity非游戏行业开发者大会小结
    今天下午花了半天时间公司全体都去人民广场参与了一个unity非游戏行业开发者大会,主要了解到unity这款全球顶尖之一的游戏引擎的一个发展史,从05年三个美国人技术研发开始,一直到12年开始引进中国,经过这短短两年左右的时间,获得了逛到游戏开发者的喜爱和肯定,它始于游戏,但非终止于游戏,今......
  • JavaWeb回顾与小结(三)
    请求与响应概述架构BS架构:Browser/Server,浏览器/服务器架构模式.客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端维护方便,体验一般CS架构:Client/Server,客户端/服务器架构模式开发,维护麻烦,体验不错请求(HttpServletRequest):获取请求数据响应(HttpServletRes......
  • JavaWeb回顾与小结(二)
    AjaxAjax介绍概念AsynchronousJavaScriptAndXML,异步的JS和XML作用数据交换:通过Ajax可以给服务器发送请求,并获取服务器响应的数据异步交互:可以在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页的技术原生Ajax准备数据地址创建XMLHttpRequest对象:......