一.JDBC原理
JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API。是Java应用程序访问数据库的里程碑式解决方案。Java研发者希望用相同的方式访问不同的数据库,以实现与具体数据库无关的Java操作界面。JDBC定义了一套标准接口,即访问数据库的通用API,不同的数据库厂商根据各自数据库的特点去实现这些接口。
二.接口Driver
每个驱动程序类必须实现的接口。Java SQL 框架允许多个数据库驱动程序。每个驱动程序都应该提供一个实现 Driver 接口的类。DriverManager 会试着加载尽可能多的它可以找到的驱动程序,然后,对于任何给定连接请求,它会让每个驱动程序依次试着连接到目标 URL。强烈建议每个 Driver 类应该是小型的并且是单独的,这样就可以在不必引入大量支持代码的情况下加载和查询 Driver 类。在加载某一 Driver 类时,它应该创建自己的实例并向 DriverManager 注册该实例。这意味着用户可以通过调用以下程序加载和注册一个驱动程序
Class.forName("xx.jdbc.driver.xxDriver")
三.连接接口Connection
与特定数据库的连接(会话)
四.语句对象接口
- Statement
- PreparedStatement
- CallableStatement
Statement:用于执行静态 SQL 语句并返回它所生成结果的对象。在默认情况下,同一时间每个 Statement 对象在只能打开一个 ResultSet 对象。因此,如果读取一个 ResultSet 对象与读取另一个交叉,则这两个对象必须是由不同的 Statement 对象生成的。如果存在某个语句的打开的当前 ResultSet 对象,则 Statement 接口中的所有执行方法都会隐式关闭它。
PreparedStatement: 表示预编译的 SQL 语句的对象。SQL 语句被预编译并存储在 PreparedStatement 对象中。然后可以使用此对象多次高效地执行该语句。
方法摘要:
五.结果集接口
表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。ResultSet 对象具有指向其当前数据行的光标。最初,光标被置于第一行之前。next 方法将光标移动到下一行;因为该方法在 ResultSet 对象没有下一行时返回 false,所以可以在 while 循环中使用它来迭代结果集。
六.访问数据库具体流程.
- 加载驱动,建立连接
- 创建语句对象
- 执行SQL语句
- 处理结果集
- 关闭连接
具体事例:
1.获取所有图书信息:
package cuit.book;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class BookDAO {
//数据库连接字符串,注意数据库的名称(20150032)和字符编码(UTF-8)
private String JDBCURL = "jdbc:mysql://localhost:3306/20150032?useUnicode=true&characterEncoding=UTF-8";
//数据库访问账号
private String user = "root";
//账号密码
private String password = "123456";
//数据库连接对象
private Connection conn = null;
//数据库操作申明
private Statement stmt = null;
//数据库访问结果集
private ResultSet rst = null;
/**
* 获取所有图书信息
* @return
*/
public List<Book> getAll(){
List<Book> books = new ArrayList<Book>();
try {
//加载MySQL数据库驱动程序
Class.forName("com.mysql.jdbc.Driver");
//创建数据库连接
conn = DriverManager.getConnection(JDBCURL,user,password);
//定义数据库操作SQL语句:查询t_book表所有记录和所有字段
String sql = "SELECT * FROM t_book";
//创建数据库操作申明
stmt = conn.createStatement();
//执行数据库查询,返回结果集
rst = stmt.executeQuery(sql);
Book book = null;
//对结果集进行遍历,
while(rst.next()){
//将每条数据封装成一个新的Book对象,一定要new
book = new Book();
book.setUuid(rst.getInt("id"));
book.setBookName(rst.getString("bookname"));
book.setPicUrl(rst.getString("pic_url"));
book.setPrice(rst.getFloat("price"));
//将Book对象保存到List集合中
books.add(book);
}
} catch (Exception e) {
e.printStackTrace();
}finally{ //一定要使用finally,释放资源
try {
stmt.close(); //关闭申明
conn.close(); //关闭连接
} catch (SQLException e) {
e.printStackTrace();
}
}
//返回结果集
return books;
}
根据id获取某条Book对象:
public Book getById(int id){
Book book = null;
try {
//加载MySQL数据库驱动程序
Class.forName("com.mysql.jdbc.Driver");
//创建数据库连接
conn = DriverManager.getConnection(JDBCURL,user,password);
//定义数据库查询SQL语句:根据id查询t_book表某条记录的所有字段
String sql = "SELECT * FROM t_book WHERE ";
sql += " id=" + id;
System.out.println(sql);
//创建数据库操作申明
stmt = conn.createStatement();
//执行数据库查询,返回结果集
rst = stmt.executeQuery(sql);
while(rst.next()){
book = new Book();
book.setUuid(rst.getInt("id"));
book.setBookName(rst.getString("bookname"));
book.setPicUrl(rst.getString("pic_url"));
book.setPrice(rst.getFloat("price"));
}
} catch (Exception e) {
//程序运行异常处理:显示出错的堆栈信息
e.printStackTrace();
}finally{ //一定要使用finally,释放资源
try {
stmt.close(); //关闭申明
conn.close(); //关闭连接
} catch (SQLException e) {
e.printStackTrace();
}
}
return book;
}
添加与更新:
/**
* 添加Book记录
* @param book
* @return
*/
public int add(Book book){
int result = -1;
try {
//加载MySQL数据库驱动程序
Class.forName("com.mysql.jdbc.Driver");
//创建数据库连接
conn = DriverManager.getConnection(JDBCURL,user,password);
//定义数据库新增语句
String sql = "INSERT INTO t_book(bookname,pic_url,price) VALUES(";
sql += "'" + book.getBookName();
sql += "','" + book.getPicUrl();
sql += "'," + book.getPrice() + ")";
System.out.println(sql);
//创建数据库操作申明
stmt = conn.createStatement();
//执行数据库更新操作,返回影响行数
result = stmt.executeUpdate(sql);
} catch (Exception e) {
e.printStackTrace();
}finally{ //一定要使用finally,释放资源
try {
stmt.close(); //关闭申明
conn.close(); //关闭连接
} catch (SQLException e) {
e.printStackTrace();
}
}
return result;
}
/**
* 根据id更新Book信息
* @param book
* @return
*/
public int update(Book book){
int result = -1;
try {
//加载MySQL数据库驱动程序
Class.forName("com.mysql.jdbc.Driver");
//创建数据库连接
conn = DriverManager.getConnection(JDBCURL,user,password);
//定义数据库更新语句
String sql = "UPDATE t_book SET";
sql += " bookname='" + book.getBookName();
sql += "',pic_url='" + book.getPicUrl();
sql += "',price=" + book.getPrice() + " WHERE ";
sql += " id=" + book.getUuid();
System.out.println(sql);
//创建数据库操作申明
stmt = conn.createStatement();
//执行数据库更新操作,返回影响行数
result = stmt.executeUpdate(sql);
} catch (Exception e) {
e.printStackTrace();
}finally{ //一定要使用finally,释放资源
try {
stmt.close(); //关闭申明
conn.close(); //关闭连接
} catch (SQLException e) {
e.printStackTrace();
}
}
return result;
}
注意:利用SQL注入存在安全问题,建议用预处理。
删除:
/**
* 根据id删除Book对象
* @param bookid
* @return
*/
public int delete(int bookid){
int result = -1;
try {
//加载MySQL数据库驱动程序
Class.forName("com.mysql.jdbc.Driver");
//创建数据库连接
conn = DriverManager.getConnection(JDBCURL,user,password);
//定义数据库删除语句
String sql = "delete from t_book WHERE";
sql += " id=" + bookid;
System.out.println(sql);
//创建数据库操作申明
stmt = conn.createStatement();
//执行数据库更新操作,返回影响行数
result = stmt.executeUpdate(sql);
} catch (Exception e) {
e.printStackTrace();
}finally{ //一定要使用finally,释放资源
try {
stmt.close(); //关闭申明
conn.close(); //关闭连接
} catch (SQLException e) {
e.printStackTrace();
}
}
return result;
}
测试:
/**
* BookDAO方法测试
* @param args
*/
public static void main(String[] args) {
BookDAO bookDao = new BookDAO();
//删除测试
System.out.println("delete:" + bookDao.delete(1));
//查询测试
Book book = bookDao.getById(2);
if(book != null){
System.out.println("book:" + book.toString());
}
//查询集合测试
for(Book book1 : bookDao.getAll()){
System.out.println(book1.toString());
}
}
}