JDBC:java database connective数据库链接,是一组专门负责链接并操作数据库的标准, 在整个JDBC中,实际上提供了大量的接口.要使用java对数据库进行数据库的开发,则肯定必须对这些标准有所支持.
JDBC使用中的方式:
JDBC-ODBC:实际开发中使用很少,效率非常低.
JDBC连接: 使用各个数据库提供商给定的数据库驱动程序,完成JDBC的开发,这时需要在classpath中配置驱动程序.
JDBC网络连接:主要使用网络连接数据库.
操作步骤:
①加载数据库驱动程序,在classpath中配置.
②连接数据库,通过Connection接口和DriverManger类完成.
③操作数据库,通过Statement,PreparedStatement,ResultSet三个接口完成.
④关闭数据库.
连接步骤:
①通过Class.forName加载数据库的驱动程序.
②通过DriverManager类进行数据库的连接,连接时需要输入数据库的连接地址,用户名,密码.
③通过Connection接口接收连接.
连接示例:
package com.ares.connectdemo; import java.sql.Connection; import java.sql.DriverManager; public class ConnectJDBC { // 驱动程序就是之前在classpath中配置的jdbc的驱动程序的jar包中 public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver"; // 连接地址是由各个数据库生产商单独提供的,所以需要单独记住 public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:DEMO"; // 连接数据库的用户名 public static final String DBUSER = "scott"; // 连接数据库的密码 public static final String DBPASS = "tiger"; public static void main(String[] args) throws Exception { Connection conn = null; // 表示数据库的连接的对象 // 1、使用Class类加载驱动程序 Class.forName(DBDRIVER); // 2、连接数据库 conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS); System.out.println(conn); // 4、关闭数据库 conn.close(); } }
执行数据库的更新操作需要Statement接口支持,可以执行增,删,改操作.
package com.ares.updatedemo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; public class StatementDemo01 { // 驱动程序就是之前在classpath中配置的jdbc的驱动程序的jar包中 public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver"; // 连接地址是由各个数据库生产商单独提供的,所以需要单独记住 public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:DEMO"; // 连接数据库的用户名 public static final String DBUSER = "scott"; // 连接数据库的密码 public static final String DBPASS = "tiger"; public static void main(String[] args) throws Exception { Connection conn = null; // 表示数据库的连接的对象 Statement stmt = null ; // 表示数据库的更新操作 // 1、使用Class类加载驱动程序 Class.forName(DBDRIVER); // 2、连接数据库 conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS); // 3、Statement接口需要通过Connection接口进行实例化操作 stmt = conn.createStatement() ; // 执行SQL语句,更新数据库 stmt.executeUpdate("INSERT INTO person(pid,name,age,birthday,salary) VALUES (perseq.nextval,'张三',30,TO_DATE('1995-02-14','yyyy-mm-dd'),9000.0) ") ; //TO_DATE是oracle数据库的时间日期格式. // 4、关闭数据库 conn.close(); } }
stmt.executeUpdate("UPDATE person SET name='李四',age=33, birthday=sysdate,salary=8000.0 WHERE pid=4") ;
stmt.executeUpdate("DELETE FROM person WHERE pid=4") ;
通过SELECT命令查询数据库,程序通过ResultSet保存全部的查询结果,通过Statement接口中的executeQuery()方法查询.通过next()方法找到返回的没一行数据,没一行中的各个列数据需要通过getXXX方法获得.
示例代码:
package com.ares.resultdemo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.Date; public class ResultSetDemo01 { // 驱动程序就是之前在classpath中配置的jdbc的驱动程序的jar包中 public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver"; // 连接地址是由各个数据库生产商单独提供的,所以需要单独记住 public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:DEMO"; // 连接数据库的用户名 public static final String DBUSER = "scott"; // 连接数据库的密码 public static final String DBPASS = "tiger"; public static void main(String[] args) throws Exception { Connection conn = null; // 表示数据库的连接的对象 Statement stmt = null ; // 表示数据库的更新操作 ResultSet result = null ;// 表示接收数据库的查询结果 // 1、使用Class类加载驱动程序 Class.forName(DBDRIVER); // 2、连接数据库 conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS); // 3、Statement接口需要通过Connection接口进行实例化操作 stmt = conn.createStatement() ; // 执行SQL语句,查询数据库 result = stmt.executeQuery("SELECT pid,name,age,birthday,salary FROM person") ; while(result.next()){// 是否有下一行数据 int pid = result.getInt("pid") ; String name = result.getString("name") ; int age = result.getInt("age") ; Date birthday = result.getDate("birthday") ; float salary = result.getFloat("salary") ; System.out.print("pid = " + pid + ";") ; System.out.print("name = " + name + ";") ; System.out.print("age = " + age + ";") ; System.out.print("birthday = " + birthday + ";") ; System.out.println("salary = " + salary + ";") ; } // 4、关闭数据库 result.close() ; stmt.close() ; conn.close(); } }
数据查询后取值的另一种方式:
int pid = result.getInt(1) ; String name = result.getString(2) ; int age = result.getInt(3) ; Date birthday = result.getDate(4) ; float salary = result.getFloat(5) ;
插入数据示例:
InputData类
package com.ares.execdemo; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class InputData { private BufferedReader buf = null; public InputData() { this.buf = new BufferedReader(new InputStreamReader(System.in)); } public String getString(String info) { String str = null; System.out.print(info);// 打印提示信息 try { str = this.buf.readLine(); } catch (IOException e) { e.printStackTrace(); } return str; } public int getInt(String info, String err) { int temp = 0; boolean flag = true;// 定义一个标志位 while (flag) { String str = this.getString(info); if (str.matches("\\d+")) { temp = Integer.parseInt(str); flag = false;// 退出循环 } else { System.out.print(err); } } return temp; } public float getFloat(String info, String err) { float temp = 0.0f; boolean flag = true;// 定义一个标志位 while (flag) { String str = this.getString(info); if (str.matches("\\d+.?\\d+")) { temp = Float.parseFloat(str); flag = false;// 退出循环 } else { System.out.print(err); } } return temp; } public char getChar(String info, String err) { char temp = ' '; boolean flag = true;// 定义一个标志位 while (flag) { String str = this.getString(info); if (str.matches("\\w")) { temp = str.charAt(0); flag = false;// 退出循环 } else { System.out.print(err); } } return temp; } public Date getDate(String info, String err) { Date temp = null ; boolean flag = true;// 定义一个标志位 while (flag) { String str = this.getString(info); if (str.matches("\\d{4}-\\d{2}-\\d{2}")) { try { temp = new SimpleDateFormat("yyyy-MM-dd"). parse(str) ; } catch (ParseException e) { System.out.print(err) ; } flag = false;// 退出循环 } else { System.out.print(err); } } return temp; } }
InsertDemo类示例:
package com.ares.execdemo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; public class InsertDemo { // 驱动程序就是之前在classpath中配置的jdbc的驱动程序的jar包中 public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver"; // 连接地址是由各个数据库生产商单独提供的,所以需要单独记住 public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:DEMO"; // 连接数据库的用户名 public static final String DBUSER = "scott"; // 连接数据库的密码 public static final String DBPASS = "tiger"; public static void main(String[] args) throws Exception { Connection conn = null; // 表示数据库的连接的对象 Statement stmt = null; // 表示数据库的更新操作 InputData input = new InputData() ; String name = input.getString("请输入姓名:"); int age = input.getInt("请输入年龄:", "年龄必须是数字,"); String date = input.getString("请输入生日:"); float salary = input.getFloat("请输入工资:", "输入的工资必须是数字,"); String sql = "INSERT INTO person(pid,name,age,birthday,salary) VALUES (perseq.nextval,'" + name + "'," + age + ",TO_DATE('" + date + "','yyyy-mm-dd')," + salary + ") "; System.out.println(sql) ; // 1、使用Class类加载驱动程序 Class.forName(DBDRIVER); // 2、连接数据库 conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS); // 3、Statement接口需要通过Connection接口进行实例化操作 stmt = conn.createStatement(); // 执行SQL语句,更新数据库 stmt.executeUpdate(sql); // 4、关闭数据库 conn.close(); } }
备注:这种拼凑的SQL语句实际上是有问题的,比如单引号就会出现解析异常,同时也会出现数据库的注入非法操作等等.
PreparedStatement是Statement接口的子接口,也是实际操作中使用较多的接口,表示预处理操作.
插入示例:
package com.ares.prepareddemo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.util.Date; public class InsertDemo { // 驱动程序就是之前在classpath中配置的jdbc的驱动程序的jar包中 public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver"; // 连接地址是由各个数据库生产商单独提供的,所以需要单独记住 public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:DEMO"; // 连接数据库的用户名 public static final String DBUSER = "scott"; // 连接数据库的密码 public static final String DBPASS = "tiger"; public static void main(String[] args) throws Exception { Connection conn = null; // 表示数据库的连接的对象 PreparedStatement pstmt = null; // 表示数据库的更新操作 InputData input = new InputData() ; String name = input.getString("请输入姓名:"); int age = input.getInt("请输入年龄:", "年龄必须是数字,"); Date date = input.getDate("请输入生日:","输入的不是日期,"); float salary = input.getFloat("请输入工资:", "输入的工资必须是数字,"); String sql = "INSERT INTO person(pid,name,age,birthday,salary) VALUES (perseq.nextval,?,?,?,?) "; System.out.println(sql) ; // 1、使用Class类加载驱动程序 Class.forName(DBDRIVER); // 2、连接数据库 conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS); // 3、PreparedStatement接口需要通过Connection接口进行实例化操作 pstmt = conn.prepareStatement(sql) ;// 使用预处理的方式创建对象 pstmt.setString(1, name) ;// 第一个?号的内容 pstmt.setInt(2, age) ; // 第二个?号的内容 pstmt.setDate(3, new java.sql.Date(date.getTime())) ; //将util下的格式转为sql下的格式. pstmt.setFloat(4,salary) ; // 执行SQL语句,更新数据库 pstmt.executeUpdate(); // 4、关闭数据库 pstmt.close() ; conn.close(); } }
查询操作示例:
String sql = "SELECT pid,name,age,birthday,salary FROM person" ; … ... pstmt = conn.prepareStatement(sql) ; // 执行SQL语句,查询数据库 result = pstmt.executeQuery() ; while(result.next()){// 是否有下一行数据 int pid = result.getInt(1) ; String name = result.getString(2) ; int age = result.getInt(3) ; Date birthday = result.getDate(4) ; float salary = result.getFloat(5) ; }
模糊查询操作:
package com.ares.prepareddemo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Date; public class SelectDemo02 { // 驱动程序就是之前在classpath中配置的jdbc的驱动程序的jar包中 public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver"; // 连接地址是由各个数据库生产商单独提供的,所以需要单独记住 public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:DEMO"; // 连接数据库的用户名 public static final String DBUSER = "scott"; // 连接数据库的密码 public static final String DBPASS = "tiger"; public static void main(String[] args) throws Exception { Connection conn = null; // 表示数据库的连接的对象 PreparedStatement pstmt = null ; // 表示数据库的更新操作 ResultSet result = null ;// 表示接收数据库的查询结果 String keyWord = "" ; String sql = "SELECT pid,name,age,birthday,salary FROM person WHERE name LIKE ? OR birthday LIKE ?" ; // 1、使用Class类加载驱动程序 Class.forName(DBDRIVER); // 2、连接数据库 conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS); // 3、PreparedStatement接口需要通过Connection接口进行实例化操作 pstmt = conn.prepareStatement(sql) ; pstmt.setString(1,"%"+keyWord+"%") ; pstmt.setString(2,"%"+keyWord+"%") ; // 执行SQL语句,查询数据库 result = pstmt.executeQuery() ; while(result.next()){// 是否有下一行数据 int pid = result.getInt(1) ; String name = result.getString(2) ; int age = result.getInt(3) ; Date birthday = result.getDate(4) ; float salary = result.getFloat(5) ; System.out.print("pid = " + pid + ";") ; System.out.print("name = " + name + ";") ; System.out.print("age = " + age + ";") ; System.out.print("birthday = " + birthday + ";") ; System.out.println("salary = " + salary + ";") ; } // 4、关闭数据库 result.close() ; pstmt.close() ; conn.close(); } }
定义:多条SQL语句可以一次性执行完毕,称为批处理操作.批处理是JDBC2.0之后提出的一个概念.2.0还有滚动的结果集及用滚动结果集更新数据等,但是这些操作使用较少.
Statement上定义了一个addBatch()方法,此方法可以加入批处理,之后使用executeBatch()方法执行批处理操作.
代码示例:
package com.ares.prepareddemo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; public class BatchInsertDemo { // 驱动程序就是之前在classpath中配置的jdbc的驱动程序的jar包中 public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver"; // 连接地址是由各个数据库生产商单独提供的,所以需要单独记住 public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:DEMO"; // 连接数据库的用户名 public static final String DBUSER = "scott"; // 连接数据库的密码 public static final String DBPASS = "tiger"; public static void main(String[] args) throws Exception { Connection conn = null; // 表示数据库的连接的对象 PreparedStatement pstmt = null; // 表示数据库的更新操作 String sql = "INSERT INTO person(pid,name,age,birthday,salary) VALUES (perseq.nextval,?,?,?,?) "; System.out.println(sql) ; // 1、使用Class类加载驱动程序 Class.forName(DBDRIVER); // 2、连接数据库 conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS); // 3、PreparedStatement接口需要通过Connection接口进行实例化操作 pstmt = conn.prepareStatement(sql) ;// 使用预处理的方式创建对象 for(int i=0;i<10;i++){ pstmt.setString(1, "lxh-" + i);// 第一个?号的内容 pstmt.setInt(2, 20 + i); // 第二个?号的内容 pstmt.setDate(3, new java.sql.Date(new java.util.Date().getTime())); pstmt.setFloat(4, 900*i); pstmt.addBatch() ; // 增加批处理 } // 执行SQL语句,更新数据库 int i[] = pstmt.executeBatch() ; System.out.println(i.length); // 4、关闭数据库 pstmt.close() ; conn.close(); } }
通过commit提交事务,通过rollback回滚事务.事务处理需要依靠Connection完成.commit是提交更新操作,rollback表示提交执行过程中出现异常,取消操作,回滚.因为数据库的操作不用事务处理的话,操作都是立即执行的.
package com.ares.trandemo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; public class TransactionDemo02 { // 驱动程序就是之前在classpath中配置的jdbc的驱动程序的jar包中 public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver"; // 连接地址是由各个数据库生产商单独提供的,所以需要单独记住 public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:DEMO"; // 连接数据库的用户名 public static final String DBUSER = "scott"; // 连接数据库的密码 public static final String DBPASS = "tiger"; public static void main(String[] args) throws Exception { Connection conn = null; // 表示数据库的连接的对象 Statement stmt = null; // 表示数据库的更新操作 // 1、使用Class类加载驱动程序 Class.forName(DBDRIVER); // 2、连接数据库 conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS); conn.setAutoCommit(false) ; // 取消自动提交 // 3、Statement接口需要通过Connection接口进行实例化操作 stmt = conn.createStatement() ; try{ stmt.addBatch("INSERT INTO person(pid,name,age,birthday,salary) VALUES (perseq.nextval,'张三',30,TO_DATE('1995-02-14','yyyy-mm-dd'),9000.0) ") ; stmt.addBatch("INSERT INTO person(pid,name,age,birthday,salary) VALUES (perseq.nextval,'李四',30,TO_DATE('1995-02-14','yyyy-mm-dd'),9000.0) ") ; stmt.addBatch("INSERT INTO person(pid,name,age,birthday,salary) VALUES (perseq.nextval,'王'五',30,TO_DATE('1995-02-14','yyyy-mm-dd'),9000.0) ") ; stmt.addBatch("INSERT INTO person(pid,name,age,birthday,salary) VALUES (perseq.nextval,'赵六',30,TO_DATE('1995-02-14','yyyy-mm-dd'),9000.0) ") ; stmt.addBatch("INSERT INTO person(pid,name,age,birthday,salary) VALUES (perseq.nextval,'孙七',30,TO_DATE('1995-02-14','yyyy-mm-dd'),9000.0) ") ; // 执行SQL语句,更新数据库 int i[] = stmt.executeBatch() ; System.out.println(i.length); conn.commit() ;// 提交 }catch(Exception e){ conn.rollback() ;// 回滚 } // 4、关闭数据库 stmt.close() ; conn.close(); } }
20150528
JAVA学习笔记系列
--------------------------------------------
联系方式
--------------------------------------------
Weibo: ARESXIONG
E-Mail: [email protected]
------------------------------------------------