JDBC

本文详细介绍JDBC的基本概念、配置及使用方法,包括连接数据库、执行SQL语句等常见操作,并对比Statement与PreparedStatement的区别,还提供了批处理、结果集处理、分页显示等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JDBC简介

JDBC(Java Database Connectivity)是标准Java访问数据库API,在java.sql下。

必须把mysql-connector-java-5.1.7-bin.jar导入到tomcatlib目录下面!

java项目中,只需要引入mysql-connector-java-5.1.7-bin.jar就可以运行java项目。

web项目中,当Class.forName("om.mysql.jdbc.Driver");myeclipse是不会去查找字符串,不会去查找驱动的。所以只需要把mysql-connector-java-5.1.7-bin.jar拷贝到tomcatlib目录就可以了。

Java使用JDBC访问数据库简单的例子

访问JDBC访问数据库一般步骤:注册驱动,获取连接,获取Statement,执行SQL返回结果集,遍历结果集,释放连接。

importjava.sql.DriverManager;
import
java.sql.ResultSet;
//importjava.sql.SQLException;
import java.sql.Connection;
import
java.sql.Statement;
public class
DUBtil {
  
private staticfinal String URL = "jdbc:mysql://localhost:3306/databaseWeb";
   private static final
String USER = "root";
   private static final
String PASSWORD = "0000";
   public static void
main(String[] args) throws Exception {
     
// 1.加载驱动程序
     
Class.forName("com.mysql.jdbc.Driver");
     
// 2.获得数据库连接
     
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
     
// 3.通过数据库连接操作数据库,增删改查
     
Statement stmt =conn.createStatement();
     
ResultSet rs =stmt.executeQuery("select * fromtb_person");
      while
(rs.next()) {
         System.
out.println(rs.getString("id") + rs.getString("name"));
     
}
   }
}

注册数据库驱动

三种方法:

DriverManager.registerDriver(new com.mysql.jdbc.Driver());
new com.mysql.jdbc.Driver();
Class.forName("com.mysql.jdbc.Driver");

JDBC基本操作:CRUD

CRUD:create、read、update、delete

executeQuery(String sql)用于执行SELECT语句,返回

executeUpdate(String sql)用于执行INSERT、UPDATE、DELETE。

流程与上面的例子类似。

注意是取 request 参数而不是地址栏参数,因此用 getAttribute 方法而不是 getParameter

Statement和PreparedStatement

使用Statement是最简单的方式,使用SQL语言然后执行executeQuery或executeUpdate。

PreparedStatement接口继承Statement接口,是Statement子类。最大区别是PreparedStatement可以使用参数。

如:

Statement

Statement stmt = new Statement();//不需要传参

String updateString = "UPDATE COFFEES SET SALES = 75 " + "WHERECOF_NAME LIKE ′Colombian′"

stmt.executeUpdate(updateString);

PreparedStatement:

PreparedStatement preStmt = con.prepareStatement("UPDATE COFFEES SETSALES = ? WHERE COF_NAME LIKE ? ");//需要以SQL语句为参数传入

preStmt.setInt(175);// 占位符编号从1开始

preStmt.setString(2"Colombian");

preStmt.executeUpdate();

批处理

批处理需要将connection自动提交设置为false

即:conn.setAutoCommit(false);

Statement执行批量SQL语句使用stmt.addBatch(String sql);//不同的sql语句

PreparedStatement执行批量SQL语句使用preStmt.addBatch();//同一条带参数的语句,preStmt已经set过参数。

步骤:

pstmt.addBatch()加入缓存

pstmt.executeBatch()提交

conn.commit()提交给数据库执行

preStmt.clearBatch();若存在重复提交情况可以清空缓存

批处理提交栗子:

    public static void test() throws ClassNotFoundException, SQLException, IOException {
        // 1.加载驱动程序
        Class.forName("com.mysql.jdbc.Driver");
        // 2.获得数据库连接
        String mysql_url = "jdbc:mysql://localhost:3306/students?characterEncoding=utf-8";
        Connection conn = DriverManager.getConnection(mysql_url,"root", "root");

        Statement stmt =conn.createStatement();
        ResultSet rs =stmt.executeQuery("select _id,sname from students");
        conn.setAutoCommit(false);//设置自动提交为false
        int _id;
        int i=0,j=1;
        String str="some strs";
        PreparedStatement preStmt = conn.prepareStatement
                ("UPDATE pageinfo SET copyright_code = ? WHERE _id = ? ");
        while (rs.next()) {
            _id=rs.getInt("_id");
            preStmt.setString(1,str);//根据id更新该字段
            preStmt.setInt(2,_id);
//            preStmt.executeUpdate();//一条条的提交特别慢
            preStmt.addBatch();
            if(((++i)%1000)==0){//1000条提交一次,根据实际情况而定
                int[] a =preStmt.executeBatch();//记录批量提交每次影响的行数,这里每次只影响一行
                conn.commit();//提交给数据库处理
                preStmt.clearBatch();//清空缓存
                System.out.println(""+j+"次提交"+a.length);//测试输出看看是否提交了那么多
                i=0;j++;
            }
        }
        int[] a =preStmt.executeBatch();
        conn.commit();//将最后不满足1000的尾子提交
        preStmt.clearBatch();
        System.out.println(""+j+"次提交"+a.length);
    }

Statement和PrepareStatement区别:PrepareStatement能预处理,同时能防止SQL注入。

处理结果集

进行两次查询不必rs.close(),因为返回ResultSet时会自动关闭上一次查询的结果集。

Statement默认返回的ResultSet只可往后滚动,因此只有next()、last()方法可用,若想使用previous()、first(),需要

Statement stmt = conn.createStatement(

ResultSet.TYPE_SCROLL_INSENSITIVE,

ResultSet.CONCUR_UPDATABLE);

Pagination分页显示

MySQL分页是利用LIMIT实现,如:

SELECT * FROM tb_person LIMIT 21,10//只取出从第21行开始的10行记录

分页显示时需要先查询记录总数,如SELECT count(*) FROM tb_person

不同数据库采用不同的方式实现分页,语法不同。

ResultSetMetaData元数据

rs.getString(“name”)来获取name列内容。

ResultSet对象的列名可由ResultSetMetaData元数据获得

DAO模式

DAO(Database Access Object)数据库操作对象,保存数据时它将JavaBean属性拆分成正确的SQL语句保存到数据库中,读取数据时将数据库中数据通过setter方法设置到JavaBean中。

DAO的出现使数据库代码和业务代码分离,Servlet或JSP只操作JavaBean与DAO层,DAO层只操作数据库。

抛出异常自动回滚

conn.setAutoCommit(false);//将自动提交设置为False,默认true

再执行多条SQL语句执行完毕,确认没有发生错误,在执行

conn.commit()提交,如果有异常抛出或者返回值不对,执行

conn.rollback()回滚。

 

事务的提交必须执行conn.commit(),事务的回滚不一定要显示的执行conn.rollback(),如果程序直接抛出异常,事务也会回滚。

事务性是数据库区分与其他存储技术的重要特征之一,基本上所有的数据库编程都会涉及事务编程。

连接池

减少创建与断开Connection开销,要操作数据库,程序并不是直接创建Connection,而是向连接池申请。

。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值