jdbc使用一

基本概念

  1. JDBC的全称为:java database connection 是用java代码来操作数据库的
  2. Sun公司为了简化、统一对数据库的操作,定义了一套java操作数据库的接口的规范,称之为JDBC。

    使用步骤

  3. 加载驱动类(例如:mysql com.mysql.jdbc.Driver )
  4. 定义url username password
  5. 通过DriverManager 获取连接Connection对象
  6. 通过连接对象创建Statement对象
  7. 使用Statement执行sql语句
  8. 释放资源

    常用类介绍

    都在java.sql 和 javax.sql 包下
    DriverManager : 数据库驱动管理类

Connection: 接口, 建立数据库连接的一个接口。

Statement、PreparedStatement、CallbackStatement: 向数据库发送sql,并且得到数据库的返回信息。

ResultSet: 查询获得的结果集
详细的类描述可以在J2SE 文档查看

代码快速入门

查询-select

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql://47.94.23.210:3306/jdbcdemo";
String username="root";
String pwd="jBrkaTs00b8c";
//获取连接
Connection connection=DriverManager.getConnection(url,username,pwd);
//创建Statement
Statement createStatement = connection.createStatement();
String sql="select * from user";
//获取ResultSet
ResultSet resultSet = createStatement.executeQuery(sql);
while (resultSet.next()) {
System.out.println( resultSet.getString("username"));
}
//释放资源
resultSet.close();
createStatement.close();
connection.close();

Statement 查询调用executeQuery

增删改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql://47.94.23.210:3306/jdbcdemo";
String username="root";
String pwd="jBrkaTs00b8c";
//获取连接
Connection connection=DriverManager.getConnection(url,username,pwd);
//创建Statement
Statement createStatement = connection.createStatement();
String sql = "insert into user(username, password) values('yalunwang','123456')";
//获取ResultSet
int ret = createStatement.executeUpdate(sql);
System.out.println("影响的行数:"+ ret);
//释放资源
createStatement.close();
connection.close();

说明

  1. 查询-select 调用 createStatement.executeQuery(sql); 返回结果集
  2. 增删改调用 createStatement.executeUpdate(sql); 返回受影响的行数

PreparedStatement(预处理)

  1. PreparedStatement是Statement的子接口,它的实例对象可以通过调用Connection.preparedStatement(sql)方法获得
  2. 可以防注入

    查询

1
2
3
4
5
6
7
8
9
10
11
12
13
Class.forName("com.mysql.jdbc.Driver");
// 获得连接
String url = "jdbc:mysql://47.94.23.210:3306/jdbcdemo";
String user = "root";
String password = "jBrkaTs00b8c";
Connection conn = DriverManager.getConnection(url, user, password);
String sql="select * from user where username=?";
PreparedStatement prepareStatement = conn.prepareStatement(sql);
prepareStatement.setString(1, "zhangsan");
ResultSet rs = prepareStatement.executeQuery();
while (rs.next()) {
System.out.println(rs.getString("username"));
}

更新

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Class.forName("com.mysql.jdbc.Driver");
// 获得连接
String url = "jdbc:mysql://47.94.23.210:3306/jdbcdemo";
String user = "root";
String password = "jBrkaTs00b8c";
Connection conn = DriverManager.getConnection(url, user, password);
String sql="insert user (username,password) values (?,?)";
PreparedStatement prepareStatement = conn.prepareStatement(sql);
prepareStatement.setString(1, "xiaoli");
prepareStatement.setString(2, "66666");
int ret = prepareStatement.executeUpdate();
System.out.println(ret);
// 释放资源
prepareStatement.close();
conn.close();

说明

  1. PreperedStatement可以避免SQL注入的问题。
  2. Statement会使数据库频繁编译SQL,可能造成数据库缓冲区溢出。PreparedStatement 可对SQL进行预编译,从而提高数据库的执行效率。
  3. 并且PreperedStatement对于sql中的参数,允许使用占位符的形式进行替换,简化sql语句的编写。可读性变强。

封装成公共类库

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
public class JDBCUtil {
static String driverClass = "";
static String url = "";
static String user = "";
static String password = "";
static {
// 需求: 通过properties对象读取 外部配置的内容
Properties prop = new Properties();
try {
InputStream in = JDBCUtil.class.getClassLoader()
.getResourceAsStream("db.properties");
// 加载外部的配置文件
prop.load(in);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 读取外部配置文件的内容
driverClass = prop.getProperty("driverClass");
url = prop.getProperty("url");
user = prop.getProperty("user");
password = prop.getProperty("password");
// 注册驱动
try {
Class.forName(driverClass);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//获取连接
public static Connection getConnection() throws Exception {
Connection con = DriverManager.getConnection(url, user, password);
return con;
}
// 释放资源
public static void release(Connection conn, Statement stmt, ResultSet rs) {
// 释放资源
try {
if (rs != null) {
rs.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
rs = null;
release(conn, stmt);
}
// 释放资源
public static void release(Connection conn, Statement stmt) {
// 释放资源
try {
if (stmt != null) {
stmt.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
stmt = null;
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
conn = null;
}
}

使用公共类库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public void select() throws Exception
{
Connection conn=null;
PreparedStatement prepareStatement =null;
ResultSet rs=null;
try {
conn= JDBCUtil.getConnection();
String sql="select * from user where username=?";
prepareStatement = conn.prepareStatement(sql);
prepareStatement.setString(1, "zhangsan");
rs= prepareStatement.executeQuery();
while (rs.next()) {
System.out.println(rs.getString("username"));
}
} catch (Exception e) {
e.printStackTrace();
}
finally{
JDBCUtil.release(conn, prepareStatement, rs);
}
}

源码地址

github地址:https://github.com/yalunwang/java-clump