Web day06 JDBC Mybatis

目录

JDBC:

MyBatis 框架:

环境配置:

编写持久层(dao层)接口 并写sql语句:

单元测试:

JDBC MyBatis 优缺点:

数据库链接池:

运用Mybaits增删改查:

删除:

面试题:

新增:

修改:

查询:

XML映射配置:


JDBC:

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

1).创建一个数据库 web,并在该数据库中创建user表

create table user(id int unsigned primary key auto_increment comment 'ID,主键',username varchar(20) comment '用户名',password varchar(32) comment '密码',name varchar(10) comment '姓名',age tinyint unsigned comment '年龄'
) comment '用户表';insert into user(id, username, password, name, age) values (1, 'daqiao', '123456', '大乔', 22),(2, 'xiaoqiao', '123456', '小乔', 18),(3, 'diaochan', '123456', '貂蝉', 24),(4, 'lvbu', '123456', '吕布', 28),(5, 'zhaoyun', '12345678', '赵云', 27);

 JDBC基本语法 :

public static void main(String[] args) {// 目标:掌握JDBC操作数据库的基本程序。// 1、配置MySQL数据库的驱动依赖。// 2、使用JDBC代码操作数据库。try {// 3、加载驱动对象。Class.forName("com.mysql.jdbc.Driver");// 4、通过驱动管理器获取与数据库的链接对象。Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/dlei01", "root", "dlei");// 5、通过链接对象获取数据库操作对象Statement。Statement stm = conn.createStatement();// 6、通过stm对象发送sql语句到数据库操作String sql = "update tb_user set username = '灭绝师太' where id = 15";// 7、正式发送,返回修改的数量。int count = stm.executeUpdate(sql);// 8、处理结果。System.out.println("成功修改了几条数据:" + count);// 9、关闭资源。stm.close();conn.close();} catch (Exception e) {e.printStackTrace();}}

1.加载类驱动对象 回自动把对象 封装到 DiverManager 类中运用 动态代理 在调用静态方法 getConnection时 把可以 获取  数据库的url 用户名 和密码 并且 用类驱动对象 链接数据库

2. 通过链接对象 conn 获取数据库操作对象 Statement  通过 Statement的 方法 executeUpdate 正式发送sql语句 返回 修改的数量  

public static void main(String[] args) {// 目标:理解预编译的方案(重点)try {// 1、注册驱动Class.forName("com.mysql.cj.jdbc.Driver");// 2、获取链接对象Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/dlei01", "root", "dlei");// 3、准备sql语句String sql = "select * from tb_user where username = ? and password= ?";// 4、获取执行sql对象PreparedStatementPreparedStatement pstm = conn.prepareStatement(sql);// 5、给?赋值pstm.setString(1, "dlei0009");pstm.setString(2, "666888");// 6、通知执行sql查询,得到结果集对象。ResultSet rs = pstm.executeQuery();// 7、处理结果集List<User> users = new ArrayList<>(); // 多态!while (rs.next()) {// 每次读取一行数据,就封装成一个User对象。User user = new User();user.setId(rs.getInt("id"));user.setUsername(rs.getString("username"));user.setAge(rs.getInt("age"));user.setGender(rs.getString("gender"));//user.setPassword(rs.getString("password"));// 8、将User对象添加到集合中users.add(user);}users.forEach(u -> System.out.println(u));} catch (Exception e) {e.printStackTrace();}}

并未将参数值在SQL语句中写死,而是使用 ? 进行占位,然后再指定每一个占位符对应的值是多少,而最终在执行SQL语句的时候,程序会将SQL语句(SELECT * FROM user WHERE username = ? AND password = ?),以及参数值("daqiao", "123456")都发送给数据库,然后在执行的时候,会使用参数值,将?占位符替换掉。

使用预编译的方法  防止 用户名 和密码 写死 

预编译的作用:

防止sql注入:

如果不使用预编译  密码 为 ' or '1' = '1 时 查询 会 恒为真 会直接进入系统 产生安全问题

  • JDBC程序执行DML语句:int rowsUpdated = pstmt.executeUpdate(); //返回值是影响的记录数

  • JDBC程序执行DQL语句:ResultSet resultSet = pstmt.executeQuery(); //返回值是查询结果集

MyBatis 框架:

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

  • MyBatis本是 Apache的一个开源项目iBatis,2010年这个项目由apache迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。

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

  • 持久层:指的是就是数据访问层(dao),是用来操作数据库的。

 

  • 框架:是一个半成品软件,是一套可重用的、通用的、软件基础代码模型。在框架的基础上进行软件开发更加高效、规范、通用、可拓展。

环境配置:

application.properties 中配置数据库的连接信息。和配置Mybatis日志输出

#数据库访问的url地址
spring.datasource.url=jdbc:mysql://localhost:3306/web
#数据库驱动类类名
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#访问数据库-用户名
spring.datasource.username=root
#访问数据库-密码
spring.datasource.password=root@1234#mybatis的配置
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

 

编写持久层(dao层)接口 并写sql语句:

在dao层创建  UserMapper接口:

@Mapper
public interface UserMapper {@Select("select * from t_student ")List<User> findAll();@Delete("delete from t_student where id=#{id}")int deleteById(Integer id);@Select("select * from t_student where id=#{id} and salary=#{salary}")User findById(@Param("id") int idx, int salary);@Insert("insert into t_student values(#{id},#{username},#{age},#{gender},#{salary})")int addUser(User user);@Update("update t_student set username=#{username},age=#{age},gender=#{gender},salary=#{salary} where id=#{id}")int updateUser(User user);List<User> findByAge(Integer age);void updateUser2(User user);}
  • @Mapper注解:表示是mybatis中的Mapper接口

程序运行时,框架会自动生成接口的实现类对象(代理对象),并给交Spring的IOC容器管理

  • @Select注解:代表的就是select查询,用于书写select查询语句

原理解析:

先用动态代理的方法 创建 接口的实现类对象 例如deleteById 方法 对象调用某以方法时 可以在    InovocationHandler 接口的实现类对象重写的抽象方法invoke 的参数 args 中 获得   参数 Integer id

再用反射创建类对象 找出注解 Delete 并创建注解对象 拿到 value 的值 delete from t_student where id=#{id} 从而  拼接获得了完整的 sql语句  再  用     MyBatis 框架链接数据库进行查询

单元测试:

@SpringBootTest
class SpringbootMybatisQuickstartApplicationTests {@Autowiredprivate UserMapper userMapper;@Testpublic void testFindAll(){List<User> userList = userMapper.findAll();for (User user : userList) {System.out.println(user);}}
}

注意:

Autowired 时 spring会自动 创建 UserMapper 接口的实现类对象 并 自动放入 IOC容器中 

在autowired时 自动注入 bean 对象 和 之前自己写实现类对象并加 @Component / @Respository

不同

JDBC MyBatis 优缺点:

JDBC程序的缺点

  • url、username、password 等相关参数全部硬编码在java代码中。

  • 查询结果的解析、封装比较繁琐。

  • 每一次操作数据库之前,先获取连接,操作完毕之后,关闭连接。 频繁的获取连接、释放连接造成资源浪费。

Mybatis的解决:

  • 数据库连接四要素(驱动、链接、用户名、密码),都配置在springboot默认的配置文件 application.properties中

  • 查询结果的解析及封装,由mybatis自动完成映射封装,我们无需关注

  • 在mybatis中使用了数据库连接池技术,从而避免了频繁的创建连接、销毁连接而带来的资源浪费。

数据库链接池:

和 线程池 类似

在前面我们所讲解的mybatis中,使用了数据库连接池技术,避免频繁的创建连接、销毁连接而带来的资源浪费。

1). 没有数据库连接池的情况

客户端执行SQL语句:要先创建一个新的连接对象,然后执行SQL语句,SQL语句执行后又需要关闭连接对象从而释放资源,每次执行SQL时都需要创建连接、销毁链接,这种频繁的重复创建销毁的过程是比较耗费计算机的性能。

2). 有数据库连接池的情况

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

  • 程序在启动时,会在数据库连接池(容器)中,创建一定数量的Connection对象

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

  • 客户端在执行SQL时,先从连接池中获取一个Connection对象,然后在执行SQL语句,SQL语句执行完之后,释放Connection时就会把Connection对象归还给连接池(Connection对象可以复用)

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

  • 客户端获取到Connection对象了,但是Connection对象并没有去访问数据库(处于空闲),数据库连接池发现Connection对象的空闲时间 > 连接池中预设的最大空闲时间,此时数据库连接池就会自动释放掉这个连接对象

数据库连接池的好处:

提高性能:
减少连接建立时间:每次数据库操作都需要建立和关闭连接,而连接池预先创建了一定数量的连接,减少了连接建立的时间。提高并发处理能力:连接池可以管理多个连接,使得应用程序能够同时处理更多的请求。


资源管理:
有效管理数据库连接:连接池可以限制同时打开的最大连接数,防止因连接过多导致数据库崩溃。
自动回收空闲连接:连接池可以定期检查连接的状态,并回收空闲连接,确保资源的有效利用。


简化代码
减少代码复杂性:使用连接池后,不需要在每个数据库操作中手动管理连接的创建和关闭,简化了代码。
集中管理配置:数据库连接的相关配置可以在连接池中统一管理,便于维护和修改。


增强安全性:
支持连接验证:连接池可以定期验证连接的有效性,确保连接始终可用。
防止SQL注入:虽然连接池本身不直接防止SQL注入,但结合其他安全措施(如预编译语句)可以提高安全性。


支持多种数据库:
兼容性好:大多数连接池库都支持多种数据库,可以根据需要灵活切换数据库类型。


监控和调试:
提供监控工具:连接池通常提供监控功能,可以帮助开发者监控连接的使用情况,及时发现和解决问题。


日志记录:

连接池可以记录连接的使用日志,便于调试和性能分析。


降低服务器负载:
减少数据库服务器压力:通过复用连接,减少了对数据库服务器的频繁请求,降低了服务器的负载。
 

引用Druid 链接池的方法

①. 在pom.xml文件中引入依赖

<dependency><!-- Druid连接池依赖 --><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.19</version>
</dependency>

②. 在application.properties中引入数据库连接配置

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.druid.url=jdbc:mysql://localhost:3306/web
spring.datasource.druid.username=root
spring.datasource.druid.password=1234

运用Mybaits增删改查:

删除:

/*** 根据id删除*/
@Delete("delete from user where id = 5")
public void deleteById();
/*** 根据id删除*/
@Delete("delete from user where id = #{id}")
public void deleteById(Integer id);

注意:

MyBatis会在执行SQL时使用PreparedStatement,从而实现预编译 两种删除方式都使用了预编译

  在单元测试类中,增加如下测试方法.

DML语句执行完毕,是有返回值的,我们可以为Mapper接口方法定义返回值来接收,如下

/*** 根据id删除*/
@Delete("delete from user where id = #{id}")
public Integer deleteById(Integer id);

Integer类型的返回值,表示DML语句执行完毕影响的记录数。

面试题:

  • Mybatis的提供的符号,有两个,一个是 #{...},另一个是 ${...},区别如下:

项目开发中 使用 ${} 可能会产生 sql 注入的问题

新增:

  • Mapper接口:

/*** 添加用户*/
@Insert("insert into user(username,password,name,age) values(#{username},#{password},#{name},#{age})")
public void insert(User user);

注意id 为 自增属性 所以可以不用传参

修改:

  • Mapper接口方法:

/*** 根据id更新用户信息*/
@Update("update user set username = #{username},password = #{password},name = #{name},age = #{age} where id = #{id}")
public void update(User user);

在测试类中添加测试方法,代码如下:

@Test
public void testUpdate(){User user = new User();user.setId(6);user.setUsername("admin666");user.setPassword("123456");user.setName("管理员");user.setAge(30);userMapper.update(user);
}



查询:

/*** 根据用户名和密码查询用户信息*/
@Select("select * from user where username = #{username} and password = #{password}")
public User findByUsernameAndPassword(@Param("username") String username, @Param("password") String password);

注意: 如果使用 spring 官方 骨架 则不用@Param修饰也可以   只需要保证 参数名 和 #{ } 中的 名字相同即可

XML映射配置:

Mybatis的开发有两种方式:

  1. 注解

  2. XML

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

在Mybatis中使用XML映射文件方式开发,需要符合一定的规范:

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

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

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

创建XML需要 写 影协文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.mapper.EmpMapper"><!--查询操作--><select id="findAll" resultType="com.itheima.pojo.User">select * from user</select></mapper>


 

注意:resulyType 查询返回值类型:

<mapper namespace="com.itheima.dao.UserMapper"><select id="findByAge" resultType="com.itheima.pojo.User">select * from t_student where age &lt; #{age}</select><update id="updateUser2">update t_student set username=#{username},age=#{age},gender=#{gender},salary=#{salary} where id=#{id}</update>
</mapper>

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

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

相关文章

vscode python code runner执行乱码

打开vscode code runner插件配置&#xff0c;如图所示&#xff1a; 然后在setting.json修改运行python的默认命令&#xff1a; 将原来 替换成 "python":"set PYTHONIOENCODINGutf8 && python", 参考&#xff1a;Vscode——python环境输出中文乱…

在VMware虚拟机上安装Kali Linux的详细教程(保姆级教程)

在VMware虚拟机上安装Kali Linux的详细教程 引言 Kali Linux是一个基于Debian的Linux发行版&#xff0c;专为渗透测试和安全审计而设计。它内置了数百种安全工具&#xff0c;广泛应用于网络安全领域。通过在VMware虚拟机上安装Kali Linux&#xff0c;您可以在不影响主操作系统…

分布式调用 - 服务间的远程调用RPC

文章目录 导图PreRPC 概述RPC 调用过程RPC 动态代理1. 接口定义 (SeverProvider)2. 实现类 (ServerProviderImpl)3. 动态代理类 (DynamicProxy)4. 客户端 (Client)5. 代码工作流程6. 总结和注意点7. 结果输出8. 小结 RPC 序列化1. JSON (JavaScript Object Notation)2. Hessian…

Qt关于padding设置不起作用的的解决办法

观察以下的代码&#xff1a; MyWidget::MyWidget(QWidget *parent): QWidget{parent},m_btn(new QToolButton(this)) {this->setFixedSize(500,500);m_btn->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);m_btn->setIcon(QIcon("F:tabIcon/person-white.s…

监控视频汇聚平台:Liveweb视频监控管理平台方案详细介绍

Liveweb国标视频综合管理平台是一款以视频为核心的智慧物联应用平台。它基于分布式、负载均衡等流媒体技术进行开发&#xff0c;提供广泛兼容、安全可靠、开放共享的视频综合服务。该平台具备多种功能&#xff0c;包括视频直播、录像、回放、检索、云存储、告警上报、语音对讲、…

网关整合sentinel无法读取nacos配置问题分析

sentinel无法读取nacos配置问题分析 1.spring-cloud-gateway整合sentinel2.问题现象3.原因猜测4.源码分析4. 结语 最近公司需要上线一个集约项目&#xff0c;虽然为内网项目&#xff0c;但曾经有过内网被攻破&#xff0c;导致内部系统被攻击的案例&#xff0c;且集约系统同时在…

使用ECharts创建带百分比标注的环形图

在数据可视化领域&#xff0c;环形图是一种非常有效的图表类型&#xff0c;它能够清晰地展示各部分与整体的关系。今天&#xff0c;我们将通过ECharts来创建一个带百分比标注的环形图&#xff0c;并详细解释如何实现这一效果。 1. 数据准备 首先&#xff0c;我们定义了一些基础…

AIGC训练效率与模型优化的深入探讨

文章目录 1.AIGC概述2.AIGC模型训练效率的重要性3.模型优化的概念与目标4.模型优化策略4.1 学习率调节4.2 模型架构选择4.3 数据预处理与增强4.4 正则化技术4.5 量化与剪枝 5.代码示例6.结论 人工智能领域的发展&#xff0c;人工智能生成内容&#xff08; AIGC&#xff09;越来…

keil 5. Flash Timeout. Reset the Target and try it again.

使用官方STM32 ST-LINK Utility 烧写软件 KEIL 5, 设置DFP 包支持FLASH烧写算法 Keil 5, Flash Timeout. Reset the Target and try it again.-CSDN博客

Vim操作

1. Vim的模式 2.正常模式->编辑模式 在上⽅插⼊⼀⾏&#xff1a; O在下⽅插⼊⼀⾏&#xff1a; o (open)在当前光标前插⼊&#xff1a; i在⾏⾸插⼊&#xff1a; I在当前光标后插⼊&#xff1a; a在⾏尾插⼊&#xff1a; A 3.常见命令行 1、拷贝当前行 yy ,拷贝当前行向下…

SAP Native SQL 的简单说明

Open SQL访问数据字典中声明的数据库表&#xff0c;不区分数据库类型&#xff0c;执行时会自动转换为对应的语句&#xff0c;且可以使用本地缓存。Native SQL使用特定于数据库的SQL语句,但是可以访问比Open SQL 更多的表&#xff0c;更多的操作&#xff0c;缺点也很明显&#x…

【娱乐项目】竖式算术器

Demo介绍 一个加减法随机数生成器&#xff0c;它能够生成随机的加减法题目&#xff0c;并且支持用户输入答案。系统会根据用户输入的答案判断是否正确&#xff0c;统计正确和错误的次数&#xff0c;并显示历史记录和错题记录。该工具适合用于数学练习&#xff0c;尤其适合练习基…

【深度学习】各种卷积—卷积、反卷积、空洞卷积、可分离卷积、分组卷积

在全连接神经网络中&#xff0c;每个神经元都和上一层的所有神经元彼此连接&#xff0c;这会导致网络的参数量非常大&#xff0c;难以实现复杂数据的处理。为了改善这种情况&#xff0c;卷积神经网络应运而生。 一、卷积 在信号处理中&#xff0c;卷积被定义为一个函数经过翻转…

智能化图书馆导航系统方案之系统架构与核心功能设计

hello~这里是维小帮&#xff0c;点击文章最下方获取图书馆导航系统解决方案&#xff01;如有项目需求和技术交流欢迎大家私聊我们~撒花&#xff01; 针对传统图书馆在图书查找困难、座位紧张、空间导航不便方面的问题&#xff0c;本文深入剖析了基于高精度定位、3D建模、图书搜…

K8s内存溢出问题剖析:排查与解决方案

文章目录 一、背景二、排查方案&#xff1a;1. 可能是数据量超出了限制的大小&#xff0c;检查数据目录大小2. 查看是否是内存溢出2.1 排查数据量&#xff08;查看数据目录大小是否超过limit限制&#xff09;2.2 查看pod详情发现问题 三、解决过程 一、背景 做redis压测过程中…

ospf协议(动态路由协议)

ospf基本概念 定义 OSPF 是典型的链路状态路由协议&#xff0c;是目前业内使用非常广泛的 IGP 协议之一。 目前针对 IPv4 协议使用的是 OSPF Version 2 &#xff08; RFC2328 &#xff09;&#xff1b;针对 IPv6 协议使用 OSPF Version 3 &#xff08; RFC2740 &#xff09;。…

基于云模型和遗传算法的建设工程风险决策多目标优化研究

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 基于云模型和遗传算法的建设工程风险决策多目标优化研究 基于云模型和遗传算法的建设工程风险决策多目标优化研究涉及在建设工程领域中运用云模型和遗传算法来优化风险决策的多个目标。云模型是一种将模糊理论与概率…

【C语言】连接陷阱探秘(5):头文件

目录 一、头文件的作用 1.1. 声明共享 1.2. 模块化 1.3. 实践中的注意事项 二、常见的头文件陷阱 2.1 重复包含(Include Guards) 2.1.1. Include Guard 工作原理 2.1.2. Pragma Once(某些编译器支持) 2.2 循环依赖(Circular Dependencies) 2.2.1. 前向声明 2.…

C++:异常

---什么是异常&#xff1f; 异常是面向对象语法处理错误的一种方式。 ---C语言传统的处理错误的方式有哪些呢&#xff1f; 1.返回错误码&#xff0c;有些API接口都是把错误码放到errno中。 2.终止程序&#xff0c;比如发生越界等严重问题时&#xff0c;我们也可以主动调用exit…

2023年MathorCup高校数学建模挑战赛—大数据竞赛B题电商零售商家需求预测及库存优化问题求解全过程文档及程序

2023年MathorCup高校数学建模挑战赛—大数据竞赛 B题 电商零售商家需求预测及库存优化问题 原题再现&#xff1a; 电商平台存在着上千个商家&#xff0c;他们会将商品货物放在电商配套的仓库&#xff0c;电商平台会对这些货物进行统一管理。通过科学的管理手段和智能决策&…