版权声明:《==study hard and make progress every day==》 https://blog.csdn.net/qq_38225558/article/details/82864098
====================~若有需要项目资源的朋友们可以在文章结尾处下载哦~=====================
项目结构层次图:
数据库名:zhengqing_test 表t_user :
用户账号实体类 User.java
/**
* 用户账号实体类
* @author 郑清
*/
public class User {
private int id;
private String username;
private String password;
public User() {}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", password=" + password + "]";
}
}
工具类 JDBCUtil.java
/**
* 工具类:
* 抽取公共部分,做单例模式
* DBCP方式实现连接池、配置连接池 ==> 获得连接对象
* @author 郑清
*/
public enum JDBCUtil {
instance;//枚举对象
private static Properties p = new Properties();
// private static BasicDataSource ds = new BasicDataSource();//获得连接池对象 方式1
private static DataSource ds = null;//获取连接池对象 方式2
//加载驱动
static {//当用到该工具类的时候,会自动加载驱动
try {
//读取配置文件db.properties
p.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties"));
//加载驱动
/*
//获得连接池对象 方式1
ds.setDriverClassName(p.getProperty("driverClassName"));
ds.setUsername(p.getProperty("username"));
ds.setPassword(p.getProperty("password"));
ds.setUrl(p.getProperty("url"));
*/
//连接池可以配置,初始化的连接数量,最大连接数量,最小连接数量等等
//获取连接池对象 方式2 [注意:配置文件(db.properties)里 驱动,url 数据库用户名、密码 必须规范!!]
ds = BasicDataSourceFactory.createDataSource(p);
} catch (Exception e) {
e.printStackTrace();
}
}
//获取连接:与数据库建立连接
public Connection getConnection(){//没有static:应该通过对象(枚举对象instance)调用该方法
try {
return ds.getConnection();//通过连接池对象ds获取连接
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
//释放资源 (注意:关闭资源顺序 先打开后关闭)
public void close(Connection connection,Statement statement,ResultSet rs){
try {
if(rs!=null)rs.close();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}finally{
try {
if(statement!=null)statement.close();
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
if(connection!=null)connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
接口类 IUserDao.java
/**
* 接口类
* @author 郑清
*/
public interface IUserDao {
void add(User user);
void delete(int id);
void update(User user);
User queryOne(int id);
List<User> queryAll();
}
实现增删改查功能 UserDaoImpl.java
/**
* 实现接口IUserDao
* 使用预编译对象 PreparedStatement完成增删改查,特点:创建 PreparedStatement对象时,就指定了sql语句发送到dbms进行编译
* @author 郑清
*/
public class UserDaoImpl implements IUserDao {
@Override
public void add(User user) {
// TODO Auto-generated method stub
Connection connection = null;
PreparedStatement ps = null;
try {
//1.加载驱动
//2.获取连接:与数据库建立连接
connection = JDBCUtil.instance.getConnection();
//3.使用预编译对象 PreparedStatement实现添加,特点:创建 PreparedStatement对象时,就指定了sql语句发送到dbms进行编译
//4.执行sql语句 (注意:当3.中编译语句执行的时候不需要传sql dbms会直接运行编译后的sql语句)
String sql = "insert into t_user(username,password) values (?,?);";// ? ==> 占位符
ps = connection.prepareStatement(sql);
ps.setString(1, user.getUsername());//占位符?从1开始
ps.setString(2, user.getPassword());
ps.executeUpdate();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
//5.释放资源 (注意:关闭资源顺序 先打开后关闭)
JDBCUtil.instance.close(connection, ps, null);
}
}
@Override
public void delete(int id) {
// TODO Auto-generated method stub
Connection connection = null;
PreparedStatement ps = null;
try {
//1.加载驱动
//2.获取连接:与数据库建立连接
connection = JDBCUtil.instance.getConnection();
//3.使用预编译对象 PreparedStatement实现删除,特点:创建 PreparedStatement对象时,就指定了sql语句发送到dbms进行编译
//4.执行sql语句 (注意:当3.中编译语句执行的时候不需要传sql dbms会直接运行编译后的sql语句)
String sql = "delete from t_user where id = ? ;";// ? ==> 占位符
ps = connection.prepareStatement(sql);
ps.setInt(1, id);//占位符?从1开始
ps.executeUpdate();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
//5.释放资源 (注意:关闭资源顺序 先打开后关闭)
JDBCUtil.instance.close(connection, ps, null);
}
}
@Override
public void update(User user) {
// TODO Auto-generated method stub
Connection connection = null;
PreparedStatement ps = null;
String sql = "update t_user set username = ? , password = ? where id = ? ;";// ? ==> 占位符
try {
//1.加载驱动
//2.获取连接:与数据库建立连接
connection = JDBCUtil.instance.getConnection();
//3.使用预编译对象 PreparedStatement实现更新,特点:创建 PreparedStatement对象时,就指定了sql语句发送到dbms进行编译
//4.执行sql语句 (注意:当3.中编译语句执行的时候不需要传sql dbms会直接运行编译后的sql语句)
ps = connection.prepareStatement(sql);
ps.setString(1,user.getUsername());//占位符?从1开始
ps.setString(2,user.getPassword());
ps.setInt(3,user.getId());
ps.executeUpdate();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
//5.释放资源 (注意:关闭资源顺序 先打开后关闭)
JDBCUtil.instance.close(connection, ps, null);
}
}
@Override
public User queryOne(int id) {
// TODO Auto-generated method stub
Connection connection = null;
PreparedStatement ps = null;
String sql = "select * from t_user where id = ? ;";
ResultSet rs = null;
User user = null;
try {
//1.加载驱动
//2.获取连接:与数据库建立连接
connection = JDBCUtil.instance.getConnection();
//3.使用预编译对象 PreparedStatement实现查找,特点:创建 PreparedStatement对象时,就指定了sql语句发送到dbms进行编译
//4.执行sql语句 (注意:当3.中编译语句执行的时候不需要传sql dbms会直接运行编译后的sql语句)
ps = connection.prepareStatement(sql);
ps.setInt(1, id);//占位符?从1开始
rs = ps.executeQuery();
while(rs.next()) {
user = new User();
user.setId(rs.getInt("id"));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
//5.释放资源 (注意:关闭资源顺序 先打开后关闭)
JDBCUtil.instance.close(connection, ps, rs);
}
return user;
}
@Override
public List<User> queryAll() {
// TODO Auto-generated method stub
//1.加载驱动
//2.获取连接:与数据库建立连接
Connection connection = JDBCUtil.instance.getConnection();
PreparedStatement ps = null;
String sql = "select * from t_user;";
ResultSet rs = null;
List<User> userList = new ArrayList<>();
try {
//3.使用预编译对象 PreparedStatement实现查找,特点:创建 PreparedStatement对象时,就指定了sql语句发送到dbms进行编译
//4.执行sql语句 (注意:当3.中编译语句执行的时候不需要传sql dbms会直接运行编译后的sql语句)
ps = connection.prepareStatement(sql);
rs = ps.executeQuery();
while(rs.next()){
User user = new User();
user.setId(rs.getInt("id"));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
userList.add(user);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
//5.释放资源 (注意:关闭资源顺序 先打开后关闭)
JDBCUtil.instance.close(connection, ps, rs);
}
return userList;
}
}
测试类 UserDaoTest.java
/**
* 使用Junit4测试 数据库的增删改查
* @author 郑清
*/
public class UserDaoTest {
UserDaoImpl userDao = new UserDaoImpl();
@Test
public void testAdd() {
User user = new User();
user.setUsername("小猪佩奇");
user.setPassword("123456");
userDao.add(user);
}
@Test
public void testUpdate(){
User user = new User();
user.setId(13);
user.setUsername("大熊");
user.setPassword("488646");
userDao.update(user);
}
@Test
public void testDelete(){
userDao.delete(16);
}
@Test
public void testQueryOne(){
User user = userDao.queryOne(3);
System.out.println(user);
}
@Test
public void testQueryAll(){
List<User> users = userDao.queryAll();
for (User user : users) {
System.out.println(user);
}
}
}
点击进入百度云盘下载资源 密码:d70a