在 JavaWeb 中使用 JDBC 进行相关数据的操作。

在这里只是讲一下简单的应用,不涉及 MVC 模式。

① 利用 c3p0 数据库连接池获取数据库连接。

② 利用 dbutils 工具类操作数据库。

③ 利用 beanutils 工具类操作 JavaBean。

1.下载相关包

当然,你可以自己到相应的官网下载。

这里也提供全套的 jar 包下载,百度云链接: https://pan.baidu.com/s/1aSDHhDx5T3Y1-FUxYvpncA&shfl=shareset 提取码: ncv7。失效请联系博主。

其中 Codec 包是用来进行特殊编码和解码的。

2.在JavaWeb中简单使用 JDBC

  • ①在 Ecplise 中创建一个动态的 Web 工程
  • ②在 Web 根目录下的 WEB-INF/lib 目录下,导入下载好的 jar 包。
  • ③在 src 目录下新建包,存放相应的 java 文件,当然,都放在一个包里也可以。如下图:

下面用到的 src,下载地址:链接: https://pan.baidu.com/s/1MHoMuvXXb0Fx_ehlWVE87g&shfl=shareset 提取码: sv8y。失效请联系博主。

下载后解压后,别忘记了 先将下载要用的 jar 包导入 lib,再修改你的 c3p0-config.xml 配置文件:修改的你数据库 jdbcUrl、用户名、密码。

期间用到的数据库表为 user,字段为:userId(int)、userName(varchar)、password(vrachar)、age(int)、address(varchar)、email(varchar)。

之后以 Java Application 形式运行 UserDAOJDBCImplTest.java 文件测试即可。

JDBC_2_01

相关介绍:

  • dao包---------Data Access Object 接口类
  • domain包---------存放JavaBean
  • impl包---------存放DAO的实现类
  • servlet包---------存放用到的servlet
  • test包---------junit测试包
  • utils包---------工具类
  • c3p0-config.xml---------c3p0配置信息

在JavaWeb中简单使用中,我们先把所有的类文件放在一个包里。


例子:使用c3p0数据库连接池,获取 MySQL 数据库连接,之后利用 DButils 操作数据库,查询数据库记录并返回对应的 JavaBean 对象,或数据库的查询结果、更新数据库记录。数据库的一张 user 表如下:

在这里建议,开发 Java 项目的话,数据表字段名建议用 小驼峰命名法 命名。

user_id user_name password age address email
1 root root 10 山东临沂 root @crainyday.com
2 admin admin 20 山东济南 admin @crainyday.com
3 user user 30 山东泰安 user @crainyday.com

修改数据表字段名:

userId userName password age address email
1 root root 10 山东临沂 root @crainyday.com
2 admin admin 20 山东济南 admin @crainyday.com
3 user user 30 山东泰安 user @crainyday.com

分文件介绍:

A.创建表对应的 JavaBean

JavaBean 属性与 user 表一一对应,属性名用小驼峰命名法,setter和getter用大驼峰命名。

为了方便编程,可以将数据库表的字段名也用 小驼峰命名法,这样的话,写对该表操作的 SQL 语句时方便很多。

例如:对同一种查询,数据库字段用下划线命名法命名的话,要这样写:“SELECT user_id as userId,user_name as userName,password,age,address,email FROM user WHERE user_name = ?”。

数据库字段用小驼峰命名法命名的话,就可以这样写:“SELECT * FROM user WHERE userName = ?”。

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
package com.crainyday.web;
/**
* 用户Bean
* @author crainyday
*
*/
public class User {
private int userId;
private String userName;
private String password;
private int age;
private String address;
private String email;
public User() {
super();
}
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "User [userId=" + userId + ", userName=" + userName + ", password=" + password + ", age=" + age
+ ", address=" + address + ", email=" + email + "]";
}
}

B.JDBCUtils工具类

利用 c3p0 连接池获取数据源,下面只是初步的工具类,不涉及事务操作。

注意:需要在 src 目录下有 c3p0-config.xml 文件,JDBCUtils.java 中的数据源名为:c3p0-config.xml文件中的named-config标签中的 name 属性值。

c3p0-config.xml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="utf-8"?>
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/design?useSSL=false&amp;serverTimezone=GMT%2B8&amp;useUnicode=true&amp;characterEncoding=UTF-8</property>
<property name="user">root</property>
<property name="password">root</property>

<property name="initialPoolSize">5</property>
<property name="maxPoolSize">10</property>
</default-config>

<named-config name="web">
</named-config>
</c3p0-config>

JDBCUtils.java:

One More Thing 👇
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
package com.crainyday.web;

import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

/**
* JDBC 操作工具类
* 1. 获取数据库连接
* 2. 释放数据库连接
* @author crainyday
*
*/
public class JDBCUtils {
// 注意数据源只创建一次即可, 需要在静态代码块里初始化
private static DataSource ds = null;
static {
// 这里的数据源名为:c3p0-config.xml文件中的named-config标签中的 name 属性值。
ds = new ComboPooledDataSource("web");
}
/**
* 释放一个 connection 连接
* @param connection
*/
public static void release(Connection connection) {
try {
if(connection != null) {
connection.close();
}
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
/**
* 返回数据源的一个 connection 连接对象
* @return
* @throws SQLException
*/
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
}

C.最基础DAO

封装了基本的 CRUD (增加Create、读取Read、更新Update和删除Delete)的方法, 以供子类继承使用。

这里的 DAO 无事务操作,故直接在方法中利用 JDBCUtils 获取数据库连接。

采用 DBUilts 操作数据库。

返回查询到的某一条记录对应的 JavaBean 对象,或返回查询的某些记录对应的 JavaBean 对象的 List 对象,或返回查询结果的数值。

DAO.java:

One More Thing 👇
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
109
110
111
112
113
114
115
116
package com.crainyday.web;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.Connection;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
/**
*
* @author crainyday
* 封装了基本的 CRUD 的方法, 以供子类继承使用
* 当前 DAO 无事务操作,直接在方法中获取数据库连接
* 整个 DAO 采用 DBUtils 方案解决
* @param <T>: 当前 DAO 操作的实体类型
*/

public class DAO<T> {
// QueryRunner 是线程安全的
private QueryRunner qr = new QueryRunner();
private Class<T> clazz;
/**
* DAO 构造函数: 利用反射确定当前 DAO 操作的实体类型 clazz
*/
@SuppressWarnings("unchecked")
public DAO() {
Type superClass = getClass().getGenericSuperclass();
if(superClass instanceof ParameterizedType) {
ParameterizedType parameterizedType = (ParameterizedType) superClass;
Type [] typeArgs = parameterizedType.getActualTypeArguments();
if(typeArgs != null && typeArgs.length > 0) {
if(typeArgs[0] instanceof Class) {
clazz = (Class<T>) typeArgs[0];
}
}
}
}
/**
* 返回某一个字段的值 或 数据表中符合条件的记录数
* @param sql
* @param args
* @return
*/
public <E> E getForValue(String sql, Object ...args) {
Connection connection = null;
try {
connection = JDBCUtils.getConnection();
return (E) qr.query(connection, sql, new ScalarHandler<E>(), args);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally {
JDBCUtils.release(connection);
}
return null;
}

/**
* 返回 T 所对应的 List
* @param sql
* @param args
* @return
*/
public List<T> getForList(String sql, Object ...args){
Connection connection = null;
try {
connection = JDBCUtils.getConnection();
return qr.query(connection, sql, new BeanListHandler<>(clazz), args);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally {
JDBCUtils.release(connection);
}
return null;
}
/**
* 返回 T 所对应的一个实体类的对象
* @param sql
* @param args
* @return
*/
public T get(String sql, Object ...args) {
Connection connection = null;
try {
connection = JDBCUtils.getConnection();
return qr.query(connection, sql, new BeanHandler<>(clazz), args);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally {
JDBCUtils.release(connection);
}
return null;
}

/**
* 该方法封装了 INSERT DELETE UPDATE 操作.
* @param sql sql 语句
* @param args
*/
public void update(String sql, Object ... args) {
Connection connection = null;
try {
connection = JDBCUtils.getConnection();
qr.update(connection, sql, args);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally {
JDBCUtils.release(connection);
}
}
}

D.UserDAO

描述了一些与 User JavaBean 相关的 操作接口,以供子类 implements

就是这个 User Bean 可以用来干什么,只是描述一下它的功能。

UserDAO.java:

One More Thing 👇
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.crainyday.web;
/**
* UserBean 操作接口
* @author crainyday
*
*/
public interface UserDAO {
/**
* 用户注册
* @param user
*/
public void register(User user);
/**
* 用户登录
* @param username
* @param password
* @return
*/
public User login(String username, String password);
/**
* 返回和 username 相等的记录条数
* @param username
* @return
*/
public long getUsernameCount(String username);
/**
* 返回和 email 相等的记录条数
* @param email
* @return
*/
public long getEmailCount(String email);
}

E.UserDAOJDBCImpl

继承自 基础的 DAO,实现了 功能接口 DAO。

User 数据访问对象 JDBC 的实现

通过基础 DAO 操作数据库:用户登陆,用户注册,查询用户信息

UserDAOJDBCImpl.java:

One More Thing 👇
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
package com.crainyday.web;

/**
* User 数据访问对象 JDBC 的实现
* 操作数据库:用户登陆,用户注册,查询用户
* @author crainyday
*
*/

public class UserDAOJDBCImpl extends DAO<User> implements UserDAO {
@Override
public void register(User user) {
String sql = "INSERT INTO user VALUES(?,?,?,?,?,?)";
update(sql, user.getUserId(),user.getUserName(), user.getPassword(), user.getAge(), user.getAddress(), user.getEmail());
}
@Override
public User login(String username, String password) {
String sql = "SELECT * FROM user WHERE userName = ?";
return get(sql, username);
}
@Override
public long getUsernameCount(String username) {
String sql = "SELECT count(userId) FROM user WHERE userName = ?";
return getForValue(sql, username);
}
@Override
public long getEmailCount(String email) {
String sql = "SELECT count(userId) FROM user WHERE email = ?";
return getForValue(sql, email);
}
}

F.UserDAOJDBCImplTest

测试写好的数据操作、对象功能是否正确。也可以用 junits 测试,为了共用,这里用了基本的方法。

UserDAOJDBCImplTest.java:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.crainyday.web;


public class UserDAOJDBCImplTest {
public static void main(String[] args) {
UserDAO dao = new UserDAOJDBCImpl();
String username = "root";
String password = "root";
User user = dao.login(username, password);
User registerUser = new User();
registerUser.setUserId(2);
registerUser.setUserName("admin");
registerUser.setPassword("admin");
registerUser.setAge(12);
registerUser.setAddress("山东济南");
registerUser.setEmail("admin@crainyday.com");
dao.register(registerUser);
System.out.println(user);
}
}

评论