JDBC连接数据库
public class BaseDao {
protected Connection conn; // 连接对象
protected PreparedStatement pstmt; // 执行对象
protected ResultSet rs; // 结果集对象
public Connection getConnection() {
try {
// 1、加载驱动 ctrl + alt + t
Class.forName("com.mysql.cj.jdbc.Driver");
// 2、获取数据库连接
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo?serverTimezone=Asia/Shanghai&characterEncoding=utf8", "root", "xxxxx");
// Context ctx = new InitialContext();
// DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/ktmall");
// conn = ds.getConnection();
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
// 释放资源
public void closeAll(ResultSet rs, PreparedStatement pstmt, Connection conn) {
try {
if (rs != null) rs.close();
if (pstmt != null) pstmt.close();
if (conn != null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 执行增删改的SQL语句
*
* @param sql 预编译的SQL语句。 带?点位符
* @param params 参数数组
* @return 返回受影响的行数
*/
public int executeUpdate(String sql, Object... params) {
conn = getConnection();
int count = 0; // 用来保存受影响的行数
try {
pstmt = conn.prepareStatement(sql); // 创建执行对象
// 为预编译的SQL语句赋值,即替换掉?占位符
if (params != null) {
for (int i = 0; i < params.length; i++) {
pstmt.setObject(i + 1, params[i]);
}
}
count = pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 释放资源
closeAll(rs, pstmt, conn);
}
return count;
}
/**
* 利用 Java 反射机制,写的一个通用查询方法
*/
public <T> List<T> executeQuery(String sql, Object[] params, Class<T> clazz) {
List<T> list = new ArrayList<>();
ResultSet rs = null;
PreparedStatement pstmt = null;
Connection conn = getConnection();
try {
pstmt = conn.prepareStatement(sql);
if (params != null) {
for (int i = 0; i < params.length; i++) {
pstmt.setObject(i + 1, params[i]);
}
}
rs = pstmt.executeQuery();
ResultSetMetaData resultSetMetaData = rs.getMetaData();
int columnCount = resultSetMetaData.getColumnCount();
while (rs.next()) {
T t = clazz.getDeclaredConstructor().newInstance(); // 使用构造器获取实例
for (int i = 1; i <= columnCount; i++) { // 从1开始遍历列
String columnName = resultSetMetaData.getColumnLabel(i); // 使用getColumnLabel
Object columnValue = rs.getObject(i);
try {
Field field = clazz.getDeclaredField(columnName);// 获取属性
field.setAccessible(true);
field.set(t, columnValue);
} catch (NoSuchFieldException e) {
// 忽略不存在的字段,或者记录警告
System.out.println("No such field: " + columnName);
}
}
list.add(t);
}
} catch (Exception e) {
e.printStackTrace(); // 打印堆栈跟踪以帮助调试
} finally {
this.closeAll(rs, pstmt, conn);
}
return list;
}
}
封装实体类 Users
public class Users {
private long id;
private String userName;
private long ok;
private String sex;
private java.sql.Timestamp birthday;
private double salary;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String username) {
this.userName = userName;
}
public long getOk() {
return ok;
}
public void setOk(long ok) {
this.ok = ok;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public java.sql.Timestamp getBirthday() {
return birthday;
}
public void setBirthday(java.sql.Timestamp birthday) {
this.birthday = birthday;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
@Override
public String toString() {
return "Users{" +
"id=" + id +
", userName='" + userName + '\'' +
", ok=" + ok +
", sex='" + sex + '\'' +
", birthday=" + birthday +
", salary=" + salary +
'}';
}
}
接口 / 实现类
public interface UsersDao { /** * 查询用户 */ List<Users> queryUsers(); }
public class UsersDaoImpl extends BaseDao implements UsersDao { @Override public List<Users> queryUsers() { String sql= "select id,userName,ok,sex,birthday,salary from users"; List<Users> userList = executeQuery(sql, new Object[]{}, Users.class); return userList; } }
测试方法
public class UserDaoImplTest {
public static void main(String[] args) {
UsersDaoImpl usersDao = new UsersDaoImpl();
List<Users> list = usersDao.queryUsers();
System.out.println(list.toString());
}
}
测试
希望能够给大驾货有用!!!