新建项目
首先,新建项目如下:
![](https://img-blog.csdnimg.cn/acc3565f7d8845d3978cbe801384b978.png#pic_center)
导入jar包
新建lib目录,导入jar包
- mysql-connector-java-5.1.37-bin.jar 是mysql数据库驱动,用于操作mysql数据库
- druid-1.1.10.jar 德鲁伊数据库连接池,用于连接数据库
- commons-dbutils-1.3.jar commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装。
![](https://img-blog.csdnimg.cn/ecf853d6c487464fb9e2ee8768795cfa.png#pic_center)
还需要添加到路径才能使用
![](https://img-blog.csdnimg.cn/084295a7e82d4c4d8efffdda2a6174fe.png#pic_center)
添加路径完成
![](https://img-blog.csdnimg.cn/4f423b1df1444b07a5d8c69356008439.png#pic_center)
具体代码
分成3个包
- util:JDBCUtils包含数据库的连接和关闭
- bean:实体类
- dao:数据库的操作
![](https://img-blog.csdnimg.cn/d4e9ee00ec3a448fb7d67dd9ba91524f.png#pic_center)
util包
![](https://img-blog.csdnimg.cn/0de554cf288f4f6cbc562f988afb6eb9.png#pic_center)
JDBCUtils.java
可直接复用
package com.jdbcTest.util;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import org.apache.commons.dbutils.DbUtils;
import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**
* @author zj
* @date 2022/6/2 12:51
*/
public class JBDCUtils {
/**
* 获取数据库的连接
* 使用Druid数据库连接池技术
*/
private static DataSource source;
static{
try {
Properties pros = new Properties();
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("druid.properties");
pros.load(is);
source = DruidDataSourceFactory.createDataSource(pros);
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection() throws SQLException {
Connection conn = source.getConnection();
return conn;
}
/**
* 关闭数据库资源
*使用dbutils.jar中提供的DbUtils工具类,实现资源的关闭
*/
public static void closeResource(Connection conn, Statement ps, ResultSet rs){
DbUtils.closeQuietly(conn);
DbUtils.closeQuietly(ps);
DbUtils.closeQuietly(rs);
}
public static void closeResource(Connection conn){
DbUtils.closeQuietly(conn);
}
}
数据库连接配置文件
![](https://img-blog.csdnimg.cn/f18829c06c27496aa5fa2f96c4e594a7.png#pic_center)
druid.properties
url=jdbc:mysql://localhost:3306/test
username=root
password=root
driverClassName=com.mysql.jdbc.Driver
bean包
以User表为例
![](https://img-blog.csdnimg.cn/d49e1ea2e724498494deb330d36c478e.png#pic_center)
项目结构
![](https://img-blog.csdnimg.cn/3911e797bec04d5891297055cb520342.png#pic_center)
User.java
package com.jdbcTest.bean;
/**
* @author zj
* @date 2022/6/2 12:54
*/
public class User {
int id;
String name;
String password;
String address;
String phone;
public User() {
}
public User(int id, String name, String password, String address, String phone) {
this.id = id;
this.name = name;
this.password = password;
this.address = address;
this.phone = phone;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", password='" + password + '\'' +
", address='" + address + '\'' +
", phone='" + phone + '\'' +
'}';
}
}
dao包
项目结构
![](https://img-blog.csdnimg.cn/8da91c617d434b7cae9a0b00a99ce257.png#pic_center)
BaseDAO.java
可复用
定义一个用来被继承的对数据库进行基本操作的Dao
package com.jdbcTest.dao;
/**
* @author zj
* @date 2022/6/2 12:57
*/
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.Connection;
import java.sql.SQLException;
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;
/**
* 定义一个用来被继承的对数据库进行基本操作的Dao
*
* @author HanYanBing
*
* @param <T>
*/
public abstract class BaseDAO<T> {
private QueryRunner queryRunner = new QueryRunner();
// 定义一个变量来接收泛型的类型
private Class<T> type;
// 获取T的Class对象,获取泛型的类型,泛型是在被子类继承时才确定
public BaseDAO() {
// 获取子类的类型
Class clazz = this.getClass();
// 获取父类的类型
// getGenericSuperclass()用来获取当前类的父类的类型
// ParameterizedType表示的是带泛型的类型
ParameterizedType parameterizedType = (ParameterizedType) clazz.getGenericSuperclass();
// 获取具体的泛型类型 getActualTypeArguments获取具体的泛型的类型
// 这个方法会返回一个Type的数组
Type[] types = parameterizedType.getActualTypeArguments();
// 获取具体的泛型的类型·
this.type = (Class<T>) types[0];
}
/**
* 通用的增删改操作
*
* @param sql
* @param params
* @return
*/
public int update(Connection conn, String sql, Object... params) {
int count = 0;
try {
count = queryRunner.update(conn, sql, params);
} catch (SQLException e) {
e.printStackTrace();
}
return count;
}
/**
* 获取一个对象
*
* @param sql
* @param params
* @return
*/
public T getBean(Connection conn,String sql, Object... params) {
T t = null;
try {
t = queryRunner.query(conn, sql, new BeanHandler<T>(type), params);
} catch (SQLException e) {
e.printStackTrace();
}
return t;
}
/**
* 获取所有对象
*
* @param sql
* @param params
* @return
*/
public List<T> getBeanList(Connection conn, String sql, Object... params) {
List<T> list = null;
try {
list = queryRunner.query(conn, sql, new BeanListHandler<T>(type), params);
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
/**
* 获取一个值的方法,专门用来执行像 select count(*)...这样的sql语句
*
* @param sql
* @param params
* @return
*/
public Object getValue(Connection conn,String sql, Object... params) {
Object count = null;
try {
// 调用queryRunner的query方法获取一个单一的值
count = queryRunner.query(conn, sql, new ScalarHandler(), params);
} catch (SQLException e) {
e.printStackTrace();
}
return count;
}
}
UserDAO和UserDAOImpl成对出现
UserDAO.java
接口
package com.jdbcTest.dao;
import com.jdbcTest.bean.User;
import java.sql.Connection;
import java.util.List;
/**
* @author zj
* @date 2022/6/2 12:59
*/
public interface UserDAO {
/**
* @param conn
* @param user
* @Description 将user对象添加到数据库中
* @author shkstart
* @date 上午11:00:27
*/
void insert(Connection conn, User user);
/**
* @param conn
* @param id
* @Description 针对指定的id,删除表中的一条记录
* @author shkstart
* @date 上午11:01:07
*/
void deleteById(Connection conn, int id);
/**
* @param conn
* @param user
* @Description 针对内存中的user对象,去修改数据表中指定的记录
* @author shkstart
* @date 上午11:02:14
*/
void update(Connection conn, User user);
/**
* @param conn
* @param id
* @Description 针对指定的id查询得到对应的User对象
* @author shkstart
* @date 上午11:02:59
*/
User getUserById(Connection conn, int id);
/**
* @param conn
* @return
* @Description 查询表中的所有记录构成的集合
* @author shkstart
* @date 上午11:03:50
*/
List<User> getAll(Connection conn);
/**
* @param conn
* @return
* @Description 返回数据表中的数据的条目数
* @author shkstart
* @date 上午11:04:44
*/
Long getCount(Connection conn);
}
UserDAOImpl.java
与数据库交互的具体实现,在这里写sql语句
package com.jdbcTest.dao;
import com.jdbcTest.bean.User;
import java.sql.Connection;
import java.util.List;
/**
* @author zj
* @date 2022/6/2 13:01
*/
public class UserDAOImpl extends BaseDAO<User> implements UserDAO {
@Override
public void insert(Connection conn, User user) {
String sql = "insert into user(name,password,address,phone) values (?,?,?,?)";
update(conn, sql, user.getName(), user.getPassword(), user.getAddress(), user.getPhone());
}
@Override
public void deleteById(Connection conn, int id) {
String sql = "delete from user where id = ?";
update(conn, sql, id);
}
@Override
public void update(Connection conn, User user) {
String sql = "update user set name = ?, password = ?, address = ?, phone = ? where id = ?";
update(conn, sql, user.getName(), user.getPassword(), user.getAddress(), user.getPhone(), user.getId());
}
@Override
public User getUserById(Connection conn, int id) {
String sql = "select id,name,password,address,phone from user where id = ?";
User user = getBean(conn, sql, id);
return user;
}
@Override
public List<User> getAll(Connection conn) {
String sql = "select id,name,password,address,phone from user";
List<User> all = getBeanList(conn, sql);
return all;
}
@Override
public Long getCount(Connection conn) {
String sql = "select count(*) from user";
Long value = (Long) getValue(conn, sql);
return value;
}
}
测试
原User表数据
![](https://img-blog.csdnimg.cn/240c36a2e77e437b8aa1185d2f5660e2.png#pic_center)
测试插入
@Test
public void testInsertUser() {
Connection conn = null;
try {
conn = JDBCUtils.getConnection();
userDAO.insert(conn, new User(0, "小红", "123456", "安徽", "13345672134"));
} catch(SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResource(conn);
}
}
![](https://img-blog.csdnimg.cn/2451fc7dce424bafa4657f10e5979c0a.png#pic_center)
测试删除
@Test
public void testDeleteUser() {
Connection conn = null;
try {
conn = JDBCUtils.getConnection();
userDAO.deleteById(conn, 8);
} catch(SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResource(conn);
}
}
![](https://img-blog.csdnimg.cn/224776045f594f1787544aa678ccccca.png#pic_center)
测试修改
@Test
public void testUpdateUser() {
Connection conn = null;
try {
conn = JDBCUtils.getConnection();
userDAO.update(conn, new User(1, "小绿", "123456", "安徽", "13345672134"));
} catch(SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResource(conn);
}
}
![](https://img-blog.csdnimg.cn/8e799721b5bc4385b258913f5ce8d143.png#pic_center)
测试查询一条记录
@Test
public void testSelect() {
Connection conn = null;
try {
conn = JDBCUtils.getConnection();
User user = userDAO.getUserById(conn, 3);
System.out.println("user = " + user);
} catch(SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResource(conn);
}
}
![](https://img-blog.csdnimg.cn/3e88350cad9549f78104bc7083333f06.png#pic_center)
测试查询多条记录
@Test
public void testSelectAll() {
Connection conn = null;
try {
conn = JDBCUtils.getConnection();
List<User> all = userDAO.getAll(conn);
all.forEach(System.out::println);
} catch(SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResource(conn);
}
}
![](https://img-blog.csdnimg.cn/e05a8aaa541b4e5ab806e7df19ec3a64.png#pic_center)
测试查询特殊值
@Test
public void testCount() {
Connection conn = null;
try {
conn = JDBCUtils.getConnection();
Long count = userDAO.getCount(conn);
System.out.println("count = " + count);
} catch(SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResource(conn);
}
}
![](https://img-blog.csdnimg.cn/74a0204f5972401690f986bc64b110b9.png#pic_center)
完整测试代码
MyTest.java
package com.jdbcTest;
import com.jdbcTest.bean.User;
import com.jdbcTest.dao.UserDAOImpl;
import com.jdbcTest.util.JDBCUtils;
import org.testng.annotations.Test;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
/**
* @author zj
* @date 2022/6/2 13:04
*/
public class MyTest {
UserDAOImpl userDAO = new UserDAOImpl();
@Test
public void testInsertUser() {
Connection conn = null;
try {
conn = JDBCUtils.getConnection();
userDAO.insert(conn, new User(0, "小红", "123456", "安徽", "13345672134"));
} catch(SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResource(conn);
}
}
@Test
public void testDeleteUser() {
Connection conn = null;
try {
conn = JDBCUtils.getConnection();
userDAO.deleteById(conn, 8);
} catch(SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResource(conn);
}
}
@Test
public void testUpdateUser() {
Connection conn = null;
try {
conn = JDBCUtils.getConnection();
userDAO.update(conn, new User(1, "小绿", "123456", "安徽", "13345672134"));
} catch(SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResource(conn);
}
}
@Test
public void testSelect() {
Connection conn = null;
try {
conn = JDBCUtils.getConnection();
User user = userDAO.getUserById(conn, 3);
System.out.println("user = " + user);
} catch(SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResource(conn);
}
}
@Test
public void testSelectAll() {
Connection conn = null;
try {
conn = JDBCUtils.getConnection();
List<User> all = userDAO.getAll(conn);
all.forEach(System.out::println);
} catch(SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResource(conn);
}
}
@Test
public void testCount() {
Connection conn = null;
try {
conn = JDBCUtils.getConnection();
Long count = userDAO.getCount(conn);
System.out.println("count = " + count);
} catch(SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResource(conn);
}
}
}
总结
完整项目结构
![](https://img-blog.csdnimg.cn/205524ae4f624ed0af6953f659861abe.png#pic_center)
只需要按需要查询的表,增加以上圈出的3个java文件即可实现对数据库表的操作。
改进:实现多表连接查询和嵌套查询。