JDBC详细知识点和操作

news/2024/10/4 7:13:16/

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.ppmy.cn/news/1524529.html

相关文章

爬虫3:re正则表达式获取数据

在上一章中&#xff0c;我们基本上掌握了抓取整个网页的基本技能.但是呢&#xff0c;大多数情况下&#xff0c;我们并不需要整个网页的内容,只是 需要那么一小部分&#xff0c;怎么办呢&#xff1f;这就涉及到了数据提取的问题. 本课程中&#xff0c;提供三种解析方式&#xff…

【2025】基于Python的空气质量综合分析系统的设计与实现(源码+文档+调试+答疑)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

Excel如何设置不能复制里面内容?学学工作表保护功能

大家好&#xff0c;这里是效率办公指南&#xff01; &#x1f4ca; 在这个信息爆炸的时代&#xff0c;数据安全变得尤为重要。Excel文件中的数据往往包含了敏感信息&#xff0c;如何确保这些数据不被未经授权的人复制&#xff0c;成为了我们日常工作中的一个挑战。今天&#x…

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运…

uniapp+vue3实现小程序和h5解压线上压缩包以及如何访问解压后的视频地址

安装jszip插件 npm install jszip 对应功能实现和逻辑处理&#xff1a; <script setup>import { onMounted, reactive, ref } from vueimport { onHide, onUnload } from dcloudio/uni-appimport JSZip from jsziplet videoSrc ref() // 视频地址// 创建JSZip实例con…

基于 PyTorch 和 TensorFlow 的口罩检测与人脸识别系统

在后疫情时代&#xff0c;口罩检测成为了人脸识别系统的一个重要功能。如何在戴口罩的情况下准确识别身份&#xff0c;是一个技术难点。本文将介绍如何利用 PyTorch 和 TensorFlow 实现一个包含口罩检测功能的简单人脸识别系统&#xff0c;结合了Facenet 模型用于特征提取&…

南卡OE PRO2开放式耳机发布,引领开放式音频技术新革命

NANK南卡品牌作为国内的音频大牌&#xff0c;在开放式耳机领域不断的探索尝试&#xff0c;此次新上线的南卡OE Pro2开放式耳机更是集合了南卡整个品牌的多项核心技术和多年心血&#xff0c;即将成为这个领域的尖端产品&#xff0c;这也是南卡开发出新蓝海的象征&#xff0c;预示…

香港科技大学工学2025/2026年度硕士研究生(MSc)项目招生宣讲会

&#x1f514;香港科技大学工学院2025/2026年度硕士研究生&#xff08;MSc&#xff09;项目招生宣讲会 &#x1f559;时间&#xff1a;2024年9月25日&#xff08;星期三&#xff09;19:00 &#x1f3e0;地点&#xff1a;华南理工大学五山校区33号楼403室 &#x1f386;2024Ti…