您的位置:首页 > 汽车 > 新车 > 互联网公司有哪几家_郑州建站系统费用_东莞今天最新消息新闻_软文文案案例

互联网公司有哪几家_郑州建站系统费用_东莞今天最新消息新闻_软文文案案例

2025/5/20 2:58:28 来源:https://blog.csdn.net/2301_80055001/article/details/144841986  浏览:    关键词:互联网公司有哪几家_郑州建站系统费用_东莞今天最新消息新闻_软文文案案例
互联网公司有哪几家_郑州建站系统费用_东莞今天最新消息新闻_软文文案案例

JDBC回顾

select 语句 "select *from student" 演示:

         驱动包

JDBC 的操作流程:

1.  创建数据库连接池 DataSource
2. 通过 DataSource 获取数据库连接 Connection
3. 编写要执⾏带 ? 占位符的 SQL 语句
4. 通过 Connection 及 SQL 创建操作命令对象 Statement
5. 替换占位符:指定要替换的数据库字段类型,占位符索引及要替换的值
6. 使⽤ Statement 执⾏ SQL 语句
7. 查询操作:返回结果集 ResultSet,更新操作:返回更新的数量
8. 处理结果集
9. 释放资源

Mybatis 是什么

MyBatis是⼀款优秀的 持久层 框架,⽤于简化JDBC的开发
持久层:指的就是持久化操作的层, 通常指数据访问层(dao), 是⽤来操作数据库的

简单来说 MyBatis 是更简单完成程序和数据库交互的框架,是更简单的操作和读取数据库⼯具 

Mybatis 入门

Mybatis操作数据库的步骤:
1. 准备⼯作(创建springboot⼯程、数据库表准备、实体类)
2. 引⼊Mybatis的相关依赖,配置Mybatis(数据库连接信息)
3. 编写SQL语句(注解/XML)
4. 测试

准备工作

创建springboot⼯程,并导⼊ mybatis 的依赖、mysql 的驱动包

    Lombok                Spring Web                Mybatis Framework                 MySQL Driver

Mybatis 是⼀个持久层框架, 具体的数据存储和数据操作还是在MySQL中操作的, 所以需要添加 MySQL 驱动
项⽬⼯程创建完成后,⾃动在pom.xml⽂件中,导⼊Mybatis依赖和MySQL驱动依赖
版本会随着SpringBoot 版本发⽣变化, ⽆需关注

创建用户表 mybatis_test  

创建对应的实体类 UserInfo

实体类的属性名与表中的字段名⼀⼀对应

配置数据库连接字符串

Mybatis中要连接数据库,需要数据库相关参数配置
MySQL驱动类
登录名
密码
数据库连接字符串

如果使⽤ MySQL 是 5.x 之前的使⽤的是"com.mysql.jdbc.Driver",如果是⼤于 5.x 使⽤的
是“com.mysql.cj.jdbc.Driver

写持久层代码

在项⽬中, 创建持久层接⼝ UserInfoMapper

Mybatis的持久层接⼝规范⼀般都叫 XxxMapper
@Mapper注解:表⽰是MyBatis中的Mapper接⼝
程序运⾏时, 框架会⾃动⽣成接⼝的实现类对象(代理对象),并给交Spring的IOC容器管理
@Select注解:代表的就是select查询,也就是注解对应⽅法的具体实现内容

单元测试

在创建出来的SpringBoot⼯程中,在src下的test⽬录下,已经⾃动帮我们创建好了测试类 ,我们可以 直接使⽤这个测试类来进⾏测试
测试类上添加注解 @SpringBootTest,该测试类在运⾏时,就会⾃动加载Spring的运⾏环境
通过@Autowired这个注解, 注⼊要测试的类, 就可以开始进⾏测试了
使⽤ Idea ⾃动⽣成测试类
除此之外, 也可以使⽤Idea⾃动⽣成测试类 :
1)在需要测试的Mapper接⼝中, 右键 -> Generate -> Test
2)选择要测试的⽅法, 点击 OK

使用 IDEA 自动生成测试类进行单元测试

返回结果中, 可以看到, 只有SQL语句中查询的列对应的属性才有赋值

MyBatis的基础操作

打印日志

在Mybatis当中我们可以借助⽇志, 查看到sql语句的执⾏、执⾏传递的参数以及执⾏结果
在配置⽂件中进⾏配置即可
mybatis:configuration: # 配置打印 MyBatis⽇志log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

重启程序,查看输出结果

参数传递

SQL语句中的id值一般不能写成固定数值,需要变为动态的数值——>
在⽅法中添加⼀个参数(id),将⽅法中的参数,传给SQL语句
使⽤   #{}   的⽅式获取⽅法中的参数
@Select("select id,username,password,age,gender from userinfo where id = #{id}")
UserInfo getUser(Integer id);@Test
void getUserInfoAll() {UserInfo userInfo = userInfoMapper.getUser(1);System.out.println(userInfo);
}

如果mapper接⼝⽅法形参只有⼀个普通类型的参数,#{…} ⾥⾯的属性名可以随便写,如:#{id}、#{value}。建议和参数名保持⼀致
@Select("select id,username,password,age,gender from userinfo where id = #{userId}")
UserInfo getUser(@Param("userId") Integer id);
可以通过 @Param  设置参数的别名, 如果使⽤ @Param 设置别名, #{...}⾥⾯的属性名必须和@Param 设置的⼀样 
@Select("select id,username,password,age,gender from userinfo where id = #{id} and password = #{password}")
UserInfo getUser(Integer id,String password);@Test
void getUserInfoAll() {UserInfo userInfo = userInfoMapper.getUser(1,"admin");System.out.println(userInfo);
}

如果只有一个结果返回,可以使用对象或者集合接受

如果有多个结果返回,必须使用集合接受

程序会根据参数自动生成一些参数,例如 param1 对应方法的第一个参数...

​​​​​​​Mybatis开发方式 

Mybatis的开发有两种⽅式:
1. 注解
2. XML
使⽤Mybatis的注解⽅式,主要是来完成⼀些简单的增删改查功能. 如果需要实现复杂的SQL功能,建议使⽤XML来配置映射语句,也就是将SQL语句写在XML配置⽂件中

注解

增(Insert)

如果设置了 @Param 属性, #{...} 需要使⽤ 参数.属性 来获取
@Insert("insert into userinfo (id,username,password,age,gender)" +" values(#{info.id},#{info.username},#{info.password},#{info.age},#{info.gender})")
Integer InsertUserInfo(@Param("info") UserInfo userInfo); 

返回主键 

Insert 语句默认返回的是 受影响的⾏数
但有些情况下, 数据插⼊之后, 还需要有后续的关联操作, 需要获取到新插⼊数据的id
如果想要拿到⾃增id, 需要在Mapper接⼝的⽅法上添加⼀个Options的注解
设置 useGeneratedKeys=true 之后, ⽅法返回值依然是受影响的⾏数, ⾃增 id 会设置在上
keyProperty 指定的属性中
useGeneratedKeys:这会令 MyBatis 使⽤ JDBC 的 getGeneratedKeys ⽅法来取出由数据库内部⽣成的主键(⽐如:像 MySQL 和 SQL Server 这样的关系型数据库管理系统的⾃动递增字段),默认值:false.
•  keyProperty:指定能够唯⼀识别对象的属性,MyBatis 会使⽤ getGeneratedKeys 的返回值或insert 语句的 selectKey ⼦元素设置它的值,默认值:未设置(unset)

删(Delete)

改(Update)

查(Select)

们在上⾯查询时发现, 有⼏个字段是没有赋值的, 只有Java对象属性和数据库字段⼀模⼀样时, 才会进⾏赋值
从运⾏结果上可以看到, 我们SQL语句中, 查询了delete_flag, create_time, update_time, 但是这⼏个属性却没有赋值
MyBatis 会根据⽅法的返回结果进⾏赋值.
1)⽅法⽤对象 UserInfo接收返回结果, MySQL 查询出来数据为⼀条, 就会⾃动赋值给对象.
2)⽅法⽤List<UserInfo>接收返回结果, MySQL 查询出来数据为⼀条或多条时, 也会⾃动赋          值给List
3)但如果MySQL 查询返回多条, 但是⽅法使⽤UserInfo接收, MyBatis执⾏就会报错
原因分析:
当⾃动映射查询结果时,MyBatis 会获取结果中返回的列名并在 Java 类中查找相同名字的属性(忽略大小写)。 这意味着如果发现了 ID 列和 id 属性,MyBatis 会将列 ID 的值赋给 id 属性

 解决方法:1)起别名  2)结果映射  3)驼峰命名

1)起别名

在SQL语句中,给列名起别名,保持别名和实体类属性名⼀样

 2)结果映射

如果其他SQL, 也希望可以复⽤这个映射关系, 可以给这个Results定义⼀个名称
使⽤ id 属性给该 Results 定义别名, 使⽤ @ResultMap 注解来复⽤其他定义的 ResultMap

 3)驼峰命名

通常数据库列使⽤蛇形命名法进⾏命名(下划线分割各个单词), ⽽ Java 属性⼀般遵循驼峰命名法约定
为了在这两种命名⽅式之间启⽤⾃动映射,需要将 mapUnderscoreToCamelCase 设置为
true

MyBatis XML 配置文件

MyBatis XML的⽅式需要以下两步:

1. 配置数据库连接字符串和MyBatis
2. 写持久层代码

配置连接字符串和MyBatis

此步骤需要进⾏两项设置,数据库连接字符串设置和 MyBatis 的 XML ⽂件配置

持久层代码的编写准备

添加 mapper 接⼝
数据持久层的接⼝定义:    UserInfoXmlMapper.java

 添加 UserInfoXMLMapper.xml

数据持久成的实现,MyBatis 的固定 xml 格式:
创建UserInfoXMLMapper.xml, 路径参考yml中的配置
以下是对以上标签的说明:
<mapper> 标签:需要指定 namespace 属性,表⽰命名空间,值为 mapper 接⼝的 全限定
,包括全包名.类名
<select> 查询标签:是⽤来执⾏数据库的查询操作的:
id :是和 Interface(接⼝)中定义的⽅法名称⼀样的,表⽰对接⼝的具体实现⽅法
resultType :是返回的数据类型,也就是开头我们定义的实体类

增(Insert)

       .java

                                     .xml

1)如果使⽤@Param设置参数名称的话, 使⽤⽅法和注解类似 

2)返回⾃增 id,接⼝定义不变, Mapper.xml 实现设置useGeneratedKeys 和keyProperty属性

删(Delete)

改(Update)

查(Select)

同样的, 使⽤XML 的⽅式进⾏查询, 也存在数据封装的问题
解决办法和注解类似:
1. 起别名
2. 结果映射
3. 驼峰命名
其中1,3的解决办法和注解⼀样,不再多说, 接下来看下xml如果来写结果映射

增,删,改返回的是影响的行数

查 返回的结果可能是字符串,对象,数字...需要指定类型

 

从控制台返回的结果可知,此时仍未查到要求的值

 

其他查询操作

多表查询

Mybatis 不分单表还是多表, 主要就是三部分: SQL, 映射关系和实体类

通过映射关系, 把SQL运⾏结果和实体类关联起来

如果名称不⼀致的, 采⽤ResultMap, 或者别名的⽅式解决, 和单表查询⼀样

在配置文件中指定的库中创建 作者类 

#{} 和 ${}

#{} 使⽤的是预编译SQL, 通过 ? 占位的⽅式, 提前对SQL进⾏编译, 然后把参数填充到SQL语句中. #{} 会根据参数类型, ⾃动拼接引号 '' 
${} 会直接进⾏字符替换, ⼀起对SQL进⾏编译. 如果参数为字符串, 需要加上引号 '' 
参数为数字类型时, 也可以加上, 查询结果不变, 但是可能会导致索引失效, 性能下降
#{} 和 ${}区别:
#{} 和 ${} 的区别就是预编译SQL和即时SQL 的区别
1. 性能更⾼
绝⼤多数情况下, 某⼀条 SQL 语句可能会被反复调⽤执⾏, 或者每次执⾏的时候只有个别的值不同(⽐如 select 的 where ⼦句值不同, update 的 set ⼦句值不同, insert 的 values 值不同). 如果每次都需要经过上⾯的语法解析, SQL优化、SQL编译等,则效率就明显不⾏了
预编译SQL,编译⼀次之后会将编译后的SQL语句缓存起来,后⾯再次执⾏这条语句时,不会再次编译(只是输⼊的参数不同), 省去了解析优化等过程, 以此来提⾼效率
2. 更安全(防⽌SQL注⼊)
SQL注⼊:是通过操作输⼊的数据来修改事先定义好的SQL语句,以达到执⾏代码对服务器进⾏攻击的⽅法
由于没有对⽤⼾输⼊进⾏充分检查,⽽SQL⼜是拼接⽽成,在⽤⼾输⼊参数时,在参数中添加⼀些SQL关键字,达到改变SQL运⾏结果的⽬的,也可以完成恶意攻击

SQL注入演示:

正常输入——>

SQL注入场景——>

排序功能

${} 会有SQL注⼊的⻛险, 所以我们尽量使⽤#{}完成查询

然而 ${}存在,就一定有其应用的场景:

使⽤ ${sort} 可以实现排序查询, ⽽使⽤ #{sort} 就不能实现排序查询了
注意: 此处 sort 参数为String类型, 但是SQL语句中, 排序规则是不需要加引号 '' 的, 所以此时的${sort} 也不加引号
当使⽤ #{sort} 查询时, asc 前后⾃动给加了引号, 导致 sql 错误
#{} 会根据参数类型判断是否拼接引号 ''
如果参数类型为String, 就会加上 引号
表名作为参数时, 也只能使⽤ ${}

like 查询

like 使⽤ #{} 报错:

把 #{} 改成 ${} 可以正确查出来, 但是${}存在SQL注⼊的问题, 所以不能直接使⽤ ${}
解决办法: 使⽤ mysql 的内置函数 concat() 来处理,实现代码如下:

数据库连接池

在上⾯Mybatis的讲解中, 使⽤了数据库连接池技术, 避免频繁的创建连接, 销毁连接
下⾯来了解下数据库连接池

介绍

数据库连接池负责分配、管理和释放数据库连接,它允许应⽤程序重复使⽤⼀个现有的数据库连接,⽽不是再重新建⽴⼀个
1)没有使⽤数据库连接池的情况: 每次执⾏SQL语句, 要先创建⼀个新的连接对象, 然后执⾏        SQL语句, SQL语句执⾏完, 再关闭连接对象释放资源. 这种重复的创建连接, 销毁连接⽐        较消耗资源
2)使⽤数据库连接池的情况: 程序启动时, 会在数据库连接池中创建⼀定数量的Connection          对象, 当客⼾请求数据库连接池, 会从数据库连接池中获取Connection对象, 然后执⾏            SQL, SQL语句执⾏完, 再把Connection归还给连接池

使用

常⻅的数据库连接池:
C3P0
DBCP
Druid
Hikari
⽬前⽐较流⾏的是 Hikari, Druid
1. Hikari : SpringBoot默认使⽤的数据库连接池
2. Druid
如果我们想把默认的数据库连接池切换为Druid数据库连接池, 只需要引⼊相关依赖即可
< dependency >
      < groupId >com.alibaba</ groupId >
      < artifactId >druid-spring-boot-starter</ artifactId >
      < version >1.1.17</ version >
</ dependency >

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com