JavaWeb后端基础知识(2)包括(MyBatis)

JavaWeb后端基础知识(2)

目录

JavaWeb后端基础知识(2)

一. MyBatis

1.什么是Mybatis?

2.步骤

(1)准备工作

(2)引入Mybatis的相关依赖,配置Mybatis

(3)编写SQL语句(注解或XML)

3. JDBC介绍

(1)JDBC:

(2)本质

4. 数据库连接池

(1)简介

(2)优势

(3)标准接口:DataSource

5. lombok

(1)简介

(2)注解

(3)依赖

6.基础操作(依据注解)

【1】删除

(1)案例

(2)注意事项

【2】日志输出

【3】 预编译SQL(使用#{}就会形成预编译SQL)

(1)优势

【4】SQL注入

(1)简介

(2)参数占位符

【5】删除

(1)案例

(2)新增(主键返回)

【6】更新

【7】数据封装

(1)方案一:给字段起别名,让别名与实体类属性一致(一般不用)

(2)方案二:通过@Results,@Result注解手动陕射封装(一般不用)

(3)在application.properties中添加(推荐)

【8】模糊匹配的问题

(1)问题

(2)通过concat函数解决

(3)在springBoot的1.x版本或单独使用mybatis要加@Param注解

7.基础操作(依据XML)

【1】规范

(4)案例

【2】选择

8. Mybatis动态SQL

[1]

(1)相关标签

(2)案例

[2]

(1)形参

(2)案例

[3]

(1)内容

(2)案例


一. MyBatis

1.什么是Mybatis?

(1)MyBatis是一款优秀的持久层框架,用于简化JDBC的开发。

(2)MyBatis本是Apache的一个开源项目iBatis,2010年这个项目由apache迁移到了googlecode,并且改名为MyBatis 。2013

年11月迁移到Github。

(3)官网:https://mybatis.org/mybatis-3/zh/index.html

2.步骤

(1)准备工作

(创建springboot工程、数据库表user、实体类User)

(2)引入Mybatis的相关依赖,配置Mybatis

(写在MyBatis自带的application.properties中)

#配置数据库的连接信息-四要素

#驱动类名称

spring.datasource,driver-class-name=com.mysql.cj.jdbc.Driver

#数据库连按的uzl(mybatis要换成自己的数据库名)

spring.datasource.url=jdbc:mysql://localhost:3306/mybatis

#连接数据库的用户名

spring.datasource.username=root

#连接数据库的密码(自己的)

spring.datasource.password=123456

(3)编写SQL语句(注解或XML)

1)在接口上添加@Mapper注解//在运行时,会自动生成该接口的实现类对象(代理对象),并且将该对象交给IOC容器管理

2)在方法上加@Select注解,括号里加sql语句。

3)案例

①接口

@Mapper

public interface UserMapper {

//查询全部用户信息

@Select("select *from user")

public list<user> list();

}

②单元测试

@springBootTest //springboot格合单元测试的注解

class SpringbootMybatisQuickstartApplicationTests(

@Autowired

private UserMapper userMapper;

@Test

public void testlistUser(){

List<ser>userList =userMapper.list();

userList.stream().forEach(user ->{

System.out.println(user);

});

}

}

3. JDBC介绍

(1)JDBC:

(Java DataBase Connectivity),就是使用java语言操作关系型数据库的一套API。

(2)本质

1)sun公司官方定义的一套操作所有关系型数据库的规范,即接口,

2)各个数据库厂商去实现这套接口,提供数据库驱动jar包。

3)我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。

4. 数据库连接池

(1)简介

1)数据库连接池是个容器,负责分配、管理数据库连接(Connection)

2)它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个

3)释放空闲时间超过最大空闲时间的连接,来避免因为没有释放连接而引起的数据库连接遗漏

(2)优势

1)资源重用

2)提升系统响应速度

3)避免数据库连接遗漏

(3)标准接口:DataSource

1)官方(sun)提供的数据库连接池接口,由第三方组织实现此接口。

2)功能:获取连接 Connection getConnection()throws sQlException;

3)常见产品:C3PO DBCP Druid Hikari(默认)

4)Druid(德鲁伊)

Druid连接池是阿里巴巴开源的数据库连接池项目,功能强大,性能优秀,是Java语言最好的数据库连接池之一

5)切换Druid数据库连接池

①pom.xml中:(Druid依赖)

<dependency>

<groupld>com.alibaba</groupld>

<artifactld>druid-spring-boot-starter</artifactld>

<version>1.2.8</version>

</dependency>

②application.properties中(数据库连接信息,已经做过了)

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Drivei

spring.datasource.url=jdbc:mysql://localhost:3306/mybatis

spring.datasource.username=root

spring.datasource.password=1234

5. lombok

(1)简介

Lombok是一个实用的]ava类库,能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、tostring等方法,并可以自动化生成日志变量,简化java开发、提高效率。

(2)注解

①@Getter/@Setter 为所有的属性提供get/set方法

②@ToString 会给类自动生成易阅读的 toString 方法

③@EqualsAndHashcode 根据类所拥有的非静态字段自动重写 equals 方法和 hashcode 方法

④@Data 提供了更综合的生成代码功能(@Getter+@Setter+@ToString+ @EqualsAndHashcode)(等于1+2+3,使用最多!!!)

⑤@NoArgsConstructor 为实体类生成无参的构造器方法

⑥@AllArgsConstructor 为实体类生成除了static修饰的字段之外带有各参数的构造器方法,

(3)依赖

<!--lombok-->

<dependency>

<groupId>org.projectlombok</groupId>

<artifactId>lombok</artifactId>

</dependency>

6.基础操作(依据注解)

【1】删除
(1)案例

@Mapper

public interface EmpMapper {

//根据ID删除数据

@Delete("delete from emp where id = #{id}(占位符)")

public void delete(Integer id);

}

(2)注意事项

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

【2】日志输出

可以在application.properties中,打开mybatis的日志,并指定输出到控制台。

#指定mybatis输出日志的位置,输出控制台

mybatis.configuration.log-impl= org.apache. ibatis .logging. stdout. StdOutlmpl

【3】 预编译SQL(使用#{}就会形成预编译SQL)
(1)优势

①性能更高

②更安全(防止SQL注入)

【4】SQL注入
(1)简介

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

如:检查登录时的sql语句

select count(*)from emp where username ='zhangsan' and password='111';

可以输入帐号111密码‘or'1' ='1就形成了

select count(*)from emp where username=‘111'and password=‘’or ‘1'=’1';此时一定可以登录成功。

(2)参数占位符

1)#{...}

①执行SQL时,会将#{...}替换为?,生成预编译SQL,会自动设置参数值。

②使用时机:参数传递,都使用#{...}

2)${...}

①拼接SQL。直接将参数拼接在SQL语句中,存在SQL注入问题。

②使用时机:如果对表名、列表进行动态设置时使用.

【5】删除
(1)案例

@Insert("insert into emp(username, name, gender, image, job, entrydate, dept id, create time, update time) " +

“values(#{username}, #{namel, #{gender}, #{image}, #{job}, #{entrydate}, #{deptld), #{createTime}, #updateTime})")

public void insert(Emp emp);(上面的参数都为emp的成员变量)

(2)新增(主键返回)

1)描述:在数据添加成功后,需要获取插入数据库数据的主键

如:添加套餐数据时,还需要维护套餐菜品关系表数据。

2)实现

在@Insert注解上面加上@Options(keyProperty="id",useGeneratedKeys = true)会自动将生成的主键值,赋值给emp对象的id属性(“id”可换成其他属性)。

【6】更新

@Update注解

【7】数据封装

实体类属性名 和 数据库表查询返回的字段名一致,mybatis会自动封装。

如果实体类属性名 和 数据库表查询返回的字段名不一致,不能自动封装

(1)方案一:给字段起别名,让别名与实体类属性一致(一般不用)

@Select("select id,username, password, name, gender, image, job, entrydate,dept_id deptId, create_time createTime, update_time updaterime from emp where id m f{id)")

(2)方案二:通过@Results,@Result注解手动陕射封装(一般不用)

@Results({

@Result(column ="dept_id",property= "deptId"),

@Result(column="create_time",property = "createTime"),

@Result(column = "update_time", property = "updaterime")

})

(3)在application.properties中添加(推荐)

#开启mybatis的驼峰命名自动映射开关a_column—>aCloumn

mybatis.configuration.map-underscore-to-camel-case=true

【8】模糊匹配的问题
(1)问题

@select("select * from emp where name like '%{name}%' and gender = #{gender} and " +"entrydate between #{begin} and #{end} order by update time desc ")

#{}不能出现在引号中,因此模糊匹配中#{}换成${},但有风险,性能低、不安全、存在SQL注入问题

(2)通过concat函数解决

@Select("select * from emp where name like concat('%',#{name},'%') and gender = #{gender) and "+"entrydate between #{becin} and #{end} order by update_time desc“}

public List<Emp>list(String name,Short gender,LocalDate begin,LocalDate end);

(3)在springBoot的1.x版本或单独使用mybatis要加@Param注解

@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 (@Param("name")String name, @Param("gender")short gender ,

@Param("begin")localDate begin ,@Param("end")localDate end);

7.基础操作(依据XML)

【1】规范

(1)XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下(同包同名)

(2)XML映射文件的namespace属性为Mapper接口全限定名一致。

(3)XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致。

(4)案例

1)Mapper接口

@Mapper

public interface EmpMapper {

public List<Emp> list (String name, Short gender , LocalDate begin , LocalDate end);

}

2)XML映射文件

<mapper namespace="com.itheima.mapper.EmpMapper">

<select id="list" resultType="com.itheima.pojo.Emp">

select * from emp where name like concat('%',#{name},"%’) and gender = #gender) and entrydate between #{begin} and #{end} order by update time desc

</select>

</mapper>

(resultType:单条记录所封装的类型,要全类名)

【2】选择

使用Mybatis的注解,主要是来完成一些简单的增删改查功能。如果需要实现复杂的SQL功能,建议使用XML来配置映射语句。

8. Mybatis动态SQL

[1]<if>
(1)相关标签

<if>:用于判断条件是否成立。使用test属性进行条件判断,如果条件为true,则拼接SQL。test属性是用来指定条件的。

<where>:where 元素只会在子元素有内容的情况下才插入where子句。而且会自动去除子句的开头的AND 或OR。

<set>

动态地在行首插入 SET 关键字,并会删掉额外的逗号。(用在update语句中)

(2)案例

<where>

<if test="name != null">

namd like concat('&',#{name},'$')

</if>

<if test "gender ! null">

and gender = figender}

</if>

<if test="begin != null and end != null">

and entrydate between #{begin} and f{end}

</if>

</where>

[2]<foreach>

<!--批借删除员工(18,19,20)-->

(1)形参

collection:遍历的集合

item:遍历出来的元素

separator: 每一次遍历使用的分隔符

open: 遍历开始前拼接的片段

close: 遍历结束后拼接的片段

(2)案例

<delete id="deleteByIds">

delete from emp where id in

<foreach collection="ids" item="id" separator="," open="(" close=")">

#{id}

</foreach>

</delete>

[3]<sql><include>
(1)内容

<sql>:定义可重用的 SQL 片段。

<include>:通过属性refid,指定包含的sql片段。

(2)案例

<sql id="commonSelect“>

select id,username, password, name, gender,image, job, entrydate.

dept id, create time, update time from emp

</sql>

<include refid="commonSelect"/>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/10317.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

串口属性中的BM延时计时器问题

如果使用程序修改则需要修改注册表对应位置如下 第一个示例&#xff08;217&#xff09; 第二个示例&#xff08;219&#xff09; 需要注意的事情是修改前必须点查看串口名称&#xff08;例如上图是com5&#xff09; 程序修改&#xff1a; 有没有办法以编程方式更改USB <…

【力扣】63.不同路径 II

原题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 目录 1.题目描述 2.思路分析 3.代码实现 1.题目描述 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试…

unity通过路径找到特定对象并获取指定类型组件的泛型方法

/// <summary>/// 通过路径找到指定类型的组件/// </summary>/// <param name"path">path: 指定要查找的组件所在的GameObject的路径</param>/// <param name"parent">parent: 指定查找的GameObject的父对象&#xff0c;默认…

uniapp管理后台编写,基于uniadmin和vue3实现uniapp小程序的管理后台

一&#xff0c;创建uniAdmin项目 打开开发者工具Hbuilder,然后点击左上角的文件&#xff0c;点新建&#xff0c;点项目。如下图。 选择uniadmin&#xff0c;编写项目名&#xff0c;然后使用vue3 记得选用阿里云服务器&#xff0c;因为最便宜 点击创建&#xff0c;等待项目创…

Codeforces Round 605 (Div. 3) A~D

本人水平不高&#xff0c;开这个专栏主要是督促自己补题&#xff0c;有些题对目前的我来说还比较难&#xff0c;还补不动&#xff0c;等以后能力上来了再补。。。 原题链接&#xff1a;Dashboard - Codeforces Round 605 (Div. 3) - Codeforces 目录 A. Three Friends B. Sn…

Linux端口状态含义(未完

前言 在面试或者企业实战中常见的命令 那就是查询端口命令是哪个 1. 前沿知识 查询端口命令&#xff1a;lsof -i 查询端口的状态&#xff1a;netstat 命令参数说明-tTCP端口-uUDP端口-p进程表示符和程序名称-n显示IP 常用的netstat结合grep进行精准查询 添加链接描述 添…

C# 快速把List<string>集合转换成一个字符串

在C#中&#xff0c;要将List<string>类型的集合转换成一个单一的字符串&#xff0c;其中各元素由特定的分隔符连接&#xff0c;通常推荐使用String.Join()方法。 简单的示例&#xff1a; 使用for循环 代码如下&#xff1a; using System; using System.Collections.G…

【Linux:lesson1】的基本指令

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;Linux课程学习 &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 &#x1f697;打开Xshell&#xff0c;登陆root…

初识java--javaSE(3)--方法,递归,数组,

文章目录 一 方法的使用1.1 什么是方法&#xff1f;main方法注意事项 1.2 方法的调用嵌套调用在方法调用时形参与实参的关系&#xff1a; 1.3 方法的重载方法重载的意义&#xff1f;总结方法重载&#xff1a;方法签名&#xff1a; 二 递归什么是递归&#xff1f;递归的精髓&…

蛋糕店做配送小程序的作用是什么

蛋糕烘焙除了生日需要&#xff0c;对喜吃之人来说往往复购率较高&#xff0c;除线下实体店经营外&#xff0c;更多的商家选择线上多种方式获客转化、持续提高生意营收&#xff0c;而除了进驻第三方平台外&#xff0c;构建品牌私域自营店铺也同样重要。 运用【雨科】平台搭建蛋…

ABAP跨client的RFC调用

1、SM59配置连接 2、创建需要调用的函数&#xff0c;ZGET_TM_LIST&#xff0c;开启远程启用模块 3、新建调用程序 DATA:L_MSG TYPE C,LSH(30) TYPE C. DATA:IT_ZSTM_LIST TYPE STANDARD TABLE OF ZSTM_LIST WITH HEADER LINE.CALL FUNCTION ZGET_TM_LIST DESTINATION ZTEST_R…

C# 判断Access数据库中表是否存在,表中某个字段是否存在

在C#中判断Access数据库中某个表是否存在以及该表中某个字段是否存在&#xff0c;可以通过以下步骤实现&#xff1a; 判断表是否存在 可以使用ADO.NET中的OleDbConnection.GetOleDbSchemaTable方法来获取数据库的架构信息&#xff0c;并检查特定的表是否存在。 using System…

【回溯 网格 状态压缩】52. N 皇后 II

本文涉及知识点 回溯 网格 状态压缩 LeetCode52. N 皇后 II n 皇后问题 研究的是如何将 n 个皇后放置在 n n 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回 n 皇后问题 不同的解决方案的数量。 示例 1&#xff1a; 输入&#x…

python3如何安装bs4

在python官网找到beautifulsoup模块的下载页面&#xff0c;点击"downloap"将该模块的安装包下载到本地。 将该安装包解压&#xff0c;然后在打开cmd&#xff0c;并通过cmd进入到该安装包解压后的文件夹目录下。 在该文件目录下输入"python install setup.py&quo…

信息系统架构模型_3.企业数据交换总线

1.企业数据交换总线 实践中&#xff0c;还有一种较常用的架构&#xff0c;即企业数据交换总线&#xff0c;即不同的企业应用之间进行信息交换的公共通道&#xff0c;如图1所示。 图1 企业数据交换总线架构 这种架构在大型企业不同应用系统进行信息交换时使用较普遍&am…

前端笔记-day05

文章目录 01-结构伪类选择器02-结构伪类选择器-公式用法03-伪元素选择器04-盒子模型-组成05-盒子模型-边框线06-盒子模型-单方向边框线07-盒子模型-内边距08-盒子模型-padding多值写法09-盒子模型-尺寸计算10-盒子模型-版心居中11-清除默认样式12-元素溢出overflow13-外边距合并…

uniapp解决后端传来的id太长导致精度丢失(超过16位的数字会变成0000)的问题

办法一&#xff1a;让后端把id传成字符串类型&#xff1b; 办法二&#xff1a;用jsonBig转换为bigInt数字类型&#xff1a; 1.在项目根目录打开命令行输入命令安装jsonBig插件&#xff1a; npm install json-bigint1.0.02.在封装的请求中使用插件&#xff0c;核心是在uni.re…

嵌入式基础课程配套电机FOC伺服电机开发板AT32F403磁编码IMU姿态

嵌入式基础课程配套电机FOC伺服电机开发板AT32F403磁编码IMU姿态 带你入门嵌入式有二十多年开发经验的老技骨做技术支持整个开发包硬件包括电机2205&#xff0c;支持12V到24V宽输入&#xff0c;配套12V2A电源。包装原理图和PCB嵌入式软件嵌入式基础课程 带你入门嵌入式 电机FO…

即插即用篇 | YOLOv8引入局部自注意力 HaloAttention | 为参数高效的视觉主干网络扩展局部自注意力

本改进已集成到 YOLOv8-Magic 框架。 我们提出了Axial Transformers,这是一个基于自注意力的自回归模型,用于图像和其他组织为高维张量的数据。现有的自回归模型要么因高维数据的计算资源需求过大而受到限制,要么为了减少资源需求而在分布表达性或实现的便捷性上做出妥协。相…

[力扣题解]51. N皇后

题目&#xff1a;51. N皇后 思路 回溯法 代码 class Solution { public:vector<vector<string>> result;bool right(int row, int col, int n, vector<string>& board){int i, j;// 不能同行, 这里我又没有写错&#xff0c;为什么结果不对呢&#xf…