1.JDBC的基本概念
JDBC:java database connective数据库链接,是一组专门负责链接并操作数据库的标准, 在整个JDBC中,实际上提供了大量的接口.要使用java对数据库进行数据库的开发,则肯定必须对这些标准有所支持.
JDBC使用中的方式:
JDBC-ODBC:实际开发中使用很少,效率非常低.
JDBC连接: 使用各个数据库提供商给定的数据库驱动程序,完成JDBC的开发,这时需要在classpath中配置驱动程序.
JDBC网络连接:主要使用网络连接数据库.
2.JDBC的操作步骤
操作步骤:
①加载数据库驱动程序,在classpath中配置.
②连接数据库,通过Connection接口和DriverManger类完成.
③操作数据库,通过Statement,PreparedStatement,ResultSet三个接口完成.
④关闭数据库.
3.JDBC的连接操作
连接步骤:
①通过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();
}
}
4.数据库更新操作
执行数据库的更新操作需要Statement接口支持,可以执行增,删,改操作.
4.1增加操作示例
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();
}
}
4.2更新操作示例
stmt.executeUpdate("UPDATE person SET name='李四',age=33,
birthday=sysdate,salary=8000.0 WHERE pid=4") ;
4.3删除操作示例
stmt.executeUpdate("DELETE FROM person WHERE pid=4") ;
4.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) ;
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语句实际上是有问题的,比如单引号就会出现解析异常,同时也会出现数据库的注入非法操作等等.
6.PreparedStatement接口
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();
}
}
7.批处理
定义:多条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();
}
}
8.事务处理
通过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: aresxdy@gmail.com
------------------------------------------------