JDBC编程

本文详细介绍了JDBC作为Java代码与数据库之间的桥梁,如何通过加载驱动、连接数据库、执行SQL语句等步骤实现数据库操作。重点对比了Statement、PreparedStatement、CallableStatement接口及其在SQL执行、参数传递和安全性方面的区别,并提供了示例代码。此外,还阐述了事物编程的概念,包括设置自动提交状态及使用try-catch-finally块处理事物回滚。

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

jdbc的理解:
 所谓的jdbc简单的就是Java代码和数据库之间的一个桥梁,是Java公司制定的一个规范,各个数据库厂商实现的操作数据库的(规范就是借口,这里各个数据库厂商实现接口以便在
Java代码中操作数据库)。
使用jdbc的步骤:
 1)加载各个数据库的驱动对象(用于连接数据库的,以MySQL为例)Class.forName("com.mysql.jdbc.driver");这里加载了MySQL驱动的字节码文件,这里就会到驱动管理器里面注册
了一个驱动,在这个类的静态代码块中会注册一个驱动,所以只需要加载他的字节码文件就行。
 2)通过驱动管理器来连接数据库,返回的是一个Connection对象。Connection con = DriverManager.getConnection(url,user,password);这里的参数分别的表示连接数据的url,
数据库的用户名和用户密码,其中url的格式为jdbc:mysql://localhost:3306/test,首先采用的jdbc协议,MySQL子协议,然后是主机名和端口,test表示的连接的具体的数据库。和http
协议中的url是类似的,不过这里的协议不是http协议而已。
 3)通过连接来创建一个对象(Statement对象,用于操作静态的sql语句的)Statement statement = con.creatStatement();
 4)通过statement对象来执行sql语句。Int count = statement.extcuteUpdate(sql);返回值表示的是影响的行数,executeUpdate可以执行ddl和dml语句。
 
jdbc常用的api:
 Connection接口,这个对象主要的作用就是在Java代码中可以通过这个对象来实现sql的执行,Connection接口下主要的有三个接口,分别为Statement(主要的用于执行静态的sql);
PreparedSatement接口,主要的用于操作预编译的sql语句,CallableStatement主要的用于调用存储过程执行的(通过call关键字来调用)。
 Statement接口:该接口下主要有int count = executeUpdate(String sql);和Result result = executeQuery(String sql);方法,用于执行静态的sql。
 PreparedStatement接口:该接口下主要有 int count = executeUpdate();和Result result = executeQuery();用于执行预编译的sql,注意这里是没有参数的。
 CallableStatement接口:该接口主要有Result result = executeQuery()方法。因为CallableStatement接口是PreparedStatement接口的子接口所以也是没有参数的
 通过上面的对比发现三个接口的方法名都是一样的,不过这里指定的sql是不一样的,还有就是在CallableStatement接口中没有 executeUpdate()方法,这三者的关系是
 Statement接口是PreparedStatement接口的父接口,PreparedStatement是CallableStatement接口父接口。
 ResultSet接口:用于封装查询出来的数据的,这个方法中有next()方法,这个方法就是一个指针,开始的时候是指向表头的,当向下移动的时候就移动到第一行,调用几次这个next
 方法就会走到第几行,ResultSet rs = statement.executeQuery(sql);这个方法的返回值就是,然后通过getXXX(int colomindex);getXXX(String colomName),就可以获得对应行
 中的列的数据。rs.getInt(1);表示的就是获取当前行的第一列的数据
 
PreparedStatement接口和Statement接口的对比:
 1)语法不同PreparedStatement执行的是预编译的sql,而Statement执行的是静态的sql。2)效率不同PreparedStatement有缓冲区(oracle和SQLServer有,MySQL没有),Statement
 没有缓冲区。3)安全性不同Statement可以sql注入,但是PreparedStatement是不可以注入的。
 代码示例:

 a)statement对象:
   Connection conn = null;
   Statement stmt = null;
   //模拟传入参数
   int id = 3;
   //1.注册驱动
   Class.forName("com.mysql.jdbc.Driver");
   //2.获取连接对象
   conn = DriverManager.getConnection(url, user, password);
   //3.创建Statement对象,当使用statement对象的时候要创建这个对象。
   stmt = conn.createStatement();
   //4.sql语句
   String sql = "DELETE FROM student WHERE id="+id+"";  
   System.out.println(sql); 
   //5.执行sql
   int count = stmt.executeUpdate(sql);


   b)PreparedStatement对象:(首先要有一条预编译的sql,简单的理解就是有一个带有?的sql语句,用于检查语法的错误,执行的时候是没有参数的executeUpdate(),所有的sql发送到数据库服务器都要进行编译,这种只编译一次,从而就提高了效率,后面的传参就不用编译了)

   Connection conn = null;
   PreparedStatement stmt = null;
   //1.获取连接
   Class.forName("com.mysql.jdbc.Driver");
   //2.获取连接对象
   conn = DriverManager.getConnection(url, user, password); 
   //2.准备预编译的sql
   String sql = "DELETE FROM student WHERE id=?"; //?表示一个参数的占位符
   //3.执行预编译sql语句(检查语法)
   stmt = conn.prepareStatement(sql); 
   //4.设置参数值
   stmt.setInt(1, 9);
   //5.发送参数,执行sql
   int count = stmt.executeUpdate();

 

  c)CallableStatement对象:
   

1)没有返回值的
   Connection conn = null;
   CallableStatement stmt = null;
   ResultSet rs = null;
   //获取连接
   Class.forName("com.mysql.jdbc.Driver");
   //2.获取连接对象
   conn = DriverManager.getConnection(url, user, password);
   //准备sql
   String sql = "CALL pro_findById(?)"; //可以执行预编译的sql 
   //预编译
   stmt = conn.prepareCall(sql);
   //设置输入参数
   stmt.setInt(1, 6); 
   //发送参数
   rs = stmt.executeQuery(); //注意: 所有调用存储过程的sql语句都是使用executeQuery方法执行!!!
   //遍历结果
   while(rs.next()){
    int id = rs.getInt("id");
    String name = rs.getString("name");
    String gender = rs.getString("gender");
    System.out.println(id+","+name+","+gender);
   }

 

   2)有返回值的:

 //获取连接
    Class.forName("com.mysql.jdbc.Driver");
    //2.获取连接对象
    conn = DriverManager.getConnection(url, user, password);
    //准备sql
    String sql = "CALL pro_findById2(?,?)"; //第一个?是输入参数,第二个?是输出参数,这个是可变的
    //预编译
    stmt = conn.prepareCall(sql);
    //设置输入参数(第一个为位置,第二个为具体的值)
    stmt.setInt(1, 6);
    //设置输出参数(注册输出参数)
    /**
     * 参数一: 参数位置
     * 参数二: 存储过程中的输出参数的jdbc类型    VARCHAR(20)
     */
    stmt.registerOutParameter(2, java.sql.Types.VARCHAR);
    //发送参数,执行
    stmt.executeQuery(); //结果不是返回到结果集中,而是返回到输出参数中
    //得到输出参数的值
    /**
     * 索引值: 预编译sql中的输出参数的位置
     */
    String result = stmt.getString(2); //getXX方法专门用于获取存储过程中的输出参数与registerOutParameter方法一样。


   事物编程:
 默认的一条sql是提交事物的,这种就叫做隐士的事物,通过jdbc的连接独享的setAutoCommit()方法来设置,默认参数是true,如果要将多个sql放入到事物中就要将这个参数设置为false,将这块的代码放入奥try块中,如果发生了异常就要回滚当前的事物,就要调用连接对象的rollback()方法,这个方法有一个重载的方法,就是回滚到具体的节点上,这里就要设置连接对象的保存节点,然后就可以使用rollback()带参数的方法了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值