目录

第一章:Java数据库编程

1.2  连接Oracle数据库

范例1-1:连接数据库。

1.3  Statement接口

范例1-2:编写数据库创建脚本。

范例1-3:数据增加。增加数据SQL语法:INSERT INTO 表名称 (列,列,...) VALUES (值, 值,....)。

范例1-4:数据修改。修改数据SQL语法:UPDATE 表名称 SET 字段=值 , .... WHERE 更新条件(s)。

范例1-5:删除数据。删除数据SQL语法:DELETE FROM 表名称 WHERE 删除条件(s)。

范例1-6:实现数据的查询。

范例1-7:修改ResultSet读取数据的方法(代码片段。

1.4  PreparedStatement接口

范例1-8:以数据增加操作为例观察Statement接口的问题。

范例1-9:改进数据增加。

范例1-10:查询全部数据。

范例1-11:模糊查询。

范例1-12:数据分页显示。

范例1-13:统计数据量,使用COUNT()函数。

1.5  批处理与事务处理

范例1-14:执行批处理(以Statement接口操作为例)。

范例1-15:利用事务处理。


第一章: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(); // 关闭数据库连接
}
}