问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

jdbc框架项目如何配置 mysql双主 目前项目中配置的数据源是在tomcat中

发布网友 发布时间:2022-04-08 02:39

我来回答

2个回答

懂视网 时间:2022-04-08 07:00

class Account { private int id; private String name; private double money; 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 double getMoney() { return money; } public void setMoney(double money) { this.money = money; } }

在未使用框架时编写AccountDAO

public void insertAccount(Account account) {
 Connection conn = null;
 PreparedStatement stmt = null;

 try {
  conn = JDBCUtils.getConnection();
  String sql = "insert into account values(null,?,?)";

  stmt = conn.prepareStatement(sql);
  // 设置参数
  stmt.setString(1, account.getName());
  stmt.setDouble(2, account.getMoney());

  stmt.executeUpdate();

 } catch (SQLException e) {
  e.printStackTrace();
 } finally {
  JDBCUtils.release(stmt, conn);
 }
 }

通过不同对象DAO模式下的SQL操作比较对方法进行提取编写通用框架

public static void update(String sql, Object... args) {
 Connection conn = null;
 PreparedStatement stmt = null;

 try {
  conn = JDBCUtils.getConnection();

  stmt = conn.prepareStatement(sql);
  // 设置参数 --- 根据?设置参数
  ParameterMetaData parameterMetaData = stmt.getParameterMetaData();
  int count = parameterMetaData.getParameterCount();
  for (int i = 1; i <= count; i++) {
  stmt.setObject(i, args[i - 1]);
  }

  stmt.executeUpdate();

 } catch (SQLException e) {
  e.printStackTrace();
 } finally {
  JDBCUtils.release(stmt, conn);
 }
 }

在使用框架之后写的AccountDAO

public void insertAccount(Account account) {
 String sql = "insert into account values(null,?,?)";
 Object[] params={account.getNmae(),account.getMoney()}
 JDBCFramework.update(sql,params)
 

}

通用框架的编写使用在后来可以不断重复使用,大大的简化了开发。但是上面的通用框架方法只适合CUD增删改,对于查询R来说是不能使用的,所以需要单独进行抽取编写框架方法

在未使用框架时

public Account findById(int id) {
 Connection conn = null;
 PreparedStatement stmt = null;
 ResultSet rs = null;
 Account account = null;
 
 try {
 conn = JDBCUtils.getConnection();
 String sql = "select * from account where id = ?";
 
 stmt = conn.prepareStatement(sql);
 
 //设置参数
 stmt.setInt(1, id);
 
 rs = stmt.executeQuery();
 if (rs.next()) {
 account = new Account();
 account.setId(rs.getInt("id"));
 account.setName(rs.getString("name"));
 account.setMoney(rs.getDouble("money"));
 }

 } catch (SQLException e) {
 e.printStackTrace();
 } finally {
 JDBCUtils.release(rs, stmt, conn);
 }
 
 return account;
 }

编写框架

public static <T> T query(String sql, MyResultSetHandler<T> handler,
  Object... args) {
 T obj = null;

 Connection conn = null;
 PreparedStatement stmt = null;
 ResultSet rs = null;

 try {
  conn = JDBCUtils.getConnection();
  stmt = conn.prepareStatement(sql);

  // 设置参数
  ParameterMetaData parameterMetaData = stmt.getParameterMetaData();
  int count = parameterMetaData.getParameterCount();
  for (int i = 1; i <= count; i++) {
  stmt.setObject(i, args[i - 1]);
  }

  rs = stmt.executeQuery();
  obj = handler.handle(rs);

 } catch (SQLException e) {
  e.printStackTrace();
 } finally {
  JDBCUtils.release(rs, stmt, conn);
 }
 return obj;
 }

要另外定义接口将rs结果集中的数据封装成一个对象

public interface MyResultSetHandler<T> {
 // 将rs中数据封装对象
 public T handle(ResultSet rs);
}

使用框架之后

public Account findById(int id) {
 // 使用自定义框架
 String sql = "select * from account where id = ?";
 MyResultSetHandler handler = new MyResultSetHandler() {//内部类实现框架的接口封装数据。但是每次都要实现 MyResultSetHandler接口,手动完成数据的封装的动作,所以此动作依然可以继续向上抽取。
  @Override
  public Object handle(ResultSet rs) {
  try {
   if (rs.next()) {
   Account account = new Account();
   account.setId(rs.getInt("id"));
   account.setName(rs.getString("name"));
   account.setMoney(rs.getDouble("money"));
   return account;
   }
  } catch (SQLException e) {
   e.printStackTrace();
  }
  return null;
  }
 };

 return (Account) JDBCFramework.query(sql, handler, id);
 }
内部类实现框架的接口封装数据。但是每次都要实现 MyResultSetHandler接口,手动完成数据的封装的动作,所以此动作依然可以继续向上抽取。
将封装结果集数据的动作进行向上提取,利用泛型和反射在框架中编写通用的Handler程序,☆难点。
public class MyBeanHandler<T> implements MyResultSetHandler<T> {

 private Class<T> domainClass;

 public MyBeanHandler(Class<T> domainClass) {//泛型是存在编译时期的,要创建T泛型的实例,需要将具体类的字节码文件对象传入利用反射技术去创建对象。
 this.domainClass = domainClass;
 }

 @Override
 public T handle(ResultSet rs) {//用泛型去指代返回的数据类型。
 try {
  ResultSetMetaData resultSetMetaData = rs.getMetaData();// 结果集元数据
  int count = resultSetMetaData.getColumnCount();

  BeanInfo beanInfo = Introspector.getBeanInfo(domainClass);//使用内省技术获得字节码文件对象的属性描述器。
  PropertyDescriptor[] descriptors = beanInfo
   .getPropertyDescriptors();
  if (rs.next()) {
  T t = domainClass.newInstance();//此处获得T的实例对象
  for (int i = 1; i <= count; i++) {
   String columnName = resultSetMetaData.getColumnName(i);
   // 获得列名 --- 需要去查找匹配属性
   for (PropertyDescriptor propertyDescriptor : descriptors) {
   if (columnName.equals(propertyDescriptor.getName())) {
    // 列名 存在 同名属性 ---- 列值 存到属性里
    Method writeMethod = propertyDescriptor
     .getWriteMethod(); // setName setMoney
    writeMethod.invoke(t, rs.getObject(columnName));
   }
   }
  }
  return t;
  }
 } catch (Exception e) {
  e.printStackTrace();
 }
 return null;
 }

}

最后简化出的DAO下的查询方法

public Account findById(int id) {
 String sql = "select * from account where id = ?";
 return JDBCFramework.query(sql,new MyBeanHandler<Account>(Account.class),id)
}

 

JDBC框架的编写

标签:

热心网友 时间:2022-04-08 04:08

方法/步骤

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
我用耳机玩爱唱久久怎么唱出来的不响? 电脑ktv点歌软件有哪些电脑用什么点歌软件比较好 更换变速箱油后,汽车刹车和起步时底盘常有嘎啦嘎啦的异响是什么原因... 格兰仕空调口碑怎么样 格兰仕空调的优缺点有哪些? 格兰仕空调怎么样?质量好吗? 什么是PNC金融服务集团 挖出蛇是好事还是坏事? 微信换行怎么换到下一行 微信如何将自己的位置定位发绐别人 周公解梦 下水道钻出一条大鱼 周易解梦下水道里找人 周公解梦梦到下水道厨房让鱼肉堵上了啥意思 天天P图的详细描述 电脑重新启动后搜狗输入法属性-候选项有9变成5个、候选字大小有24变成16,请指点怎样恢复 腾讯AI小程序西安开讲了吗? qq拼音输入法属性设置在那啊 输入法属性栏消失了,怎么办? 马化腾在知乎发布的一条提问暴露了他的什么? 百度输入法设置属性在哪儿? 急:腾讯优图 ocr身份证识别接口支持ajax对接吗 怎么限制输入法设置? 华为ai系统和腾讯优图有什么关系? 我的输入法属性框消失了 腾讯优图软件连不上摄像头 输入法设置属性没了 我在学画画,希望能在网上找到教程 android 腾讯优图怎么用 腾讯最高级的科学家是谁? 怎样删除微信腾讯优图? 周公解梦梦下水道脏水垃圾倒进客厅 周公解梦下水道水进屋 周公解梦梦见自己和男朋友在地下下水道走 然后对方忽然不见了… 周公解梦梦到按下水道我还爬上高架上 周公解梦下水道堵了全是垃圾我把垃圾都清理干净下水道才通了 周公解梦大全查询厕所马桶烂了掉进下水道 周公解梦梦到自己去男朋友有新房下水道有电线就是出水口 《十宗罪》里刁爱青死时留下的字“开,五,是,表,人,和,吊”和数字4488286分别是什么意思? 刁爱青碎尸案中,警方破获的文字密码,我搞了三十分钟得出这个。 开.五.是.表.人.和.吊 刁爱青碎尸案中,警方破获的文字密码,我搞了三十分钟得出这个。 开.五.是.表.人.和.吊 十宗罪碎尸案中的“开、五、是、表、人、和、吊”究竟表示什么意思? 凶手到底是谁? 十宗罪碎尸案中的“开、五、是、表、人、和、吊”究竟表示什么意思? 凶手到底是谁? 喝茉莉花茶需要注意什么呢? 开五是表人和吊 代表什么 有线数字电视信号能接到电脑显示器上吗 《十宗罪》中,到底是谁杀了刁爱青?“开 五 是 表 人 和 吊”到底是什么意思 《十宗罪》中,到底是谁杀了刁爱青?“开 五 是 表 人 和 吊”到底是什么意思 谁能告诉我,关于这几个字是什么意思?“开五是表人和吊” 十宗罪第十卷碎尸*的凶手到底是谁?是谁杀了刁爱青?表 人 和 吊到底暗示的是谁? 十宗罪第十卷 碎尸*中 &quot;表 人 和 吊” 到底表示什么 谁有事凶手 跪求大神 解答