JDBC详细知识点和操作

javaweb的作用,属于中间者,负责逻辑处理

这三部分互相协作组成了网页

javaweb也就是这三部分

一.数据库部分(略)

二.javaweb程序

1.JDBC

概念:通过java代码操作数据库

数据库种类有很多,比如Oracle,Mysql,DB2,我们一套代码需要和不同的数据库语言沟通所以就要引入不同的jar包。

(1).DriverManager作用:
1.注册驱动

Class.forName("com.mysql.jdbc.Driver");

按住ctrl+鼠标就可以进入Driver的api文档(前提是得有jar包),查看源码

然后这里面有一个静态代码块,里面有DriverManeger,所以就是用Class.forName("com.mysql.jdbc.Driver")为啥可以用到DriverManager注册驱动的原因。

注意:

jar包5.0以上就可以省略这一句,不用写了

疑问:咋弄

2.获取数据库连接
String url="jdbc:mysql://127.0.0.1:3306/db1?user"; 简写后:jdbc:mysql:///db1
String username=“root”;
String password=“root”;
static Connection=getConnection(String url,String user,String password);

注意:

*url的语法:jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2...

eg: jdbc:mysql://127.0.0.1:3306/db1

*如果连接的是本机mysql并且服务器默认端口号是3306,可以简写为 jdbc:mysql:///db1

*配置useSSL=false参数,禁用安全连接方式,不然有那么长一段字母警告,很烦,并且也可以提高性能

(2)Connecttion作用(数据库连接对象):
1.获取执行SQL的对象

1)普通执行SQL对象:

Statement=createStatement();

2)预编译SQL的执行SQL对象:防止SQL注入

preparedStatement=prepareStatement(sql);

3)执行存储过程的对象:不常用

CallableStatement prepareCall(sql)

2.管理事务
开启事务:BEGIN;/START TRANSACTION;
提交事务:COMMIT;
回滚事务:ROLLBACK;
开启事务:setAutoCommit(false/true);true为自动提交事务;false为手动提交事务,即为开启事务
提交事务:commit();
回滚事务:rollback();

Java代码中事务处理的方式就是异常处理机制

用try cash。。。。,在cash里进行事务的回滚

(3)Statement

作用:执行SQL语句

DDL对表和库的增删改查

DML对数据的增删改

DQL对数据的查询工作

excuteUpdate:执行DML/DDL

返回值:1.影响行数2.DDL语句执行后,直行程也可能返回0

挫折:@test报错

JDBC:

这是jdbc连接数据库不可缺少的步骤

 Class.forName("com.mysql.jdbc.Driver");//抛大异常,注册驱动//获取连接String url="jdbc:mysql://127.0.0.1:3306/smbms";String username="root";String password="root";Connection conn = DriverManager.getConnection(url, username, password);//定义sql语句String sql="UPDATE smbms_user set gender=1 WHERE id=1";//获取执行sql的对象Statement stmt = conn.createStatement();//执行sql,返回值3影响行数int count = stmt.executeUpdate(sql);
DriverManager:

1.注册驱动

注册驱动虽然用的是这个代码

 Class.forName("com.mysql.jdbc.Driver");//抛大异常,注册驱动

但是底层,我们点开可以看到这个Driver类源码里面有一个静态代码块是用的DriverManager.registerDriver

所以这个注册驱动实际上是用的DriverManager

public class Driver extends NonRegisteringDriver implements java.sql.Driver {public Driver() throws SQLException {}static {try {DriverManager.registerDriver(new Driver());} catch (SQLException var1) {throw new RuntimeException("Can't register driver!");}    }}

2.获取数据库连接

DriverManager返回一个conn连接对象

Connection conn = DriverManager.getConnection(url, username, password);

在这三个参数中url要说一下

String url="jdbc:mysql://127.0.0.1:3306/smbms";

1.如果连接的是本机mysql服务器,并且mysql服务器默认端口是3306,

url可以简写为jdbc:mysql:///smbms

2.配置useSSL=false参数,是禁用安全连接方式,解决警告提示

jdbc:mysql:///smbms?useSSL=false

Connection:

1.获取执行sql的对象

.普通执行sql对象:

Statement createStatement( );
例如:
Statement statement = conn.createStatement();

.预编译sql的执行sql对象:防止sql注入:

PreparedStatement prepareStatement(sql);

2.管理事务

//为ture时自动提交事务,为false手动映射,即为开启事务

开启事务:setAutoCommit(boolean autoCommit)

提交事务:commit();

回滚事务:rollback();

这是一个例子:通过try catch进行事务管理

我们在这里面添加了一个int i=3/0;制造异常

有事务的管理,代码如果遇到错误会回滚

如果关掉事务管理,代码会执行一半,然后报错,只会执行sql1

        String sql1="UPDATE smbms_user set gender=2 WHERE id=1";String sql2="UPDATE smbms_user set gender=2 WHERE id=2";Statement stmt = conn.createStatement();try {conn.setAutoCommit(false);//开启事务int count1 = stmt.executeUpdate(sql1);System.out.println(count1);//制造异常int i=3/0;int count2 = stmt.executeUpdate(sql2);System.out.println(count2);//提交事务conn.commit();} catch (Exception e) {//回滚事务conn.rollback();e.printStackTrace();}

Statement:执行SQL语句

方法一: int stmt.executeUpdate(sql对象);

int count1 = stmt.executeUpdate(sql);

返回值:

DML会返回数字,更改了几行返回几可以通过这个来判断执行成功与否,

DDL会返回0比如DROP删除数据库操作

DDL:主要使用CREATE、DROP、ALTER等命令,用于定义和管理数据库的各种对象

DML:DML使用INSERT、UPDATE、DELETE等命令,用于对数据表中的数据进行增查改删的操作

方法二:

ResultSet executeQuery(sql):执行DQL语句

返回值:ResultSet结果集对象

这个会用到ResultSet,我们接下来讲

ResultSet:封装表的查询结果

查询Account表,封装为Account对象,存储到ArrayList集合中

每一行的数据封装为一个对象,这些对象存在ArrayList中,

最后页面展示就把这些对象放出来这就是表查询到页面展示的一个过程

方法一:

封装了表查询的结果

ResultSet rs=stmt.executeQuery(sql); //执行DQL语句,返回ResultSet对象

获取查询结果:

Class.forName("com.mysql.jdbc.Driver");                 //抛大异常,注册驱动String url="jdbc:mysql://127.0.0.1:3306/smbms";String username="root";String password="root";                         //获取连接对象Connection conn = DriverManager.getConnection(url, username, password);                                                   String sql="select * from account";             //定义sql语句,DQL查询语句                                            Statement stmt = conn.createStatement();         //获取statament对象,执行sql                                                     ResultSet rs=stmt.executeQuery(sql);           //statement执行sql语句List<Account> list=new ArrayList<>();
//处理结果,遍历rs中的所有数据rs.next()光标移动到下一行,并且半段当前行是否有数据while(rs.next()){Account account=new Account();int id = rs.getInt(1);                    //get获取数据String name=rs.getString(2);String money=rs.getString(3);          account.setId(id);                      //把数据放到account对象里account.setName(name);account.setMoney(money);list.add(account);               }System.out.println(list);//释放资源rs.close();stmt.close();conn.close();

boolean next():

将光标从当前位置向下移动一行,并且判断当前行是否为有效行(有没有数据)

返回值:

ture有效行 ,当前行有数据

false无效行,当前行有数据

xx getXxx

eg:int id = rs.getInt(1); String name=rs.getString(2);

参数:

int列的编号,从1开始

String:列的名称

PreparedStatement:预编译sql语句并执行,预防SQL注入问题

preparedstatement会帮我们把字符转义,解决了sql注入的问题

1.获取preparedstatement对象

之前是执行的时候就传入sql语句ResultSet rs = stmt.executeQuery(sql);

现在是获取对象的时候就传入sql语句PreparedStatement pstmt = conn.prepareStatement(sql);

//SQL语句中的参数值,使用?占位符代替
String sql="select * from user where username=?and password=?";
//通过connection对象,并传入对应的sql语句
PreparedStatement pstmt = conn.prepareStatement(sql);

2.设置参数值

Preparedstatement对象:setXxx(参数1,参数2):给?赋值
Xxx:数据类型;如setInt(参数1,参数2)
参数:参数1:?的位置编号,从1开始,1表示第一个sql语句中参数参数2:第二个参数
例如:
pstmt.setString(1,name);
pstmt.setString(2,pwd);

3.执行SQL:

在这一步和statement不一样,statement在这一步需要传值,而preparestatement不需要传值,它在创建pstmt对象的时候已经传过值了

  ResultSet rs = pstmt.executeQuery();ResultSet rs =  pstmt.executeUpdate();

PrepareStatement原理:

1.在获取PreparedStatement对象时,将sql语句发送给mysql服务器进行检查,编译(这些很耗时)

2.执行时就不用再进行这些步骤了,速度更快

3.如果sql模板一样,则只需要进行一次检查、编译,从而节约时间

PreparedStatement好处:

1.预编译SQL,性能更高

2.防止SQL注入:将敏感字符进行转义

预编译功能开启,在url的后面加上&useServerPrepStmts=true

配置MYSQL执行日志:(重启mysql服务后生效)这个地方我没听懂

Druid数据库连接池:

学了这个以后直接用这个代替之前学的Class.forname()啥啥的,直接用数据库连接池连,复制下面四行代码就可以

在这里我打代码遇到了问题,绝对路径和相对路径都不行,后来我又重新创了一个路径中没有中文的就运行成功了,感觉可能是有中文导致的路径问题

 //1.导入jar包//2.定义配置文件//3.加载配置文件Properties prop=new Properties();
//        demodruid.class.getResourceAsStream("/druid.properties");prop.load(new FileInputStream("src/druid.properties"));// 4.获取连接池对象DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);//5.获取数据库连接Connection connection = dataSource.getConnection();

是一个很好用的小技巧,可以打印出当前的路径,在文件中的的再加入剩下的路径就行了,可以很好的判断是否要加项目名

System.out.println(System.getProperty("user.dir"));

JDBC练习:
准备:

表,实体类,测试用例

表中有很多字段,一一写会浪费时间

增删改查:

连接数据库只有三步有变化:

定义SQL

设置参数

处理结果

查询:

+编写sql语句:String sql="select * from brand";

+是否需要参数:不需要

+处理结果:List<Brand>

获取数据和封装brand对象是个体力活

        Properties prop=new Properties();
//        demodruid.class.getResourceAsStream("/druid.properties");prop.load(new FileInputStream("src/druid.properties"));// 4.获取连接池对象DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);//5.获取数据库连接Connection conn = dataSource.getConnection();//定义sqlString sql="select * from brand";//传sql,并且返回pstmt对象PreparedStatement pstmt = conn.prepareStatement(sql);//设置参数,这个sql没有参数//执行sql,返回结果集ResultSet rs = pstmt.executeQuery();//处理结果List<Brand>封装Brand对象,装载List集合Brand brand=null;List<Brand> brands=new ArrayList<>();while(rs.next()){//获取数据 体力活int id = rs.getInt("id");//可以写列的数字也可以写列名String brandName = rs.getString("brand_name");String companyName = rs.getString("company_name");int ordered = rs.getInt("orderer");String description = rs.getString("description");int status = rs.getInt("status");//封装Brand对象brand=new Brand();brand.setId(id);brand.setBrandName(brandName);brand.setCompanyName(companyName);brand.setOrderer(ordered);brand.setDescription(description);brand.setStatus(status);//装载到集合brands.add(brand);}System.out.println(brands);//释放资源rs.next();conn.close();pstmt.close();

添加:

编写SQL语句:

是否需要参数?需要除了id之外的所有参数

返回结果如何封装?boolean

        //模拟接收页面提交的参数String brandName="娃哈哈";String companyName="娃哈哈";int orderer=1;String description="好喝好喝极了";int status=1;Properties prop=new Properties();prop.load(new FileInputStream("src/druid.properties"));// 4.获取连接池对象DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);//5.获取数据库连接Connection conn = dataSource.getConnection();//定义sqlString sql="insert into brand(brand_name,company_name,orderer,description,status)values(?,?,?,?,?)";//传sql,并且返回pstmt对象PreparedStatement pstmt = conn.prepareStatement(sql);//设置参数pstmt.setString(1,brandName);pstmt.setString(2,companyName);pstmt.setInt(3,orderer);pstmt.setString(4,description);pstmt.setInt(5,status);//执行sqlint count = pstmt.executeUpdate();//影响行数//处理结果System.out.println(count>0);//释放资源
//        rs.next();无conn.close();pstmt.close();

修改(根据id修改):
  • sql语句:update brand set brand_name=?
  • 参数:Brand所有数据
  • 返回封装:boolean
//接收页面提交的参数String   brandName="笨笨狗";String companyName="笨笨狗";int orderer=1000;String description="好喝好喝极了";int status=1;int id=2;Properties prop=new Properties();
//        demodruid.class.getResourceAsStream("/druid.properties");prop.load(new FileInputStream("src/druid.properties"));// 4.获取连接池对象DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);//5.获取数据库连接Connection conn = dataSource.getConnection();//定义sqlString sql="update brand set brand_name=?,company_name=?,orderer=?,description=?,status=? where id=?";//传sql,并且返回pstmt对象PreparedStatement pstmt = conn.prepareStatement(sql);//设置参数pstmt.setString(1,brandName);pstmt.setString(2,companyName);pstmt.setInt(3,orderer);pstmt.setString(4,description);pstmt.setInt(5,status);pstmt.setInt(6,id);//执行sqlint count = pstmt.executeUpdate();//影响行数//处理结果System.out.println(count>0);//释放资源
//        rs.next();无conn.close();pstmt.close();

删除(根据id删除):
  • 删除
  • 编写sql语句:delete from brand where id=?
  • 是否需要参数:需要id
  • 返回结果如何封装:boolean
//模拟页面传参
int id=2;//获取connction对象Properties prop=new Properties();//加载配置文件prop.load(new FileInputStream("src/druid.properties"));//获取连接池对象DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);//获取数据库连接Connection conn=dataSource.getConnection();String sql="delete from brand where id=?";//获取pstmt对象,在获取对象的时候就已经传入sqlPreparedStatement pstmt = conn.prepareStatement(sql);pstmt.setInt(1,id);//执行sqlint count = pstmt.executeUpdate();System.out.println(count>0);pstmt.close();conn.close();

Maven:

只要点击这个,maven坐标就会自动更新,不用再点刷新键

按alt+insert就可以自动生成坐标

scope作用范围:

runtime:测试运行时有效,主工程无效

 

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

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

相关文章

C高级编程 第十六天(树 二叉树)

1.树 1.1结构特点 非线性结构&#xff0c;有一个直接前驱&#xff0c;但可能有多个直接后继有递归性&#xff0c;树中还有树可以为空&#xff0c;即节点个数为零 1.2相关术语 根&#xff1a;即根结点&#xff0c;没有前驱叶子&#xff1a;即终端结点&#xff0c;没有后继森…

6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)

目录 一.堆(Heap)的基本介绍 二.堆的常用操作&#xff08;以小根堆为例&#xff09; 三.实现代码 3.1 堆结构定义 3.2 向下调整算法* 3.3 初始化堆* 3.4 销毁堆 3.4 向上调整算法* 3.5 插入数据 3.6 删除数据 3.7 返回堆顶数据 四.下篇内容 1.堆排序 2.TopK问题 一…

LeetCode第414场周赛(第一题)

目录 一&#xff1a;题目&#xff1a;3280. 将日期转换为二进制表示 一&#xff1a;题目&#xff1a;3280. 将日期转换为二进制表示 给你一个字符串 date&#xff0c;它的格式为 yyyy-mm-dd&#xff0c;表示一个公历日期。 date 可以重写为二进制表示&#xff0c;只需要将年…

一款免费开源功能丰富的看图软件NeeView

NeeView 是一款功能丰富的图像查看软件&#xff0c;它以其独特的浏览体验和广泛的支持格式受到用户的欢迎。NeeView 不仅可以浏览普通的图像文件&#xff0c;还能够查看压缩包内的图片、预览PDF文档甚至播放视频文件。 NeeView 的主要特点&#xff1a; 多格式支持&#xff1a…

高频知识总结 | 算法题如何刷?我的高效刷题方法

1. 前言 所以本文章主要就是详细的告诉大家我的刷题方法论&#xff0c;可以做一个参考&#xff0c;如果你觉得我的分享对你有帮助&#xff0c;希望多多点赞收藏评论转发支持&#xff01; 2. 算法题到底该怎么刷&#xff1f; 回答这个问题只需要两个点&#xff1a;一是刷什么…

JavaWeb笔记整理13——Mybatis

目录 Mybatis介绍 删除 预编译SQL SQL注入 新增 更新 查询 数据封装 条件查询 XML映射文件 动态SQL 更新案例 foreach Mybatis介绍 删除 预编译SQL SQL注入 新增 更新 查询 数据封装 条件查询 XML映射文件 动态SQL <if> 更新案例<set> foreach &l…

AIGC简化文件管理:Python自动重命名Word和PDF文件

1.背景 大家应该也有遇到&#xff0c;自己电脑有很多文件命名不合理的文件&#xff0c;比如&#xff1a;文件1、想法3 &#xff0c;当你长时间再看到这个文件的时候&#xff0c;已经很难知道文件内容。 今天我们将借助AIGC的编码能力&#xff0c;帮我们生成一个批量改文件名的…

Linux内核编程(十五)网络设备驱动

本文目录 一、常见的网络协议二、网络模型二、网络数据的封装和解封装二、抓包工具wireshark三、传输介质四、RJ-45接口1. 百兆网口2. 千兆网口 五、PHY芯片1. 网络变压器的作用2. PHY芯片类型判断 六、MAC控制器七、MAC控制器与PHY芯片连接方式1. MII接口方式&#xff08;百兆…

CSS学习13--学成网例子

CSS例子 学成网 需要使用的图片&#xff1a; 代码&#xff1a; <html><head><style>/*CSS初始化*/* { /*清除内外边框*/padding: 0;margin: 0;}ul {list-style: none; /*清除列表样式*/}.clearfix:before,.clearfix:after { /*清除浮动*/content: &qu…

【Java毕业设计】基于SpringBoot+Vue+uniapp的农产品商城系统

文章目录 一、系统架构1、后端&#xff1a;SpringBoot、Mybatis2、前端&#xff1a;Vue、ElementUI4、小程序&#xff1a;uniapp3、数据库&#xff1a;MySQL 二、系统功能三、系统展示1、小程序2、后台管理系统 一、系统架构 1、后端&#xff1a;SpringBoot、Mybatis 2、前端…

计算机毕业设计SpringBoot+VUE自动灌装生产线 MES 系统设计

采用 B/S 架构&#xff0c;MES 应用软件通过 TCP/IP 协议与自动灌装生产线上的各个工作单元中的 PLC 控制器进行通信&#xff0c;查询或采集由 PLC 控制器采集的生产数据。通过 JAVA 构建的平台与数据库进行连接&#xff0c;实现灌装生产线的生产管理、订单管理、质量管理和数据…

问题: java.sql.SQLException:The server time zone value ‘�й���׼ʱ��‘

原文: Mybatis PlusThe server time zone valuehis unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to uti…

深入理解数据库的 4NF:多值依赖与消除数据异常

在数据库设计中&#xff0c; "范式" 是一个常常被提到的重要概念。许多初学者在学习数据库设计时&#xff0c;经常听到第一范式&#xff08;1NF&#xff09;、第二范式&#xff08;2NF&#xff09;、第三范式&#xff08;3NF&#xff09;以及 BCNF&#xff08;Boyce-…

C++操作符重载实例(独立函数)

C操作符重载实例&#xff0c;我们把坐标值CVector的加法进行重载&#xff0c;计算c3c1c2时&#xff0c;也就是计算x3x1x2&#xff0c;y3y1y2&#xff0c;今天我们以独立函数的方式重载操作符&#xff08;加号&#xff09;&#xff0c;以下是C代码&#xff1a; c1802.cpp源代码…

c++进阶——哈希表

嗨喽大家好呀&#xff0c;今天阿鑫给大家带来的是c进阶——哈希表&#xff0c;好久不见啦&#xff0c;下面让我们进入本节博客的内容吧&#xff01; c进阶——哈希表 枚举的介绍unordered系列的底层结构哈希表的改造 哈希是一种思想(映射)&#xff0c;哈希表(值和存储位置建立…

搭建Docker私有仓库管理本地的Docker镜像,通过harbor实现Web UI访问和管理私有仓库

要在本地搭建一个Docker私有仓库&#xff0c;你可以按照以下步骤进行设置&#xff1a; 安装Docker 确保你已经安装了Docker。如果还没有安装&#xff0c;可以按照官方指南进行安装&#xff1a; 对于Ubuntu系统&#xff0c;你可以运行以下命令来安装Docker&#xff1a; sudo ap…

十一、C语言:字符串函数

目录 一、strlen 二、strcpy 三、strcat 四、strcmp 五、strstr 六、strtok 七、strerror 一、strlen 注意&#xff1a;strlen()函数的返回值是size_t&#xff0c;两个size_t相减仍为无符号数 int main() {char arr[10] "abc";char brr[10] "abc123&quo…

OpenCV结构分析与形状描述符(11)椭圆拟合函数fitEllipse()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 围绕一组2D点拟合一个椭圆。 该函数计算出一个椭圆&#xff0c;该椭圆在最小二乘意义上最好地拟合一组2D点。它返回一个内切椭圆的旋转矩形。使…

【数据结构与算法 | 灵神题单 | 删除链表篇】力扣3217, 82, 237

总结&#xff0c;删除链表节点问题使用到列表&#xff0c;哈希表&#xff0c;递归比较容易超时&#xff0c;我觉得使用计数排序比较稳&#xff0c;处理起来也不是很难。 1. 力扣3217&#xff1a;从链表中移除在数组中的节点 1.1 题目&#xff1a; 给你一个整数数组 nums 和一…

【Linux】应用层http协议

一、HTTP协议 1.1 简要介绍一下HTTP 我们在网络的应用层中可以自己定义协议&#xff0c;但是&#xff0c;已经有大佬定义了一些现成的&#xff0c;非常好用的应用层协议&#xff0c;供我们直接使用&#xff0c;HTTP&#xff08;超文本传输协议&#xff09;就是其中之一。 在互…