一、JDBC连接数据库的4个步骤:加载、连接、操作、关闭
/* *JDBC连接数据库的4个步骤: *1、/**********加载驱动程序*************/ * Class.forName(); *2、/**********/连接数据库*************/ * conn=DriverManager.getConnection(url,username,password); *3、/*****数据库的增删查改操作******/ * pstmt=conn.prepareStatement(sql); //实例化对象 * result = pstmt.executeQuery() ;//执行 SQL 查询并返回 *4、/**********数据库资源的关闭*************/ * result.close() ; * pstmt.close() ; * conn.close(); */ package com.jtlyuan; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Date; public class SelectDemo02 { /*****************JDBC连接Oracle数据库************************/ // 驱动程序就是之前在classpath中配置的jdbc的驱动程序的jar包中 public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver"; // 连接地址是由各个数据库生产商单独提供的,所以需要单独记住 public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:MLDN"; // 连接数据库的用户名 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(); } }
|
二、JDBC批处理:
批处理:多条SQL语句可以一次性执行完毕,成为批处理操作。
在Statement接口上定义了一个addBatch()方法,此方法可以加入批处理,之后使用executeBatch()方法执行批处理的操作。
package org.lxh.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:MLDN"; // 连接数据库的用户名 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(); } } |
三、JDBC事务处理
数据库事务处理,通过commit提交事务,通过rollback回滚事物。但在Connection操作所以的数据库更新属于立即更新的,如果进行事务处理的操作,则必须首先停止自动更新操作,然后所以的更新通过commit()方法进行提交,如果出现问题,则回滚。
package org.lxh.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:MLDN"; // 连接数据库的用户名 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) ; // 取消自动提交实现事务要么全提交、要么全不提交,因为JDBC默认是自动提交的,取消了才能实现事务处理 // 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) ") ; conn.commit() ;// 全都没出差提交 }catch(Exception e){ conn.rollback() ;//出现了一个错误事物回滚 } // 4、关闭数据库 stmt.close() ; conn.close(); } } |
四、JDBC:连接MySQL数据库
package org.lxh.mysqldemo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.text.SimpleDateFormat; import java.util.Date; public class JDBCMySQL { // 驱动程序就是之前在classpath中配置的jdbc的驱动程序的jar包中 public static final String DBDRIVER = "org.gjt.mm.mysql.Driver"; // 连接地址是由各个数据库生产商单独提供的,所以需要单独记住 public static final String DBURL = "jdbc:mysql://localhost:3306/testSQL"; // 连接数据库的用户名 public static final String DBUSER = "root"; // 连接数据库的密码 public static final String DBPASS = "123456"; public static void main(String[] args) throws Exception { Connection conn = null; // 表示数据库的连接的对象 PreparedStatement pstmt = null; // 表示数据库的更新操作 String name = "张三"; int age = 30; Date date = new SimpleDateFormat("yyyy-MM-dd").parse("1983-02-15"); float salary = 7000.0f; String sql = "INSERT INTO person(name,age,birthday,salary) VALUES (?,?,?,?) "; 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())) ; pstmt.setFloat(4,salary) ; // 执行SQL语句,更新数据库 pstmt.executeUpdate(); // 4、关闭数据库 pstmt.close() ; conn.close(); } } |
1、 区分Statement、PreparedStatement、CallableStatement的区别?
答:Statement是PreparedStatement的父类,CallableStatement是PreparedStement的子类。Statement是用于执行一条普通的动态SQL语句,PreparedStatement用于执行多条预编译好的SQL语句,CallableStatement用于调用数据库的存储过程。