jsp补-java数据库连接、java反射机制
DB
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.*;
public class DB {
private static String driver = "com.mysql.jdbc.Driver";//写死
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Connection conn=null;
Statement stmt=null;
ResultSet rs=null;
conn = getConnection();
stmt=conn.createStatement();
String sql = "select * from tb_user";
rs = stmt.executeQuery(sql);//执行sql语句 结果保存在rs里
while(rs.next()){//每次只访问一行 必须先调用next 因为如同指向空头节点 return true if the new current row is valid; false if there are no more rows
System.out.println(rs.getString("name"));
}
// 前面的链接和结果让前面的代码继续抛 main throws
sql="insert into tb_user(name,email) values('jerry','123@123')";
stmt.executeUpdate(sql);
close(rs);// 是种资源。按顺序关闭 不能一起放一个try里不然抛出异常会导致后面close失败 所以要分别
close(stmt); //内部都可以捕获 异常
close(conn);
//crud
}
public static void close(Object toClose){
//利用反射机制
Class theClass=toClose.getClass();//得到参数的类
try {
Method close = theClass.getMethod("close");//找到这个类叫colse的方法
close.invoke(toClose);//对某个对象做close方法
//规律 改变方法属性时要用方法确定这些方法属性从属于哪个对象
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*
public static void close(Connection conn) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void close(Statement stmt) {
try {
stmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void close(ResultSet rs) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}*/
//总是要用到的代码 外面的也可以链接这个数据库
public static Connection getConnection() throws ClassNotFoundException, SQLException {
Connection conn;
Class.forName(driver);
String password="";
String url="jdbc:mysql://localhost:3306/chat?useUnicode=true&characterEncoding=UTF-8";
String user="root";
conn = DriverManager.getConnection(url,user,password);
return conn;
}
}
Bank
import java.lang.reflect.Field;
public class Bank {
private int money;
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
}
User
import java.lang.reflect.Field;
public class User {
public static void main(String[] args) {
// TODO Auto-generated method stub
Bank bank = new Bank();
Class<? extends Bank> bankClass = bank.getClass();
Field money;
try {
money = bankClass.getDeclaredField("money");
money.setAccessible(true);//money原本是私有的 改变访问规则
money.setInt(bank, 100);//应该修改字段的对象
System.out.println(bank.getMoney());
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//反射字段 属性名
catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构