java反射的基本使用

之前在项目中遇到了一个把 List 输出称 HTML 的 Table 的需求,虽然最后没有采用,不过正好记录一下自己的学习内容。

其实如果 List 传入的类是固定的话,可以很简单的实现。不过我想写一个接口,传入 Template 类的形式,这样不管传入的是什么实体类,都可以输出成 HTML 表格的形式了。

不过以接口的形式呈现,就需要通过反射获取传入实体类的属性,因为不知道会传入哪些类,这些类有哪些属性。

完成这个接口的方式是调用这个方法时,传入 List 和 实体类的类名。就像这样:

1
public void printClass(List<T> list,String className);

然后主要使用 Field.getName() 的方法获取属性名和 Field.get(class) 内容值.

下面是接口实现类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public String printClass(List<T> list,String className){
String htmlstr="";
Object object = Class.forName(className).newInstance();
Class c = object.getClass();
Field[] fields = c.getDeclaredFields(); //获取T类的所有属性

for(Field field:fields){
field.setAccessible(true); //暴力的解除了私有限定
}

//html字符串拼接,并且把实体类的属性名作为表头
htmlstr += "<table><tr>";
for (Field field : fields) {
try {
htmlstr += "<th>" + field.getName() + "</th>"; //获取属性名
} catch (Exception e) {
e.printStackTrace();
}
}
htmlstr+="</tr>";

//获取实体类的属性值并作为表内容
for (T t : list) {
htmlstr += "<tr>";
for (Field field : fields) {
try {
htmlstr += "<td>" + field.get(t) + "</td>"; //获取类t当前field(属性名)的属性值
} catch (Exception e) {
e.printStackTrace();
}
}
htmlstr += "</tr>";
}

htmlstr += "</table>"; //有头有尾
return htmlstr;
}

Redis 初识

简介

Redis 是 Remote Dictionary Server ( 远程数据服务 ) 的缩写,是一个开源的高性能键值对 ( key-value ) 数据库。它以字典结构存储数据,并允许其他应用通过TCP协议读取字典内容。

Redis 支持的键值数据类型有:

  • 字符串类型 ( string )
  • 散列类型 ( hash )
  • 列表类型 ( list )
  • 集合类型 ( set )
  • 有序集合类型 ( zset )

功能

  • 持久化
  • 事物
  • 设置生存时间
  • 排序
  • 消息通知
  • 集群

用途

  • 缓存
  • 数据库

杂记

对自己的技术博客提一个要求,使用一个新的技术的时候。先把这个技术拥有的能力说明一边。写上它的基本介绍,可以办到功能。然后在了解清楚这门技术后可以把构架,以及这门技术的原理写出。

希望自己可以按这个要求做到把。

之前面试的时候被问过Maven掌握的怎么样,结果发现自己了解的仅仅是最基础的使用而已。Maven有哪些功能?可以做到什么?你选择这个Maven的原因是什么?他和其他的项目管理工具有哪些优劣?这些都是我之前没有了解过的。

所以决定在每次接触到新技术的时候,先去了解这门技术可以办到的功能,之后才取了解具体怎么使用它。

Spring boot下使用Druid完成多数据源访问简单配置

什么是Druid?

Druid是阿里出的JDBC组件库,包括数据库连接池、SQL Parser等组件。
Druid的Github地址是 https://github.com/alibaba/druid


使用Druid完成多数据源访问需要以下步骤

  • 项目中添加Druid
  • application.yml的配置
  • DataSource、DataSourceTransactionManager、SqlSessionFactory以及SqlSessionTemplate的配置

本文使用的工具是IDEA,使用maven作为项目管理工具,使用sqlserver数据库

在项目中添加Druid的依赖

1
2
3
4
5
6
7
8
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
</dependencies>

在application.yml配置数据库连接信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
spring:
# DATASOURCE
datasource:
type: com.alibaba.druid.pool.DruidDataSource
db1:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
url: jdbc:sqlserver://192.0.0.1:1433;Database=DB1
username: root
password: root
db2:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
url: jdbc:sqlserver://192.0.0.1:1433:1433;Database=DB2
username: root
password: root

创建BaseDataSourceConfig配置类配置四个数据项

这里使用了给每一个数据源分别建立DataSourceConfig的方式,也可以使用其他方式,这里不做额外说明了

此处内容参考了 acquaintanceship 的文章

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import javax.sql.DataSource; //DataSource使用javaax.sql的

@Configuration
@MapperScan(basePackages = "org.uki.dao.db1", sqlSessionTemplateRef = "baseSqlSessionTemplate") //basePackages对应使用db1数据源的dao文件包名
public class db1DataSourceConfig {

@Bean(name = "db1DataSource")
@ConfigurationProperties(prefix = "spring.datasource.db1") //这里填写application.yml里对应的数据源信息
@Primary //当有多个数据源时,需要对主数据源增加@Primary描述
public DataSource setDataSource() {
return new DruidDataSource();
}

@Bean(name = "db1TransactionManager")
@Primary
public DataSourceTransactionManager setTransactionManager(@Qualifier("db1DataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}

@Bean(name = "db1SqlSessionFactory")
@Primary
public SqlSessionFactory setSqlSessionFactory(@Qualifier("db1DataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:**/db1/*.xml"));
return bean.getObject();
}

@Bean(name = "db1SqlSessionTemplate")
@Primary
public SqlSessionTemplate setSqlSessionTemplate(@Qualifier("db1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}


完成以上内容后,只需要把Dao文件放到对应的扫描包中就可以使用多数据源了