JDBC(数据库连接)

news/2024/11/16 19:53:09/

MYSQL 数据库总结:

http://t.csdn.cn/Ka9Vm

JDBC是使用Java语言操作关系型数据库的一套API。

将mysql-connector-j-8.0.32jar复制粘贴到一个新建的目录里,然后右键mysql-connector-j-8.0.32jar,添加为库。

DriverManager

一个工厂类,我们通过它来创建数据库连接。

当JDBC的Driver类被加载进来时,它会自己注册到DriverManager类里面。

然后我们把数据库配置信息传成DriverManager.getConnection()方法,DriverManager会使用注册到它里面的驱动来获取数据库连接,并返回给调用的程序。

package com.ittht.JDBCDemo1;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;public class DriverManage {public static void main(String[] args) throws Exception {//1.注册驱动(可省)//Class.forName("lib.mysql.jdbc.Driver");//2.获得连接String url="jdbc:mysql:///test";String username="root";String word="****";Connection conn= DriverManager.getConnection(url,username,word);//3.定义sqlString sql="update jdbc set money=2000 where id=1";//4.获取执行SQL的对象Statement stmt=conn.createStatement();//5.执行SQL的对象int count=stmt.executeUpdate(sql);//6.处理结果System.out.println(count);//7.释放stmt.close();conn.close();}
}

Connection

  • 获取执行SQL对象
  • 管理事务

通过驱动管理器DriverManager的getConnection方法,可以创建到指定URL的连接

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

要记得 Connection 的关闭,数据库的连接是有限的,Connection在使用完毕后需要进行关闭。

如果要执行一个事务,例如银行转账,一方的金额减少,另一方金额增多,如果中途出现错误,就需要回滚:

可以使用异常处理机制:try...catch...

开启事务->提交事务->回滚事务

conn.setAutoCommit(false);

conn.commit();

conn.rollback();

在try语句中开启事务和提交事务,如果catch捕获到异常,就回滚。

package com.ittht.JDBCDemo1;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;public class Demo3Connection {public static void main(String[] args) throws Exception {//1.注册驱动(可省)//Class.forName("lib.mysql.jdbc.Driver");//2.获得连接String url="jdbc:mysql:///test";String username="root";String word="****";Connection conn= DriverManager.getConnection(url,username,word);//3.定义sqlString sql1 = "update jdbc set money=3000 where id=1";String sql2 = "update jdbc set money=3000 where id=2";//4.获取执行SQL的对象Statement stmt = conn.createStatement();try{//开启事务conn.setAutoCommit(false);//5.执行SQL的对象int count1 = stmt.executeUpdate(sql1);//6.处理结果System.out.println(count1);int i=1/0;//5.执行SQL的对象int count2 = stmt.executeUpdate(sql2);//6.处理结果System.out.println(count2);//提交事务conn.commit();}catch (Exception throwables){//回滚事务conn.rollback();throwables.printStackTrace();}//7.释放stmt.close();conn.close();}
}

ResultSet

更新方法:在可滚动的 ResultSet 对象中,可以向前和向后移动指针,将其置于绝对位置或相对于当前行的位置。

可以用来表示数据库查询结果的对象,封装检索出来的结果,并且只能通过其方法对数据进行访问和修改,不能直接对结果集进行修改。

首先是定义一个类,里面定义的用 private 修饰的变量,跟数据表表格的数据是一一对应的。

然后构造 setter和getter 方法,为了方便查询数据,可以重写一个 ToString 方法。

class jdbc{@Overridepublic String toString() {return "jdbc{" +"id='" + id + '\'' +", money=" + money +'}';}private String id;private int money;public String getId() {return id;}public void setId(String id) {this.id = id;}public int getMoney() {return money;}public void setMoney(int money) {this.money = money;}}

当生成 ResultSet 对象的 Statement 对象关闭、重新执行或用来从多个结果的序列检索下一个结果时,ResultSet 对象会自动关闭。

 @Testpublic void DemoResultSet() throws SQLException {String url="jdbc:mysql:///test";String username="root";String p="*****";Connection conn= DriverManager.getConnection(url,username,p);String sql="select * from jdbc";Statement stmt=conn.createStatement();ResultSet ir=stmt.executeQuery(sql);//创建集合List<jdbc> list=new ArrayList<>();while(ir.next()){String id=ir.getString("id");int money=ir.getInt("money");jdbc j=new jdbc();j.setId(id);j.setMoney(money);list.add(j);System.out.println(j);}ir.close();stmt.close();conn.close();}

PrepareStatement

预编译,性能更高,并且防止sql注入。

SQL注入

在请求的查询字符串中插入SQL命令,最终使服务器执行恶意命令。通过操作输入来修改SQL语句,用以达到执行代码。

        String name = "1233";String p= "' or '1'='1";String sql = "select * from account where name='" + name + "'and p='" + p+ "'";

这条 sql 输出得到:

select * from account where name='1233'and p='' or '1'='1'

是成立的,所以即使登录的账号和密码错误,也可以成功登录。

设置参数来修改:

        String sql="select * from account where name=? and p=?";//获取pstmt对象PreparedStatement pstmt=conn.prepareStatement(sql);//设置?的值pstmt.setString(1,name);pstmt.setString(2,p);//执行sql语句(不用传入sql)ResultSet rs=pstmt.executeQuery();System.out.println(sql);

将原来传入的语句用?替换,接着设置?的值。

注意:问号的位置是从1开始。

此时输出 sql 语句的得到的是:

select * from account where name=? and p=?

与前面不同的是,在获取 pstmt 对象时,就将 sql 语句传入,后面执行 sql 语句是,就不需要传入 sql了。

数据库连接

数据库连接池是一个容器,负责分配、管理数据库连接。

允许出现重复使用一个现有的数据库连接。

提升系统响应速度,避免数据库连接遗漏。

其中 Druid 是最好的数据库连接池之一。


http://www.ppmy.cn/news/44105.html

相关文章

如何使用基于GPT-4的Cursor编辑器提升开发效率

程序员最恨两件事情&#xff1a;一是别人代码不写文档&#xff0c;二是要让自己写文档。随着 GPT-4 的到来这些都不是问题了&#xff0c;顺带可能连程序员都解决了。。。 之前一直觉得 AI 生成的代码也就写个面试题的水平&#xff0c;小打小闹&#xff0c;现在时代可变了。Curs…

亚商投资顾问 早餐FM/0411中证金融下调证券公司保证金比例

01/亚商投资顾问 早间导读 1.中证金融下调证券公司保证金比例 2.工信部&#xff1a;各地要因地制宜制定工业绿色发展实施方案和重点任务清单 3.中国3月通胀数据将于今日上午发布 4.华为将介绍智能汽车解决方案 智驾辅助系统迎升级 02/亚商投资顾问 新闻早餐 // 热点聚焦 …

图的遍历及连通性

文章目录 图的遍历及连通性程序设计程序分析图的遍历及连通性 【问题描述】 根据输入的图的邻接矩阵A,判断此图的连通分量的个数。 【输入形式】 第一行为图的结点个数n,之后的n行为邻接矩阵的内容,每行n个数表示。其中A[i][j]=1表示两个结点邻接,而A[i][j]=0表示两个结点无…

春季儿童吃什么有助于长高,3款适合孩子长高的食谱做法,学起来

儿童身高一直以来都比较受到父母的关注&#xff0c;虽然身高不能说明一个人的能力有多强&#xff0c;但是会影响到人的外表。身高影响成败&#xff0c;一些专业对身高要求非常严格&#xff0c;因此大部分家长都希望孩子在身高方面能有一定的优势。 春季是孩子分泌生长激素增加时…

直播协议:RTSP、RTP、RTCP、RTMP、HLS

流媒体传输一般采用HTTP/TCP(RTCP)协议来传输控制信息&#xff0c;而用UDP(RTP)协议来传输实时媒体数据&#xff08;TCP开销相对较大&#xff0c;所以不太适合传输实时数据&#xff09;。 流媒体传输一般都是采用建立在UDP协议上的RTP/RTSP等实时传输协议。为何要在UDP而不在T…

一个基于Java线程池管理的开源框架Hippo4j实践

文章目录概述定义线程池痛点功能框架概览架构部署Docker安装二进制安装运行模式依赖配置中心接入流程个性化配置线程池监控无中间件依赖接入流程服务端配置三方框架线程池适配拒绝策略自定义概述 定义 Hippo4j 官网地址 https://hippo4j.cn/ 最新版本1.5.0 Hippo4j 官网文档地…

FTP-----局域网内部传输文件(1)

在日常工作中&#xff0c;如果需要跨设备的传输文件&#xff0c;您需要借助USB数据线或者借助应用实现无线互联&#xff0c;将所需文件传输到对应设备&#xff0c;这一来一去&#xff0c;花费的时间与精力变多了&#xff0c;那么&#xff0c;怎么实现不使用第三方软件来实现跨设…

dubbo

原文&#xff1a;dubbo入门教程-从零搭建dubbo服务 - 问北 - 博客园 (cnblogs.com) 一、dubbo的相关概念 dubbo是阿里的一个分布式服务开源框架&#xff0c;它的设计理念就是把一个大而全的项目模块化&#xff0c;每个模块都是一个独立的项目。 为什么要把大项目拆分成多个小…