目录
范例1-3:数据增加。增加数据SQL语法:INSERT INTO 表名称 (列,列,...) VALUES (值, 值,....)。
范例1-4:数据修改。修改数据SQL语法:UPDATE 表名称 SET 字段=值 , .... WHERE 更新条件(s)。
范例1-5:删除数据。删除数据SQL语法:DELETE FROM 表名称 WHERE 删除条件(s)。
范例1-7:修改ResultSet读取数据的方法(代码片段。
范例1-8:以数据增加操作为例观察Statement接口的问题。
范例1-14:执行批处理(以Statement接口操作为例)。
第一章:Java数据库编程
1.2 连接Oracle数据库
范例1-1:连接数据库。
package com.yootk.demo; import java.sql.Connection; import java.sql.DriverManager; public class TestDemo { private static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver" ; private static final String DBURL = "jdbc:oracle:thin:@localhost:1521:yootk" ; private static final String USER = "scott" ; private static final String PASSWORD = "tiger" ; public static void main(String[] args) throws Exception { // 第一步:加载数据库驱动程序,此时不需要实例化,因为会由容器自己负责管理 Class.forName(DBDRIVER) ; // 第二步:根据连接协议、用户名、密码连接数据库 Connection conn = DriverManager.getConnection(DBURL, USER, PASSWORD) ; System.out.println(conn); // 输出数据库连接 conn.close(); // 第四步:关闭数据库 } } |
1.3 Statement接口
范例1-2:编写数据库创建脚本。
DROP TABLE member PURGE ; DROP SEQUENCE myseq ; CREATE SEQUENCE myseq ; CREATE TABLE member( mid NUMBER , name VARCHAR2(20) , birthday DATE DEFAULT SYSDATE , age NUMBER(3) , note CLOB , CONSTRAINT pk_mid PRIMARY KEY(mid) ) ; |
范例1-3:数据增加。增加数据SQL语法:INSERT INTO 表名称 (列,列,...) VALUES (值, 值,....)。
package com.yootk.demo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; public class TestDemo { private static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver" ; private static final String DBURL = "jdbc:oracle:thin:@localhost:1521:yootk" ; private static final String USER = "scott" ; private static final String PASSWORD = "tiger" ; public static void main(String[] args) throws Exception { // 第一步:加载数据库驱动程序,此时不需要实例化,因为会由容器自己负责管理 Class.forName(DBDRIVER) ; // 第二步:根据连接协议、用户名、密码连接数据库 Connection conn = DriverManager.getConnection(DBURL, USER, PASSWORD) ; // 第三步:进行数据库的数据操作 Statement stmt = conn.createStatement() ; // 在编写SQL的过程里面,如果太长需要增加换行,一定要在前后加上空格 String sql = " INSERT INTO member(mid,name,birthday,age,note) VALUES " + " (myseq.nextval,'优拓',TO_DATE('1987-09-15','yyyy-mm-dd'),17,'www.yootk.com')" ; int len = stmt.executeUpdate(sql) ; // 执行SQL返回更新的数据行 System.out.println("影响的数据行:" + len); // 第四步:关闭数据库 stmt.close(); // 本操作是可选的,在数据库连接已关闭下自动关闭 conn.close(); } } |
范例1-4:数据修改。修改数据SQL语法:UPDATE 表名称 SET 字段=值 , .... WHERE 更新条件(s)。
package com.yootk.demo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; public class TestDemo { private static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver" ; private static final String DBURL = "jdbc:oracle:thin:@localhost:1521:yootk" ; private static final String USER = "scott" ; private static final String PASSWORD = "tiger" ; public static void main(String[] args) throws Exception { // 第一步:加载数据库驱动程序,此时不需要实例化,因为会由容器自己负责管理 Class.forName(DBDRIVER) ; // 第二步:根据连接协议、用户名、密码连接数据库 Connection conn = DriverManager.getConnection(DBURL, USER, PASSWORD) ; // 第三步:进行数据库的数据操作 Statement stmt = conn.createStatement() ; // 在编写SQL的过程里面,如果太长需要增加换行,一定要在前后加上空格 String sql = "UPDATE member SET name='李兴华',birthday=SYSDATE,age=30 " + " WHERE mid IN(3,5,7,9,11)"; int len = stmt.executeUpdate(sql) ; // 执行SQL返回更新的数据行 System.out.println("影响的数据行:" + len); // 第四步:关闭数据库 stmt.close(); // 本操作是可选的,在数据库连接已关闭时自动关闭 conn.close(); } } |
范例1-5:删除数据。删除数据SQL语法:DELETE FROM 表名称 WHERE 删除条件(s)。
package com.yootk.demo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; public class TestDemo { private static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver" ; private static final String DBURL = "jdbc:oracle:thin:@localhost:1521:yootk" ; private static final String USER = "scott" ; private static final String PASSWORD = "tiger" ; public static void main(String[] args) throws Exception { // 第一步:加载数据库驱动程序,此时不需要实例化,因为会由容器自己负责管理 Class.forName(DBDRIVER) ; // 第二步:根据连接协议、用户名、密码连接数据库 Connection conn = DriverManager.getConnection(DBURL, USER, PASSWORD) ; // 第三步:进行数据库的数据操作 Statement stmt = conn.createStatement() ; // 在编写SQL的过程里面,如果太长需要增加换行,一定要在前后加上空格 String sql = "DELETE FROM member WHERE mid IN(3,5,7,9,11)"; int len = stmt.executeUpdate(sql) ; // 执行SQL返回更新的数据行 System.out.println("影响的数据行:" + len); // 第四步:关闭数据库 stmt.close(); // 本操作是可选的,在数据库连接已关闭时自动关闭 conn.close(); } } |
范例1-6:实现数据的查询。
package com.yootk.demo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.Date; public class TestDemo { private static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver" ; private static final String DBURL = "jdbc:oracle:thin:@localhost:1521:yootk" ; private static final String USER = "scott" ; private static final String PASSWORD = "tiger" ; public static void main(String[] args) throws Exception { // 第一步:加载数据库驱动程序,此时不需要实例化,因为会由容器自己负责管理 Class.forName(DBDRIVER) ; // 第二步:根据连接协议、用户名、密码连接数据库 Connection conn = DriverManager.getConnection(DBURL, USER, PASSWORD) ; // 第三步:进行数据库的数据操作 Statement stmt = conn.createStatement() ; // 在编写SQL的过程里面,如果太长需要增加换行,一定要在前后加上空格 String sql = "SELECT mid,name,age,birthday,note FROM member" ; ResultSet rs = stmt.executeQuery(sql) ; // 实现数据查询 while (rs.next()) { // 循环取出返回的每一行数据 int mid = rs.getInt("mid") ; // 取出mid字段内容 String name = rs.getString("name") ; // 取出name字段内容 int age = rs.getInt("age") ; // 取出age字段内容 Date birthday = rs.getDate("birthday") ; // 取出birthday字段内容 String note = rs.getString("note") ; // 取出note字段内容 System.out.println(mid + "," + name + "," + age + "," + birthday + "," + note); } rs.close(); stmt.close(); conn.close(); // 第四步:关闭数据库 } } |
范例1-7:修改ResultSet读取数据的方法(代码片段。
ResultSet rs = stmt.executeQuery(sql) ; // 实现数据查询 while (rs.next()) { // 循环取出返回的每一行数据 int mid = rs.getInt(1) ; // 取出mid字段内容 String name = rs.getString(2) ; // 取出name字段内容 int age = rs.getInt(3) ; // 取出age字段内容 Date birthday = rs.getDate(4) ; // 取出birthday字段内容 String note = rs.getString(5) ; // 取出note字段内容 System.out.println(mid + "," + name + "," + age + "," + birthday + "," + note); } |
1.4 PreparedStatement接口
范例1-8:以数据增加操作为例观察Statement接口的问题。
package com.yootk.demo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; public class TestDemo { private static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver" ; private static final String DBURL = "jdbc:oracle:thin:@localhost:1521:yootk" ; private static final String USER = "scott" ; private static final String PASSWORD = "tiger" ; public static void main(String[] args) throws Exception { String name = "Mr'SMITH" ; // 增加的name数据 String birthday = "1998-10-10" ; // 增加的birthday数据,暂时使用String类型 int age = 18 ; // 增加的age数据 String note = "www.yootk.com" ; // 增加的note数据 Class.forName(DBDRIVER) ; // 加载驱动程序 Connection conn = DriverManager.getConnection(DBURL, USER, PASSWORD) ; // 连接数据库 Statement stmt = conn.createStatement() ; // 创建Statement接口对象 String sql = " INSERT INTO member(mid,name,birthday,age,note) VALUES " + " (myseq.nextval,'" + name + "',TO_DATE('" + birthday + "','yyyy-mm-dd')," + age + ",'" + note + "')"; // 采用拼凑SQl语句形式,代码混乱 System.out.println(sql); int len = stmt.executeUpdate(sql) ; // 执行SQL返回更新的数据行 System.out.println("影响的数据行:" + len); conn.close(); // 关闭数据库连接 } } |
范例1-9:改进数据增加。
package com.yootk.demo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.util.Date; public class TestDemo { private static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver" ; private static final String DBURL = "jdbc:oracle:thin:@localhost:1521:yootk" ; private static final String USER = "scott" ; private static final String PASSWORD = "tiger" ; public static void main(String[] args) throws Exception { String name = "Mr'SMITH" ; // 增加的name数据 Date birthday = new Date() ; // 增加的birthday数据,使用java.util.Date int age = 18 ; // 增加的age数据 String note = "www.yootk.com" ; // 增加的note数据 Class.forName(DBDRIVER) ; // 加载驱动程序 Connection conn = DriverManager.getConnection(DBURL, USER, PASSWORD) ; // 连接数据库 String sql = " INSERT INTO member(mid,name,birthday,age,note) VALUES " + " (myseq.nextval,?,?,?,?)"; // 使用占位符设置预处理数据 PreparedStatement pstmt = conn.prepareStatement(sql) ; pstmt.setString(1, name); // 设置第1个占位符“?” pstmt.setDate(2, new java.sql.Date( birthday.getTime())); // 设置第2个占位符“?” pstmt.setInt(3, age); // 设置第3个占位符“?” pstmt.setString(4, note); // 设置第4个占位符“?” int len = pstmt.executeUpdate() ; // 执行SQL返回更新的数据行 System.out.println("影响的数据行:" + len); conn.close(); // 关闭数据库连接 } } |
范例1-10:查询全部数据。
package com.yootk.demo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Date; public class TestDemo { private static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver" ; private static final String DBURL = "jdbc:oracle:thin:@localhost:1521:yootk" ; private static final String USER = "scott" ; private static final String PASSWORD = "tiger" ; public static void main(String[] args) throws Exception { Class.forName(DBDRIVER) ; // 加载驱动程序 Connection conn = DriverManager.getConnection(DBURL, USER, PASSWORD) ; // 连接数据库 String sql = "SELECT mid,name,birthday,age,note FROM member ORDER BY mid"; PreparedStatement pstmt = conn.prepareStatement(sql) ; ResultSet rs = pstmt.executeQuery() ; // 数据查询,不设置占位符 while (rs.next()) { int mid = rs.getInt(1) ; // 取出第1个数据列内容 String name = rs.getString(2) ; // 取出第2个数据列内容 Date birthday = rs.getDate(3) ; // 取出第3个数据列内容 int age = rs.getInt(4) ; // 取出第4个数据列内容 String note = rs.getString(5) ; // 取出第5个数据列内容 System.out.println(mid + "," + name + "," + birthday + "," + age + "," + note); } conn.close(); // 关闭数据库连接 } } |
范例1-11:模糊查询。
package com.yootk.demo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Date; public class TestDemo { private static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver" ; private static final String DBURL = "jdbc:oracle:thin:@localhost:1521:yootk" ; private static final String USER = "scott" ; private static final String PASSWORD = "tiger" ; public static void main(String[] args) throws Exception { String keyWord = "优" ; // 模糊查询关键字 Class.forName(DBDRIVER) ; // 加载驱动程序 Connection conn = DriverManager.getConnection(DBURL, USER, PASSWORD) ; // 连接数据库 String sql = "SELECT mid,name,birthday,age,note FROM member " + " WHERE name LIKE ? ORDER BY mid"; // 此时设置了限定查询与占位符 PreparedStatement pstmt = conn.prepareStatement(sql) ; pstmt.setString(1, "%" + keyWord + "%"); // 设置查询关键字 ResultSet rs = pstmt.executeQuery() ; // 数据查询,不设置占位符 while (rs.next()) { int mid = rs.getInt(1) ; // 取出第1个数据列内容 String name = rs.getString(2) ; // 取出第2个数据列内容 Date birthday = rs.getDate(3) ; // 取出第3个数据列内容 int age = rs.getInt(4) ; // 取出第4个数据列内容 String note = rs.getString(5) ; // 取出第5个数据列内容 System.out.println(mid + "," + name + "," + birthday + "," + age + "," + note); } conn.close(); // 关闭数据库连接 } } |
范例1-12:数据分页显示。
package com.yootk.demo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Date; public class TestDemo { private static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver" ; private static final String DBURL = "jdbc:oracle:thin:@localhost:1521:yootk" ; private static final String USER = "scott" ; private static final String PASSWORD = "tiger" ; public static void main(String[] args) throws Exception { String keyWord = "" ; // 不设置关键字表示查询全部 int currentPage = 2 ; // 当前所在页 int lineSize = 3 ; // 每页显示行数 Class.forName(DBDRIVER) ; // 加载驱动程序 Connection conn = DriverManager.getConnection(DBURL, USER, PASSWORD) ; // 连接数据库 String sql = " SELECT * FROM (" + " SELECT mid,name,birthday,age,note,ROWNUM rn " + " FROM member " + " WHERE name LIKE ? AND ROWNUM<=?) temp " + " WHERE temp.rn>? ORDER BY mid"; PreparedStatement pstmt = conn.prepareStatement(sql) ; pstmt.setString(1, "%" + keyWord + "%"); // 设置查询关键字 pstmt.setInt(2, currentPage * lineSize); // 分页参数 pstmt.setInt(3, (currentPage - 1) * lineSize); // 分页参数 ResultSet rs = pstmt.executeQuery() ; // 数据查询,不设置占位符 while (rs.next()) { int mid = rs.getInt(1) ; // 取出第1个数据列内容 String name = rs.getString(2) ; // 取出第2个数据列内容 Date birthday = rs.getDate(3) ; // 取出第3个数据列内容 int age = rs.getInt(4) ; // 取出第4个数据列内容 String note = rs.getString(5) ; // 取出第5个数据列内容 System.out.println(mid + "," + name + "," + birthday + "," + age + "," + note); } conn.close(); // 关闭数据库连接 } } |
范例1-13:统计数据量,使用COUNT()函数。
package com.yootk.demo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; public class TestDemo { private static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver" ; private static final String DBURL = "jdbc:oracle:thin:@localhost:1521:yootk" ; private static final String USER = "scott" ; private static final String PASSWORD = "tiger" ; public static void main(String[] args) throws Exception { String keyWord = "" ; // 不设置关键字表示查询全部 Class.forName(DBDRIVER) ; // 加载驱动程序 Connection conn = DriverManager.getConnection(DBURL, USER, PASSWORD) ; // 连接数据库 String sql = " SELECT COUNT(mid) FROM member WHERE name LIKE ?"; PreparedStatement pstmt = conn.prepareStatement(sql) ; pstmt.setString(1, "%" + keyWord + "%"); // 设置查询关键字 ResultSet rs = pstmt.executeQuery() ; // 数据查询,不设置占位符 if (rs.next()) { // COUNT()函数一定会返回结果 int count = rs.getInt(1) ; // 取出第一列 System.out.println("数据记录个数为:" + count); } conn.close(); // 关闭数据库连接 } } |
1.5 批处理与事务处理
范例1-14:执行批处理(以Statement接口操作为例)。
package com.yootk.demo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; import java.util.Arrays; public class TestDemo { private static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver" ; private static final String DBURL = "jdbc:oracle:thin:@localhost:1521:yootk" ; private static final String USER = "scott" ; private static final String PASSWORD = "tiger" ; public static void main(String[] args) throws Exception { Class.forName(DBDRIVER) ; // 加载驱动程序 Connection conn = DriverManager.getConnection(DBURL, USER, PASSWORD) ; // 连接数据库 Statement stmt = conn.createStatement() ; // 创建数据库操作对象 stmt.addBatch("INSERT INTO member(mid,name) VALUES (myseq.nextval,'优拓A')"); stmt.addBatch("INSERT INTO member(mid,name) VALUES (myseq.nextval,'优拓B')"); stmt.addBatch("INSERT INTO member(mid,name) VALUES (myseq.nextval,'优拓C')"); stmt.addBatch("INSERT INTO member(mid,name) VALUES (myseq.nextval,'优拓D')"); stmt.addBatch("INSERT INTO member(mid,name) VALUES (myseq.nextval,'优拓E')"); int result [] = stmt.executeBatch() ; // 执行批处理 System.out.println(Arrays.toString(result)); conn.close(); // 关闭数据库连接 } } |
范例1-15:利用事务处理。
package com.yootk.demo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; import java.util.Arrays; public class TestDemo { private static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver" ; private static final String DBURL = "jdbc:oracle:thin:@localhost:1521:yootk" ; private static final String USER = "scott" ; private static final String PASSWORD = "tiger" ; public static void main(String[] args) throws Exception { Class.forName(DBDRIVER) ; // 加载驱动程序 Connection conn = DriverManager.getConnection(DBURL, USER, PASSWORD) ; // 连接数据库 Statement stmt = conn.createStatement() ; // 创建数据库操作对象 conn.setAutoCommit(false); // 取消自动提交 try { stmt.addBatch("INSERT INTO member(mid,name) VALUES (myseq.nextval,'优拓A')"); stmt.addBatch("INSERT INTO member(mid,name) VALUES (myseq.nextval,'优拓B')"); // 此时以下语句出现了错误,由于使用了事务控制,这样所有批处理的更新语句将都不会执行 stmt.addBatch("INSERT INTO member(mid,name) VALUES (myseq.nextval,'优拓'C')"); stmt.addBatch("INSERT INTO member(mid,name) VALUES (myseq.nextval,'优拓D')"); stmt.addBatch("INSERT INTO member(mid,name) VALUES (myseq.nextval,'优拓E')"); int result [] = stmt.executeBatch() ; // 执行批处理 System.out.println(Arrays.toString(result)); conn.commit(); // 如果没有错误,进行提交 } catch (Exception e) { e.printStackTrace(); conn.rollback(); // 如果出现异常,则进行回滚 } conn.close(); // 关闭数据库连接 } } |