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

jdbc都有什么设计模式我是一个新手,昨天

发布网友 发布时间:2022-04-10 11:47

我来回答

2个回答

懂视网 时间:2022-04-10 16:08

com.itheima.domain; //一般:实体类的字段名和数据库表的字段名保持一致 //约定优于编码 public class Account { private int id; private String name; private float 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 float getMoney() { return money; } public void setMoney(float money) { this.money = money; } @Override public String toString() { return "Account [id=" + id + ", name=" + name + ", money=" + money + "]"; } }
package com.itheima.util;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSourceFactory;

public class DBCPUtil {
 private static DataSource dataSource;
 static{
 try {
  InputStream in = DBCPUtil.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");
  Properties props = new Properties();
  props.load(in);
  dataSource = BasicDataSourceFactory.createDataSource(props);
 } catch (Exception e) {
  throw new ExceptionInInitializerError(e);
 }
 }
 
 public static DataSource getDataSource(){
 return dataSource;
 }
 
 public static Connection getConnection(){
 try {
  return dataSource.getConnection();
 } catch (SQLException e) {
  throw new RuntimeException(e);
 }
 }
}
package com.itheima.dbassist;

import java.sql.ResultSet;

public interface ResultSetHandler {
 /**
 * 把结果中的数据封装到指定的对象中
 * @param rs
 * @return 封装了数据的对象
 */
 Object handle(ResultSet rs);
}
package com.itheima.dbassist;

import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
/**
 * 封装到JavaBean中
 * 满足约定:数据库字段名和JavaBean字段名保持一致
 * @author wzhting
 *
 */
public class BeanListHanlder implements ResultSetHandler {
 
 private Class clazz;//目标类型
 public BeanListHanlder(Class clazz){
 this.clazz = clazz;
 }

 public Object handle(ResultSet rs) {
 try {
  List list = new ArrayList();
  while(rs.next()){
  //有记录
  Object bean = clazz.newInstance();//目标对象
  //有多少列,列名和值又是什么?
  ResultSetMetaData rsmd = rs.getMetaData();
  int count = rsmd.getColumnCount();//列数
  for(int i=0;i<count;i++){
   String fieldName = rsmd.getColumnName(i+1);//得到数据库字段名,也就得到了JavaBan的字段名
   Object fieldValue = rs.getObject(fieldName);//字段值
   //通过字段反射
   Field f = clazz.getDeclaredField(fieldName);
   f.setAccessible(true);
   f.set(bean, fieldValue);
  }
  list.add(bean);
  }
  return list;
 } catch (Exception e) {
  throw new RuntimeException(e);
 }
 }

}
package com.itheima.dbassist;

import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
/**
 * 适合只有一条查询结果的情况
 * 封装到JavaBean中
 * 满足约定:数据库字段名和JavaBean字段名保持一致
 * @author wzhting
 *
 */
public class BeanHanlder implements ResultSetHandler {
 
 private Class clazz;//目标类型
 public BeanHanlder(Class clazz){
 this.clazz = clazz;
 }

 public Object handle(ResultSet rs) {
 try {
  if(rs.next()){
  //有记录
  Object bean = clazz.newInstance();//目标对象
  //有多少列,列名和值又是什么?
  ResultSetMetaData rsmd = rs.getMetaData();
  int count = rsmd.getColumnCount();//列数
  for(int i=0;i<count;i++){
   String fieldName = rsmd.getColumnName(i+1);//得到数据库字段名,也就得到了JavaBan的字段名
   Object fieldValue = rs.getObject(fieldName);//字段值
   //通过字段反射
   Field f = clazz.getDeclaredField(fieldName);
   f.setAccessible(true);
   f.set(bean, fieldValue);
  }
  return bean;
  }
  return null;
 } catch (Exception e) {
  throw new RuntimeException(e);
 }
 }

}
package com.itheima.dbassist;

import java.sql.Connection;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.sql.DataSource;

/**
 * 框架的核心类
 * @author wzhting
 *
 */
public class DBAssist {
 private DataSource dataSource;
 public DBAssist(DataSource dataSource){
 this.dataSource = dataSource;
 }
 //写:添加、删除、修改
 //params参数要和sql中的占位符对应
 public void update(String sql,Object...params) {
 Connection conn = null;
 PreparedStatement stmt = null;
 ResultSet rs = null;
 try{
  conn = dataSource.getConnection();
  stmt = conn.prepareStatement(sql);
  //设置参数
  //得到sql中的参数
  ParameterMetaData pmd = stmt.getParameterMetaData();
  int count = pmd.getParameterCount();
  if(count>0){
   if(params==null){
   throw new RuntimeException("必须传入参数的值");
   }
   if(count!=params.length){
   throw new RuntimeException("参数数量不匹配");
   }
   for(int i=0;i<count;i++){
   stmt.setObject(i+1, params[i]);
   }
   
  }
  
  stmt.executeUpdate();
 }catch(Exception e){
  throw new RuntimeException(e);
 }finally{
  release(rs, stmt, conn);
 }
 }
 
 
 //读:查询
 public Object query(String sql,ResultSetHandler rsh,Object...params) {
 Connection conn = null;
 PreparedStatement stmt = null;
 ResultSet rs = null;
 try{
  conn = dataSource.getConnection();
  stmt = conn.prepareStatement(sql);
  //设置参数
  //得到sql中的参数
  ParameterMetaData pmd = stmt.getParameterMetaData();
  int count = pmd.getParameterCount();
  if(count>0){
   if(params==null){
   throw new RuntimeException("必须传入参数的值");
   }
   if(count!=params.length){
   throw new RuntimeException("参数数量不匹配");
   }
   for(int i=0;i<count;i++){
   stmt.setObject(i+1, params[i]);
   }
   
  }
  
  rs = stmt.executeQuery();
  //有结果集,要封装到对象中。策略设计模式
  return rsh.handle(rs);
 }catch(Exception e){
  throw new RuntimeException(e);
 }finally{
  release(rs, stmt, conn);
 }
 }
 
 
 private void release(ResultSet rs,Statement stmt,Connection conn){
 if(rs!=null){
  try {
  rs.close();
  } catch (SQLException e) {
  e.printStackTrace();
  }
  rs = null;
 }
 if(stmt!=null){
  try {
  stmt.close();
  } catch (SQLException e) {
  e.printStackTrace();
  }
  stmt = null;
 }
 if(conn!=null){
  try {
  conn.close();
  } catch (SQLException e) {
  e.printStackTrace();
  }
  conn = null;
 }
 }
}
package com.itheima.test;

import java.util.List;

import org.junit.Test;

import com.itheima.dbassist.BeanHanlder;
import com.itheima.dbassist.BeanListHanlder;
import com.itheima.dbassist.DBAssist;
import com.itheima.domain.Account;
import com.itheima.util.DBCPUtil;

public class DBAssistTest {
 private DBAssist da = new DBAssist(DBCPUtil.getDataSource());
 @Test
 public void testAdd(){
 da.update("insert into account values (?,?,?)", 7,"ggg",1000);
 }
 @Test
 public void testUpdate(){
 da.update("update account set money=? where id=?", 10000,7);
 }
 @Test
 public void testDel(){
 da.update("delete from account where id=?",7);
 }
 @Test
 public void testQueryOne(){
 Object obj = da.query("select * from account where id=?",new BeanHanlder(Account.class),2);
 System.out.println(obj);
 }
 @Test
 public void testQueryAll(){
 List list = (List)da.query("select * from account",new BeanListHanlder(Account.class));
 for(Object o:list)
  System.out.println(o);
 }
}

 

编写JDBC框架:(策略设计模式)

标签:column   resultset   cut   设置   junit   .com   sys   span   目标   

热心网友 时间:2022-04-10 13:16

应该不是线程安全的,DLL只是共享进程的堆栈而不是共享线程的堆栈.
只是上来让大家肯定一下.

这要看你的DLL里面的函数的处理了 比如是否存在对同一资源的存取,是不是线程安全的。。
比如说你打开文件 如果用独占方式打开 那么是安全的 否则可能会不安全。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
中支黄金叶什么价 怎么在整个PPT中加入背景音乐,而不是在一张幻灯片中插入,我要的是从... 构造柱有哪些构造措施 中国风的女式花裤配什么鞋 留抵抵税额是什么意思 留抵税抵什么意思 ...里发现很多门店装修和华为一样的,但是官网查不到,这种店铺购买... 墙布贴了关窗多久 墙布贴了要关窗多久 墙布贴好要多久密闭多久 报考护士资格证有年龄限制吗? 芜湖核电站的最新消息 请问江苏第二核电站前期工作的进展情况? 淮安在建的发电厂 江阴长电是不是要搬到盱眙去? 核电站离绍兴太近了吧,大家觉得会有影响吗? 中国有核电站吗? 2013盱眙财政局宣盱眙确定要建核电站了,这消息是真的吗? 盱眙要造核电站了;在什么地方 淮安核电站在什么地方 盱眙核电站最新情况 我家的美菱冰箱压缩机一直“吱吱”响,一直没停过。 红米k40pro和k40pro 充电器不能兼容吗? 男孩出生在什么日期好? 的作用是什么? 女孩出生一般孕期多少周为最佳? 女人生男孩一般是多少天 男孩子一般多少周出生 母亲怀男孩需要多少天出生 怀男孩一般多少天生 王者直播电脑投屏怎么出现录像被其他设置占用 怎么查看注册时间? 怎么查询自己的的注册时间? 孕妇身上长痘痘是怎么回事 孕妇身上起红疙瘩很痒怎么办要注意哪些呢? 孕妇皮肤过敏长了好多小疙瘩怎么办? 喉咙痛,咽口水也痛,咳嗽 喉咙痛怎么办咽口水喝水都痛 医生,我嗓子疼,咳嗽不断,咽唾沫更疼 喉咙痛而且一直咳嗽怎么回事 喉咙痛,咽口水都痛,咳嗽的很厉害,感觉嗓子里面毛毛的,什么办,请专家看看,谢谢了! 喉咙痛喉咙痒,还有咳嗽。咽口水都觉得痛! 喉咙痛吞口水都痛怎么办? 2020年阴阳师九月神秘符号是什么? 由于咳嗽引起的喉咙痛,咽口水非常痛,怎么办? 《阴阳师》体验服9月6日更新内容:雪童子与百目鬼上线 喉咙痛怎么办咽口水都痛咳到喉结都没有了 我喉咙痛几天了,不时会咳嗽,咽口水的时候也会痛 《阴阳师》9月斗技式神阵容怎么搭配 斗技阵容搭配推荐 喉咙痛还咳嗽