JDBC全称为JAVA Database Connectivity (java数据库连接),是SUN公司提供的一种数据库访问规则、规范, 由于数据库种类较多,并且java语言使用比较广泛,sun公司就提供了一种规范,让其他的数据库提供商去实现底层的访问规则。 我们的java程序只要使用sun公司提供的jdbc驱动即可。
JDBC驱动
- 首先我们需要去下载对应数据库的JDBC驱动,MySQL就是下载MySQL的JDBC驱动,Oracle就下载Oracle的JDBC驱动
新建数据库配置文件xxx.properties
- 在项目根目录下新建xxx.properties文件,这里的信息以key=value的形式书写,我们在连接数据库时就会从这里面读取配置信息;
1
2
3
4
|
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost/student
name=root
password=root
|
新建工具包,抽离出数据库连接语句
- 我们新建一个工具包比如com.chenxiaolani.util,在这下面我们新建一个JDBCUtil.java的文件,内容主要是使用JDBC抽离出数据库连接语句,还有一些释放资源的语句,以便复用;
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
package com.chenxiaolani.uitl;
import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class JDBCUtil {
static String driverClass = null;
static String url = null;
static String name = null;
static String password= null;
static{
try {
//1. 创建一个属性配置对象
Properties properties = new Properties();
//2. 读取数据库连接配置文件
InputStream is = new FileInputStream("jdbc.properties");
//3. 导入输入流。
properties.load(is);
//4. 读取属性
driverClass = properties.getProperty("driverClass");
url = properties.getProperty("url");
name = properties.getProperty("name");
password = properties.getProperty("password");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取连接对象
* @return
*/
public static Connection getConn(){
Connection conn = null;
try {
//1. 这个其实不用写,JDBC源码中已经帮我们注册了一次
Class.forName(driverClass);
//2. 建立连接 参数一: 协议 + 访问的数据库 , 参数二: 用户名 , 参数三: 密码。
conn = DriverManager.getConnection(url, name, password);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
/**
* 释放资源
* @param conn
* @param st
* @param rs
*/
public static void release(Connection conn , Statement st , ResultSet rs){
closeRs(rs);
closeSt(st);
closeConn(conn);
}
public static void release(Connection conn , Statement st){
closeSt(st);
closeConn(conn);
}
private static void closeRs(ResultSet rs){
try {
if(rs != null){
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
rs = null;
}
}
private static void closeSt(Statement st){
try {
if(st != null){
st.close();
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
st = null;
}
}
private static void closeConn(Connection conn){
try {
if(conn != null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
conn = null;
}
}
}
|
DAO模式
- DAO即为(Data Access Object),中文为数据访问对象,DAO模式一般为两个文件,一个是定义方法的接口,一个则是实现这些接口的文件;
- 首先我们新建一个包比如cpm.chenxiaolani.dao, 然后再新建一个dao文件,一般来说一个表就是一个dao文件,比如针对User表新建UserDao.java文件;
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
|
package com.chenxiaolani.dao;
/**
* 定义操作数据库的方法
*/
public interface UserDao {
/**
* 查询所有
*/
void findAll();
/**
* 根据id去更新具体的用户名
* @param id
* @param name
*/
void update(int id , String name);
/**
* 删除
*/
void delete(int id);
/**
* 执行添加
* @param userName
* @param password
*/
void insert(String userName , String password);
}
|
- 我们再新建一个包com.chenxiaolani.dao.impl,此包下的文件来实现接口中的方法,对数据库直接操作
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
package com.chenxiaolani.dao.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.chenxiaolani.dao.UserDao;
import com.chenxiaolani.uitl.JDBCUtil;
public class UserDaoImpl implements UserDao{
@Override
public void findAll() {
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try {
//1. 获取连接对象
conn = JDBCUtil.getConn();
//2. 创建statement对象
st = conn.createStatement();
String sql = "select * from t_user";
rs = st.executeQuery(sql);
while(rs.next()){
String userName = rs.getString("username");
String password = rs.getString("password");
System.out.println(userName+"="+password);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtil.release(conn, st, rs);
}
}
@Override
public void insert(String userName, String password) {
Connection conn = null;
PreparedStatement ps = null;
try {
conn = JDBCUtil.getConn();
String sql = "insert into t_user values(null , ? , ?)";
ps = conn.prepareStatement(sql);
//给占位符赋值 从左到右数过来,1 代表第一个
ps.setString(1, userName);
ps.setString(2, password);
int result = ps.executeUpdate();
if(result>0){
System.out.println("添加成功");
}else{
System.out.println("添加失败");
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
JDBCUtil.release(conn, ps);
}
}
@Override
public void delete(int id) {
Connection conn = null;
PreparedStatement ps = null;
try {
conn = JDBCUtil.getConn();
String sql = "delete from t_user where id = ?";
ps = conn.prepareStatement(sql);
//给占位符赋值 从左到右数过来,1 代表第一个
ps.setInt(1, id);
int result = ps.executeUpdate();
if(result>0){
System.out.println("删除成功");
}else{
System.out.println("删除失败");
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
JDBCUtil.release(conn, ps);
}
}
@Override
public void update(int id, String name) {
Connection conn = null;
PreparedStatement ps = null;
try {
conn = JDBCUtil.getConn();
String sql = "update t_user set username=? where id =?";
ps = conn.prepareStatement(sql);
ps.setString(1, name);
ps.setInt(2, id);
int result = ps.executeUpdate();
if(result>0){
System.out.println("更新成功");
}else{
System.out.println("更新失败");
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
JDBCUtil.release(conn, ps);
}
}
}
|
单元测试
- 首先需要添加junit,eclipse已经内置了,右键build path 中add libraries即可
- 然后我们就可以新建一个测试包专门管理我们写的测试文件比如com.chenxiaolani.test
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
|
package com.chenxiaolani.test;
import org.junit.Test;
import com.chenxiaolani.dao.UserDao;
import com.chenxiaolani.dao.impl.UserDaoImpl;
public class TestUserDaoImpl {
@Test
public void testInsert(){
UserDao dao = new UserDaoImpl();
dao.insert("aobama", "911");
}
@Test
public void testUpdate(){
UserDao dao = new UserDaoImpl();
dao.update(2, "chenxiaolani");
}
@Test
public void testDelete(){
UserDao dao = new UserDaoImpl();
dao.delete(30);
}
@Test
public void testFindAll(){
UserDao dao = new UserDaoImpl();
dao.findAll();
}
}
|