JDBC连接数据库基本操作

JDBC连接数据库基本操作

什么是JDBC

JAVA提供访问数据库的技术

JDBC如何实现可以操作所有数据库?
JDBC提供了统一数据库的操作方式。JDBC是JAVA语言访问数据库的标准技术。提供了一组操作所有数据库的接口

接口

1
2
3
4
5
interface MyInterface{
public void save();
public void delete();
public void update();
}

面向对象中多态
MyInterface obj = new OracleClass();
obj.save();

驱动程序
例如将数据添加到mysql数据库中,必须由mysql提供
class MySqlClass implements MyInterface{
public void save(){
//将数据保存到mysql数据中
}
}
例如将数据添加到oracle数据库中,必须由oracle提供
class OracleClass implements MyInterface{
public void save(){
//将数据保存到oracle数据中
}
}

* 1、JDBC的编码步骤

 1、 加载驱动程序
2、 创建连接
3、 发送SQL INSERT UPDATE DELETE
4、 如果发送的是SELECT语句,处理结果集
5、 释放资源(关闭连接)
  • 项目中业务功能SQL

  • JDBC 技术标准 一组接口 数据库厂商提供驱动程序

  • JDBC工具类

  • CRUD 增删改查

  • 模拟注册和登录,使用Statement,需要SQL与JAVA变量拼接,可能会出现SQL注入

    Statement stmt = conn.createStatement();

2、预处理语句对象

PreparedStatement,预处理语句对象,发送并执行SQL语句,是Statement子接口
优点:
* 避免出现SQL注入现象
* 提升同一条SQL语句多次执行的效率
* 提升项目中SQL语句的可读性
用法:
* SQL
使用?作为变量的占位符
String sql = “SELECT * FROM ajia_user WHERE username=’”+userName+”‘ AND password=’”+password+”‘“;
String sql = “SELECT * FROM ajia_user WHERE username=? AND password=?”;
String sql
= “INSERT INTO ajia_user(id,username,password,email,phone,created,updated) “
+ “VALUES(NULL,?,?,?,?,NOW(),NOW())”;
String sql = “SELECT * FROM ajia_user WHERE id=?”;
String sql = “SELECT * FROM ajia_user”;

* 实例化:   
  PreparedStatement pstmt = conn.prepareStatement(String sql);
* 装载占位符(?)值
  String userName = sc.nextLine();
  String password = sc.nextLine();
  String sql = "SELECT * FROM ajia_user WHERE username=? AND password=?";
  pstmt.setString(1,userName);
  pstmt.setString(2,password);
  pstmt.setDouble(3,sal);
  pstmt.setTimeStamp(4,t);
  pstmt.setDate(5,d);
  pstmt.setObject(6,);
* 执行SQL
  int executeUpdate();执行已经被装载值得SQL语句
  ResultSet executeQuery();

3、JDBC核心API

  • DriverManager,驱动程序管理器
    Connection getConnection(String url,String user,String password);获取连接的方法
    url:jdbc:mysql://ip:3306/tedudb
    jdbc:mysql,主协议,指定调用哪个驱动程序
    //ip:3306/tedudb,自协议,指定数据库服务器的ip,数据库服务器软件的端口号,数据库名
  • Connection,连接对象
    Statement createStatement();
    PreparedStatement prepareStatement(String sql);
  • Statement,语句对象
    int executeUpdate(String sql),执行insert,update,delete语句
    ResultSet executeQuery(String sql);执行select语句
  • PreparedStatement,语句处理语句对象
    void setXxx(int index,Xxx value);装载占位符值
    int executeUpdate(),执行insert,update,delete语句
    ResultSet executeQuery();执行select语句
  • 关闭连接
    conn.close();

4、JDBC事务处理

事务:一组操作的逻辑单元
原子性,一致性,隔离性,持久性(ACID)
删除多条记录,修改多条记录,添加多条记录

Connection接口中:
void setAutoCommit(boolean isAuto);设置自动提交方式,JDBC中默认自动提交
boolean getAutoCommit();获取JDBC自动提交方式
void commit();提交事务
void rollback();回滚事务
需求:使用JDBC事务,处理转账
t_account:id,username,balance
create table t_account(
id int(4) auto_increment primary key,
username varchar(20),
balance double(12,2)
);
insert into t_account values(null,’1001’,100000);
insert into t_account values(null,’1002’,100000);

5、批处理

create table t_log(
id int(8) auto_increment primary key,
title varchar(20),
content varchar(50)
);

6、实体类

ajia_user

  • 一组private属性
  • 一组属性的setter和getter
  • 重写父类equals(),hashCode(),toString()方法
  • 一组构造器
  • 实现SeriaLizable接口

7、DAO的设计

 设计接口 实现类
 接口的作用:
 * 解耦 多层体系结构应用中    视图层 控制层 业务层  持久层
 * 扩展功能
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
interface Hahaha{
public void f();
}

class Aaaaa implements Hahaha{
public void f(){

}//JDBC,MyBatis
}

class B{
public void f1(){
//.....
Hahaha a = 反射获取Aaaaa对象;
a.f();
}
}

JdbcUtil类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
public class JdbcUtil {
protected static Connection conn = null;
private static String className="com.mysql.jdbc.Driver";
private static String url="jdbc:mysql://localhost:3306/students_db?useUnicode=true&characterEncoding=utf-8";
private static String uname="root";
private static String upasswd="root";
/**
* 获取数据库连接对象
* @return
*/
public static Connection getConn() {
try {
Class.forName(className);
conn = DriverManager.getConnection(url, uname, upasswd);
} catch (ClassNotFoundException e) {
System.out.println("找不到驱动程序类 ,加载驱动失败!");
e.printStackTrace() ;
} catch (SQLException e) {
System.out.println("数据库连接失败!");
e.printStackTrace() ;
}
return conn;
}
/**
* 关闭数据库连接
*/
public static void closeConn(Connection conn) {
try {
if (conn!=null)
conn.close();
conn = null; // 置null
} catch (SQLException e) {
System.out.println("连接关闭失败!");
e.printStackTrace();
}
}
//测试
// public static void main(String[] args) {
// Connection conn = getConn();
// System.out.println(conn);
// }
}

2、BaseDao设计
* 增删改方法的设计
* 查询方法的设计
ResultSet:基于连接的结果集
CacheRowSet:基于缓存的结果集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
public class BaseDao {
Connection conn = null;
/**
项目中增删改
* Object...param可变长参数
* 修改方法
*/
public void update(String sql,Object...params) throws SQLException{
Connection conn = null;
try {
conn = JdbcUtil.getConn();
PreparedStatement pstmt = conn.prepareStatement(sql);
if(params!=null){
for(int i=0;i<params.length;i++ ){
pstmt.setObject(i+1, params[i]);
}
}
pstmt.executeUpdate();
} finally{
JdbcUtil.closeConn(conn);
}
}

/**
* 查询方法
*/
public ResultSet find(String sql,Object ...params)throws SQLException{
CachedRowSet crs = null;
try {
conn = JdbcUtil.getConn();
PreparedStatement pstmt = conn.prepareStatement(sql);
if(params!=null){
for(int i=0;i<params.length;i++ ){
pstmt.setObject(i+1, params[i]);
}
}
ResultSet rs = pstmt.executeQuery();
//将基于连接的结果集转存到基于缓存的结果集
crs = new CachedRowSetImpl();
crs.populate(rs);
} finally{
JdbcUtil.closeConn(conn);
}
return crs;
}
/**
* 开启事务
*/
public void beginTrans() {
try {
conn = JdbcUtil.getConn();
conn.setAutoCommit(false); // 关闭自动提交
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 事务的提交
*/
public void commit() {
if (conn != null) {
try {
conn.commit();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 事务的回滚
*/
public void rollback() {
if (conn != null) {
try {
conn.rollback();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}

评论