一、jdbc程序的工作原理
JDBC API
提供者:Sun公司内容:供程序员调用的接口与类,集成在java.sql和javax.sql包中,如:
DriverManager类
Connection接口
Statement接口
ResultSet接口
DriverManager
提供者:Sun公司作用:管理各种不同的JDBC驱动
JDBC 驱动
提供者:数据库厂商作用:负责连接各种不同的数据库
DBC API可做三件事:与数据库建立连接、执行SQL 语句、处理结果
DriverManager :依据数据库的不同,管理JDBC驱动
Connection :负责连接数据库并担任传送数据的任务
Statement :由 Connection 产生、负责执行SQL语句
ResultSet:负责保存Statement执行后所产生的查询结果
二、jdbc的优缺点
由JDBC驱动直接访问数据库
优点:100% Java,快又可跨平台
缺点:访问不同的数据库需要下载专用的JDBC驱动
优点:100% Java,快又可跨平台
缺点:访问不同的数据库需要下载专用的JDBC驱动
三、jdbc的工作模板
try {
Class.forName(JDBC驱动类);
} catch (ClassNotFoundException e) {
System.out.println("无法找到驱动类");
}
try {
Connection con=DriverManager.getConnection(JDBC URL,数据库用户名,密码);//连接数据库至少需要这三个信息
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1");
while (rs.next()) {
int x = rs.getInt("a");
String s = rs.getString("b");
float f = rs.getFloat("c");
}
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
1.核心类
DriverManager:管理驱动
Connection:代表连接
PreparedSatement/Satement:代表一次执行上下文
PreparedSatement用于执行带占位符?的sql
ResultSet:结果集
2.结果集的返回与处理
用对象传递数据
单个记录用对象返回
多个记录用集合返回
3.PreparedStatement接口
PreparedStatement接口继承于Statement,提供了基于占位符的操作
防止sql注入,更安全
效率更高,可读性好
提供了SetXxxx设置?占位符的方法
防止sql注入,更安全
效率更高,可读性好
提供了SetXxxx设置?占位符的方法
4.结果集
获得查询的结果
提供了getXxxx方法从结果集中获得数据
注意数据库类型和java类型的转换,选取合适的类型
可以设置成只能向前、可以滚动的等
可以用结果集滚动实现分页
结果集可以直接更新(删除或者修改)
insertRow
updateRow
deleteRow
可更新的结果集必须在获得上下文的时候加上相关参数
不是所有的数据库驱动都支持
提供了getXxxx方法从结果集中获得数据
注意数据库类型和java类型的转换,选取合适的类型
可以设置成只能向前、可以滚动的等
可以用结果集滚动实现分页
结果集可以直接更新(删除或者修改)
insertRow
updateRow
deleteRow
可更新的结果集必须在获得上下文的时候加上相关参数
不是所有的数据库驱动都支持
5.行集
ResultSet如果更新数据,必须保证链接不能关闭,性能影响很大
为了更有效的利用连接,jdbc api提供了操纵查询结果的行集接口:javax.sql.RowSet
子接口CachedRowSet无需始终保留连接
sun建议数据库厂商实现相关的接口;并提供了默认的实现
数据发生变化,调用accpetChanges方法
为了更有效的利用连接,jdbc api提供了操纵查询结果的行集接口:javax.sql.RowSet
子接口CachedRowSet无需始终保留连接
sun建议数据库厂商实现相关的接口;并提供了默认的实现
数据发生变化,调用accpetChanges方法
不是所有的行集都可以更新
必须查询一张表,并且查询包括主键
必要是需要设置表名(setTableName方法)
populate用于从ResultSet填充RowSet
accpetChanges可能会抛出SyncProviderException,主要是并发修改的情况
必须查询一张表,并且查询包括主键
必要是需要设置表名(setTableName方法)
populate用于从ResultSet填充RowSet
accpetChanges可能会抛出SyncProviderException,主要是并发修改的情况
四、jdbc分页的实现
依据具体的数据库处理方式
Oracle:rownum
Mysql:limit
利用结果集的特性
Oracle:rownum
Mysql:limit
利用结果集的特性
五、jdbc的更新
除了查询,其他的增、删、改操作都不需要ResultSet
Statement对象的executeUpdate方法用于查询以外的操作,返回更新的行数
jdbc自动的是隐式事务,每次Sql都提交事务,如果需要事务,必须
关闭事务的自动提交特性
操作完成后手动提交或者回滚事务
操作必须在一个Connection内完成。
Statement对象的executeUpdate方法用于查询以外的操作,返回更新的行数
jdbc自动的是隐式事务,每次Sql都提交事务,如果需要事务,必须
关闭事务的自动提交特性
操作完成后手动提交或者回滚事务
操作必须在一个Connection内完成。
六、使用实例
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class DbUtil {
public static final String URL = "jdbc:mysql://localhost:3306/imooc";
public static final String USER = "liulx";
public static final String PASSWORD = "123456";
public static void main(String[] args) throws Exception {
//1.加载驱动程序
Class.forName("com.mysql.jdbc.Driver");
//2. 获得数据库连接
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
//3.操作数据库,实现增删改查
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT user_name, age FROM imooc_goddess");
//如果有数据,rs.next()返回true
while(rs.next()){
System.out.println(rs.getString("user_name")+" 年龄:"+rs.getInt("age"));
}
}
}
public class DbUtil {
public static final String URL = "jdbc:mysql://localhost:3306/imooc";
public static final String USER = "liulx";
public static final String PASSWORD = "123456";
private static Connection conn = null;
static{
try {
//1.加载驱动程序
Class.forName("com.mysql.jdbc.Driver");
//2. 获得数据库连接
conn = DriverManager.getConnection(URL, USER, PASSWORD);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static Connection getConnection(){
return conn;
}
}
//模型
package liulx.model;
import java.util.Date;
public class Goddess {
private Integer id;
private String user_name;
private Integer sex;
private Integer age;
private Date birthday; //注意用的是java.util.Date
private String email;
private String mobile;
private String create_user;
private String update_user;
private Date create_date;
private Date update_date;
private Integer isDel;
//getter setter方法。。。
}
//---------dao层--------------
package liulx.dao;
import liulx.db.DbUtil;
import liulx.model.Goddess;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
public class GoddessDao {
//增加
public void addGoddess(Goddess g) throws SQLException {
//获取连接
Connection conn = DbUtil.getConnection();
//sql
String sql = "INSERT INTO imooc_goddess(user_name, sex, age, birthday, email, mobile,"+
"create_user, create_date, update_user, update_date, isdel)"
+"values("+"?,?,?,?,?,?,?,CURRENT_DATE(),?,CURRENT_DATE(),?)";
//预编译
PreparedStatement ptmt = conn.prepareStatement(sql); //预编译SQL,减少sql执行
//传参
ptmt.setString(1, g.getUser_name());
ptmt.setInt(2, g.getSex());
ptmt.setInt(3, g.getAge());
ptmt.setDate(4, new Date(g.getBirthday().getTime()));
ptmt.setString(5, g.getEmail());
ptmt.setString(6, g.getMobile());
ptmt.setString(7, g.getCreate_user());
ptmt.setString(8, g.getUpdate_user());
ptmt.setInt(9, g.getIsDel());
//执行
ptmt.execute();
}
public void updateGoddess(){
//获取连接
Connection conn = DbUtil.getConnection();
//sql, 每行加空格
String sql = "UPDATE imooc_goddess" +
" set user_name=?, sex=?, age=?, birthday=?, email=?, mobile=?,"+
" update_user=?, update_date=CURRENT_DATE(), isdel=? "+
" where id=?";
//预编译
PreparedStatement ptmt = conn.prepareStatement(sql); //预编译SQL,减少sql执行
//传参
ptmt.setString(1, g.getUser_name());
ptmt.setInt(2, g.getSex());
ptmt.setInt(3, g.getAge());
ptmt.setDate(4, new Date(g.getBirthday().getTime()));
ptmt.setString(5, g.getEmail());
ptmt.setString(6, g.getMobile());
ptmt.setString(7, g.getUpdate_user());
ptmt.setInt(8, g.getIsDel());
ptmt.setInt(9, g.getId());
//执行
ptmt.execute();
}
public void delGoddess(){
//获取连接
Connection conn = DbUtil.getConnection();
//sql, 每行加空格
String sql = "delete from imooc_goddess where id=?";
//预编译SQL,减少sql执行
PreparedStatement ptmt = conn.prepareStatement(sql);
//传参
ptmt.setInt(1, id);
//执行
ptmt.execute();
}
public List<Goddess> query() throws SQLException {
Connection conn = DbUtil.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT user_name, age FROM imooc_goddess");
List<Goddess> gs = new ArrayList<Goddess>();
Goddess g = null;
while(rs.next()){
g = new Goddess();
g.setUser_name(rs.getString("user_name"));
g.setAge(rs.getInt("age"));
gs.add(g);
}
return gs;
}
public Goddess get(){
Goddess g = null;
//获取连接
Connection conn = DbUtil.getConnection();
//sql, 每行加空格
String sql = "select * from imooc_goddess where id=?";
//预编译SQL,减少sql执行
PreparedStatement ptmt = conn.prepareStatement(sql);
//传参
ptmt.setInt(1, id);
//执行
ResultSet rs = ptmt.executeQuery();
while(rs.next()){
g = new Goddess();
g.setId(rs.getInt("id"));
g.setUser_name(rs.getString("user_name"));
g.setAge(rs.getInt("age"));
g.setSex(rs.getInt("sex"));
g.setBirthday(rs.getDate("birthday"));
g.setEmail(rs.getString("email"));
g.setMobile(rs.getString("mobile"));
g.setCreate_date(rs.getDate("create_date"));
g.setCreate_user(rs.getString("create_user"));
g.setUpdate_date(rs.getDate("update_date"));
g.setUpdate_user(rs.getString("update_user"));
g.setIsDel(rs.getInt("isdel"));
}
return g;
}
}