java基础->jdbc数据库操作
Java数据库编程(JDBC)
1、JDBC简介
JDBC(JavaDataBase Connective)Java的数据库连接,JDBC本身提供的是一套与平台无关的数据库的操作标准。所以在整个JDBC中充斥着大量的操作接口。而且JDBC本身不是技术,而是一种服务。
由于JDBC本身属于一个标准,所以一个数据库如果希望使用Java进行程序开发的话,那么各个数据库的生产商必须实现这些标准——提供专门的数据库的操作包。
根据JDBC操作方式的不同,一共有以下三种常见形式:
· JDBC-ODBC桥连接:利用微软的ODBC技术进行操作
|- 操作过程:程序à JDBC à ODBCà数据库
|- 此方式属于Java默认支持的方式,但是由于其中间加入了ODBC端,所以性能很差
· JDBC连接:使用各个数据库生产商提供的数据库驱动程序
|- 操作过程:程序à JDBC à数据库
|- 由于中间缺少了ODBC环节,所以性能将有着明显的提升
· JDBC网络连接:通过网络协议进行数据库的连接操作
·类:DriverManager
·接口:Connection、PreparedStatement、Statement、ResultSet
2、连接数据库
在进行数据库连接的时候需要使用以下的几个信息:
·数据库的驱动程序:oracle.jdbc.driver.OracleDriver
·连接地址:jdbc:oracle:thin:@localhost:1521:orcl
·用户名:scott
·密码:tiger
要想连接需要使用Connection接口进行连接对象的保存,但是此接口必须依靠DriverManager类才可以完成对象的实例化操作。
import java.sql.Connection; import java.sql.DriverManager; public class ConnectionDemo { public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver"; public static final String MysqlDBDRIVER = "com.mysql.jdbc.Driver";//mysql public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:orcl"; public static final String MysqlDBURL = "jdbc:mysql://localhost:3306/test";//mysql public static final String DBUSER = "scott"; public static final String DBPASSWORD = "tiger"; public static void main(String[] args) throws Exception { Connection conn = null; // 表示的是数据库连接 Class.forName(DBDRIVER); // 1、加载数据库驱动程序 conn = DriverManager.getConnection(DBURL, DBUSER, DBPASSWORD); // 连接数据库 System.out.println(conn); // 如果不为null,表示已连接 conn.close(); // 数据库的操作必须关闭 } }
3、PreparedStatement接口实现增删改查
在开发中不会使用Statement进行操作,而都使用其子接口PreparedStatement完成。
PreparedStatement操作实际上属于预处理的操作。
如果要创建PreparedStatement接口的对象需要依靠Connection接口中的prepareStatement()方法完成,而且必须传入一个预处理的SQL语句,所有的占位符使用“?”表示。
如果现在执行的是模糊查询,要使用LIKE语句。
建表:
CREATE TABLE USERINFO
( ID INTEGER NOT NULL,
NAME VARCHAR2(50),
AGE INTEGER,
BIRTHDAYDATE)
增删改查语句:
INSERT INTO 表名称(列名称1,列名称2,…) VALUES (值1,值2,…) ;
UPDATE 表名称 SET字段=值,字段=值,.. [WHERE更新条件]
DELETE FROM 表名称 [WHERE删除条件]
数据库的更新操作本身非常的容易,直接使用executeUpdate()语句,但是如果要是查询的话就不一样,查询使用的方法是executeQuery()方法完成,方法:public ResultSet executeQuery(String sql) throwsSQLException
查询的时候是将所有的内容都保存在了ResultSet接口的对象之中。取得ResultSet对象之后,就可以通过next()方法往下取每一行的数据,但是需要注意的是,如果要想取出某一列的内容,则使用getXxx()的形式,其中Xxx表示的是具体的数据类型,例如:getFloat()、getInt()、getDate()。既可以根据列名称,也可以根据列编号,从1开始
package com; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Date; publicclass Insert { publicstaticfinal String DBDRIVER = "oracle.jdbc.driver.OracleDriver"; publicstaticfinal String DBURL = "jdbc:oracle:thin:@localhost:1521:orcl"; publicstaticfinal String DBUSER = "wangshengzhuang"; publicstaticfinal String DBPASSWORD = "wangshengzhuang"; publicstaticvoid main(String[] args) throws Exception { Connection conn = null; Class.forName(DBDRIVER); conn = DriverManager.getConnection(DBURL, DBUSER, DBPASSWORD); // 插入数据 String insertSql = "insertinto userinfo(id,name,age,birthday) values(?,?,?,?)"; PreparedStatement pstmt = conn.prepareStatement(insertSql); pstmt.setInt(1, 1); pstmt.setString(2, "wangshengzhuang"); pstmt.setInt(3, 23); pstmt.setDate(4, new java.sql.Date(new Date().getTime())); Integer len = pstmt.executeUpdate(); System.out.println("插入" + len + "行数据"); // 修改数据 String updateSql = "update userinfo set age=24 where id=?"; pstmt = conn.prepareStatement(updateSql); pstmt.setInt(1, 1); len = pstmt.executeUpdate(); System.out.println("修改" + len + "行数据"); // 查询数据 String querySql = "select* from userinfo where id=?"; pstmt = conn.prepareStatement(querySql); pstmt.setInt(1, 1); ResultSet rs = pstmt.executeQuery(); while (rs.next()) { Integer id = rs.getInt(1); String name = rs.getString(2); Integer age = rs.getInt(3); Date date = rs.getDate(4); System.out.println("id-->" + id + "name-->" + name + "age-->" + age + "birthday-->" + date); } // 删除数据 String deleteSql = "deletefrom userinfo where id=?"; pstmt = conn.prepareStatement(deleteSql); pstmt.setInt(1, 1); len = pstmt.executeUpdate(); System.out.println("删除" + len + "行数据"); rs.close(); pstmt.close(); conn.close(); // 数据库的操作必须关闭 } }
4、批处理和事务
在JDBC 2.0之后增加了许多的新功能,例如:可滚动的结集、使用ResultSet更新数据库、批处理等等, 所谓的批处理就是指所有的操作可以一次性的提交到数据库之中。
如果要使用批处理则需要使用Statement接口中的addBatch()方法。
package com; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.util.Date; publicclass Batch { publicstaticfinal String DBDRIVER = "oracle.jdbc.driver.OracleDriver"; publicstaticfinal String DBURL = "jdbc:oracle:thin:@localhost:1521:orcl"; publicstaticfinal String DBUSER = "wangshengzhuang"; publicstaticfinal String DBPASSWORD = "wangshengzhuang"; publicstaticvoid main(String[] args) throws Exception { Connection conn = null; Class.forName(DBDRIVER); conn = DriverManager.getConnection(DBURL, DBUSER, DBPASSWORD); // 插入数据 String insertSql = "insertinto userinfo(id,name,age,birthday) values(?,?,?,?)"; PreparedStatement pstmt = conn.prepareStatement(insertSql); pstmt.setInt(1, 1); pstmt.setString(2, "wangshengzhuang"); pstmt.setInt(3, 23); pstmt.setDate(4, new java.sql.Date(new Date().getTime())); pstmt.addBatch(); pstmt.setInt(1, 2); pstmt.setString(2, "wangshengqi"); pstmt.setInt(3, 24); pstmt.setDate(4, new java.sql.Date(new Date().getTime())); pstmt.addBatch(); int score[] = pstmt.executeBatch(); for (int i = 0; i < score.length; i++) { System.out.println(score[i]); } pstmt.close(); conn.close(); // 数据库的操作必须关闭 } }
此时,一次性的会将所有的SQL语句发送到数据库之中执行,一次性更新5条记录。那么如果现在假设这5条记录都是有关联的5条。
在使用批处理的操作中发现,如果中间有一条语句出错了,则默认情况下是将出错之前的代码进行提交,这是由于JDBC采用了自动的事务提交的方式才造成的结果。
如果此时要进行事务处理的话,则需要按照如下的方式进行:
1、 取消自动提交:public void setAutoCommit(booleanautoCommit) throws SQLException
2、 执行更新操作:
1、 如果没有错误,则提交事务:public void commit() throwsSQLException
4、 如果有错误,则进行回滚:public void rollback() throwsSQLException
package com; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.util.Date; publicclass Transaction { publicstaticfinal String DBDRIVER = "oracle.jdbc.driver.OracleDriver"; publicstaticfinal String DBURL = "jdbc:oracle:thin:@localhost:1521:orcl"; publicstaticfinal String DBUSER = "wangshengzhuang"; publicstaticfinal String DBPASSWORD = "wangshengzhuang"; publicstaticvoid main(String[] args) throws Exception { Connection conn = null; Class.forName(DBDRIVER); conn = DriverManager.getConnection(DBURL, DBUSER, DBPASSWORD); conn.setAutoCommit(false); // 插入数据 String insertSql = "insertinto userinfo(id,name,age,birthday) values(?,?,?,?)"; PreparedStatement pstmt = conn.prepareStatement(insertSql); pstmt.setInt(1, 1); pstmt.setString(2, "wangshengzhuang"); pstmt.setInt(3, 23); pstmt.setDate(4, new java.sql.Date(new Date().getTime())); pstmt.executeUpdate(); pstmt.setInt(1, 1); pstmt.setString(2, "wangshengqi"); pstmt.setInt(3, 24); pstmt.setDate(4, new java.sql.Date(new Date().getTime())); try{ pstmt.executeUpdate(); conn.commit(); }catch (Exception e) { System.out.println("回滚"); conn.rollback(); } pstmt.close(); conn.close(); // 数据库的操作必须关闭 } }