数据库连接池、反射和工厂模型

一, 由于创建连接的代价是很高的,我们每次访问数据库都要创建连接的话是非常西欧阿豪性的,我们可以在程序启动的时候先创建出一写连接,放到一个集合里,访问数据库的时候从集合中获取,使用结束再放回集合中。

例子:package cn.hbsi;

import java.io.InputStream;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

import java.util.LinkedList;

import java.util.Properties;

import java.util.concurrent.locks.Lock;

import java.util.concurrent.locks.ReentrantLock;

public class MyDataSource {

private LinkedList<Connection> pool = new LinkedList<Connection>();

private String url;

private String user;

private String password;

private String driver;

private int initSize;

private int maxSize;

private int currentSize;

private Lock lock = new ReentrantLock();

/*

* 服务器启动的时候, 创建MyDataSource, 在MyDataSource创建的时候, 初始化5个连接

*/

public MyDataSource() {

try {

Properties prop = new Properties();

InputStream in = JdbcUtil.class.getClassLoader().getResourceAsStream("connConfig.properties");

prop.load(in);

url = prop.getProperty("url");

user = prop.getProperty("user");

password = prop.getProperty("password");

driver = prop.getProperty("driver");

initSize = Integer.parseInt(prop.getProperty("initSize"));

maxSize = Integer.parseInt(prop.getProperty("maxSize"));

Class.forName(driver);

for (int i = 0; i < initSize; i++)

createConnection();

} catch (Exception e) {

throw new RuntimeException(e);

}

}

public Connection getConnection() throws SQLException {

try {

lock.lock();

if (pool.size() == 0 && currentSize < maxSize)

createConnection();

if (pool.size() > 0)

return pool.remove(); // 从list中删掉第一个元素, 将这个元素作为返回值返回

throw new SQLException("系统忙, 一会再来吧.");

} finally {

lock.unlock();

}

}

public void release(Connection conn) {

pool.add(conn); // add是添加到最后一个

}

private void createConnection() throws SQLException {

pool.add(DriverManager.getConnection(url, user, password));

currentSize++;

}

}

二, 反射

1主要是指程序可以访问、检测和修改其自身状态或行为的一种能力。

2.Java反射提供了以下功能:

a. 运行时判断任意一个对象所属的类;

b. 运行时构造任意一个类的对象;

c. 运行时判断任意一个类所具有的成员变量和方法。

d. 运行时调用任意一个对象的方法,通过反射甚至可以调用到 peivate的方法。

e. 生成动态代理。

3.

a.使用class类的getclass()方法得到class对象。

Myobject x=new myobject();

Class c1=x.getclass();

b.使用class类的forname()静态方法获得与字符串对应的class类对象。Class c2=class。Forname(“java.lang.Stirng”);

c.使用“类型名.class”获取该类型对应的class对象。

Class c1=Manager.Class;

Class c2=int.class;

Class c3=double[].class;

4.常用方法

Public String getName():获取此class对象所表示的权限定名;

Public field[] getField();获取此class对象所表示实体的所有public字段;

Public Field[] getDeclaredFields():获取此class对象所表示实体的所有字段;

Public Method[] getMethod():获取此class对象所表示实体的所有的public字段;

Public class[] getInterfaces():获取此class对象所有表示实体实现的所有接口class列表。

Public T newInstance():创建此class对象所表示类的一个新实例,使用的是不带参数的构造方法。

Public Method getMethod(String name,class<?>…parameterTypes):获取此class对象特定的方法,其中neme参数用于指定方法的名称;parameterTypes为可变参数,用于指定方法的数据类型

5.获取类类信息

a.获取指定类对应的class对象

Class clazz=Class.forName(“java.util.arrayList”);

b.获取指定类得包名

String packageName=clazz.getPackage().getName();

c获取指定类的修饰符

int mod=clazz.getModifiers();

String modifier=Modifier.toStrng(mod);

d获取指定类的完全限定名

String className=clazz.getName();

E获取指定了的父类

Class superClazz=clazz.getSuperclass();

F获取指定类实现的接口

Class[] interfaces=clazz.getinterfaces();

G获取指定类的成员变量

Field[] field=clazz.getDeclaredFields();

三.工厂模式

工厂方法
你会建立一个专门生产Sample实例的工厂:

public class Factory{

  public static Sample creator(int which){

  //getClass 产生Sample 一般可使用动态类装载装入类。
  if (which==1)
    return new SampleA();
  else if (which==2)
    return new SampleB();

  }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以通过以下步骤来实现动态查询对应的表数据: 1. 获取主数据模型的信息,包括表名、字段名等。可以通过访问数据库或缓存来获取这些信息。 2. 构建 SQL 查询语句,根据主数据模型信息动态生成查询语句,例如: ```sql SELECT * FROM {table_name} WHERE {field_name} = {value}; ``` 其中,`{table_name}`、`{field_name}`和`{value}`都是通过主数据模型信息动态获取的。 3. 执行 SQL 查询语句,获取表数据。 可以使用 JDBC 或其他 ORM 框架来执行 SQL 查询语句,并将查询结果映射成 Java 对象返回。 完整的代码示例可能如下所示: ```java public List<Masterdata> getMasterdataListByModelId(String logicModelId) { // 1. 获取主数据模型的信息 MasterdataModel model = masterdataModelService.getMasterdataModelById(logicModelId); String tableName = model.getTableName(); String fieldName = model.getFieldName(); // 2. 构建 SQL 查询语句 String sql = "SELECT * FROM " + tableName + " WHERE " + fieldName + " = ?"; // 3. 执行 SQL 查询语句 List<Masterdata> masterdataList = jdbcTemplate.query(sql, new Object[]{value}, new BeanPropertyRowMapper<>(Masterdata.class)); return masterdataList; } ``` ### 回答2: masterdataService.getMasterdataListByModelId(ShardingKey.ofContext(), logicModelId) 的实现需要根据主数据模型信息动态查询对应的表数据。 首先,根据 ShardingKey.ofContext() 获取分片键,这个分片键可以用来确定具体的数据存储位置或者数据源。然后,根据 logicModelId 获取主数据模型的信息,包括表名、字段名、数据类型等等。 接下来,需要根据获取到的主数据模型信息动态生成查询语句。根据表名、字段名等信息,可以使用 SQL 或者类似的查询语言来构建查询语句。例如,可以拼接一个 SELECT 语句,并指定需要查询的字段以及表名。其中,表名可以根据获取到的主数据模型信息进行替换。此外,可以根据具体的业务需求,添加 WHERE 子句来进行筛选。 然后,执行构建好的查询语句,从对应的表中获取数据。可以使用数据库连接等技术来获取数据库连接,并执行查询语句。获取到的数据可以存储在一个数据结构(如列表、哈希表等)中,以便后续的处理和返回。 最后,返回获取到的主数据列表。可以根据具体的业务需求,将获取到的数据进行一些转换或者加工,以便返回给调用方。例如,可以将查询结果映射为特定的实体对象,或者将数据转换为 JSON 格式。 总之,masterdataService.getMasterdataListByModelId(ShardingKey.ofContext(), logicModelId) 的实现需要根据主数据模型信息动态查询对应的表数据,通过构建查询语句和执行查询获取数据,并最终将结果返回给调用方。 ### 回答3: masterdataService.getMasterdataListByModelId(ShardingKey.ofContext(), logicModelId) 的实现需要根据传入的主数据模型信息动态查询对应的表数据。首先,根据模型ID获取主数据模型的信息,包括模型的名称、字段、关联表等。然后,根据关联表信息,动态生成SQL语句进行查询操作。生成的SQL语句包括表名、查询字段以及相应的条件。 在实现过程中,可以使用反射机制动态生成SQL语句。首先根据模型ID获取到模型信息,然后利用反射获取到模型对应的类对象。通过查找类对象中的注解、字段信息等,获得字段名称。根据字段名称生成SQL中的查询字段部分。同时,根据关联表信息,生成表名和条件部分。最后,将生成的SQL语句作为参数传给数据库连接,执行查询操作,并返回查询结果。 为了提高查询效率,可以考虑使用缓存技术。在第一次查询某个模型的数据时,将查询结果存入缓存中。在后续对同一模型的查询操作中,直接从缓存中获取数据,避免重复查询数据库。当对该模型的数据进行更新、删除等操作时,需要更新缓存中的数据。 总而言之,masterdataService.getMasterdataListByModelId(ShardingKey.ofContext(), logicModelId) 的实现需要根据主数据模型信息动态查询对应的表数据,可以通过使用反射机制动态生成SQL语句,并结合缓存技术提高查询效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值