我们知道在学习JDBC的时候有很多重复代码,而封装使我们java语言的一大特点,所以为了重复代码不重复写,今天我们来看看JDBC增删查改完全封装
Dao层(功能实现类)
UserDao(接口)
package com.kd.Dao;
import com.kd.Pojo.User;
import java.util.List;
public interface UserDao {
/**
* 添加用户
*/
public int addUser(User user);
/**
* 根据主键删除
*/
public int deleteById(Integer id);
/**
* 修改, 不修改主键
* 根据主键修改
*/
public int updateById(User user);
/**
* 根据主键查询
*/
public User queryById(Integer id);
/**
* 查询所有
*/
public List<User> queryAll();
}
UserDaoImpl(接口实现类)
package com.kd.Dao;
import com.kd.Pojo.User;
import com.kd.Util.JDBCUtil;
import java.util.List;
public class UserDaoImpl implements UserDao{
//添加用户
@Override
public int addUser(User user) {
try {
String sql = "insert into user(username,password) values(?,?);";
JDBCUtil.executrDML(sql,user.getUsername(),user.getPassword());
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}
//根据主键:ID删除数据
@Override
public int deleteById(Integer id) {
try {
String sql = "DELETE FROM user WHERE id = ?;";
JDBCUtil.executrDML(sql,id);
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}
//根据主键:ID 修改数据
@Override
public int updateById(User user) {
try {
String sql = "update student set username = ?,password = ? where id = ?;";
JDBCUtil.executrDML(sql,user.getUsername(),user.getPassword(),user.getId());
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}
//根据主键:ID查询信息
@Override
public User queryById(Integer id) {
try {
String sql = "select * from user where id = ?;";
JDBCUtil.executrDML(sql,id);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
//查询所有用户
@Override
public List<User> queryAll() {
try {
String sql = "select * from student";
JDBCUtil.executrDML(sql);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
pojo(实体类)
User
package com.kd.Pojo;
public class User {
private Integer id;
private String username;
private String password;
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer 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;
}
}
util(工具类)(重点)
JDBCUtil
package com.kd.Util;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
public class JDBCUtil {
static Properties pos = new Properties();
static {
InputStream in = JDBCUtil.class.getClassLoader().getResourceAsStream("bd.properties");
try {
pos.load(in);
Class.forName(pos.getProperty("driverClass"));
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 创建连接对象
*/
public static Connection getConnection() throws Exception {
return DriverManager.getConnection(pos.getProperty("url"),pos.getProperty("username"),pos.getProperty("password"));
}
/**
* 增删改
*/
public static int executrDML(String sql,Object... obj) throws Exception {
//获取数据库连接对象
Connection conn = getConnection();
PreparedStatement ps = conn.prepareStatement(sql);
//设置参数
if(null != obj){
for (int i = 0; i < obj.length; i++) {
ps.setObject(i+1,obj[i]);
}
}
return ps.executeUpdate();
}
/**
* 查询
*/
public static <T> List<T> executrDQL(String sql,Class<T> clazz,Object... obj) throws Exception {
Connection conn = getConnection();
PreparedStatement ps = conn.prepareStatement(sql);
//设置参数
if(null != obj){
for (int i = 0; i < obj.length; i++) {
ps.setObject(i + 1,obj[i]);
}
}
ResultSet rs = ps.executeQuery();
//获取当前有哪些列
ResultSetMetaData metaData = rs.getMetaData();//(元数据)
//获取总列数
int columnCount = metaData.getColumnCount();
//存放传过来类的对象
List<T> list = new ArrayList<>();
while (rs.next()){
//通过反射创建一个传过来的类的实体类
T t = clazz.newInstance();
for (int i = 1; i <= columnCount; i++) {
//获取列名
String columnLabel = metaData.getColumnLabel(i);
//根据列名获取数据库数据
Object object = rs.getObject(columnLabel);
try {
//根据列名获取实体类的属性
Field field = clazz.getDeclaredField(columnLabel);
//强行开启权限
field.setAccessible(true);
//给t对象对应属性设置数据库传过来的值
field.set(t,object);
} catch (NoSuchFieldException e) {
System.out.println("实体类中没有" + columnLabel + "属性");
}
}
//把查询结果添加到对象集合中
list.add(t);
}
return list;
}
/**
* 关闭资源
* @param obj
*/
public static void closeAll(Object... obj){
for (Object o : obj) {
if(o instanceof Connection) {
try {
((Connection) o).close();
} catch (Exception e) {
e.printStackTrace();
}
}else if(o instanceof PreparedStatement){
try {
((PreparedStatement) o).close();
} catch (Exception e) {
e.printStackTrace();
}
}else if(o instanceof ResultSet){
try {
((ResultSet) o).close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
本文介绍如何通过封装JDBC代码,减少重复性工作,主要涉及Dao层接口及实现、实体类和工具类JDBCUtil的创建与应用。

4601

被折叠的 条评论
为什么被折叠?



