反射+注解+JDBC创建数据库表
本次实例我们讲解一个数据库框架的小案例,这里我只写了一个功能,还有关其他数据库操作的功能我会再后面填写上。
功能介绍:
通常我们对数据库进行操作时,都需要创建一个表,在没有使用反射和注解的时候,我们事先是已经将sql语句写好
了的,然后直接调用对应的执行语句就可以创建我们的表了,如果我们想再添加一个表是不是要去修改一下自己提前
已经写好的sql语句呢,然后确定表中的某些字段后把它创建好,有时候你会不会觉得每个表中的字段又不同,然后
又要修改字段呢?这样是不是会觉得很麻烦呢,为了解决这种麻烦的事,那么我们只要灵活的运用反射和注解就能很
好的解决这个问题。
一般来说,为了方便我们能不再那么麻烦的频繁修改语句来创建表,思路如下:
- 一般来说我们每个表都可以对应一个实体,每个表中的字段基本是和我们的实体依依对应的,所以我们需要创建什么表就先定义好实体对象,比如学生表,定义学生对象,老师表,定义老师对象等
- 通过反射拿到每个对象对应注解的值,和其每个字段,然后拼成对应的创建表语句,执行就好了
话不多说,下面开始上代码
Utils包中的Utils.java类:
public class Utils {
//数据库连接对象
private static Connection connection;
//数据库路径
private static final String DBPATH = "C:\\Users\\13718\\student.db"
/**
* 获取数据库的连接
*
* @return
*/
public static Connection getConnection() {
if (connection != null)
return connection;
try {
//加载类驱动
Class.forName("org.sqlite.JDBC");
//获取连接
connection = DriverManager.getConnection("jdbc:sqlite:" + DBPATH);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
/**
* 获取实体包中的对应要创建表的所有对象实例
* 具体实现是,通过I/O的方式访问一个包中的所有java文件
* 然后加载每个类,保存到集合中
* @return
* @throws Exception
*/
public static List<Object> getTablesNum() throws Exception {
List<Object> lst = new ArrayList<>();
File file = new File("SqlCreateTable/src/com/company/bean");
if (!file.exists())
return null;
//这里采用了lambda表达式来过滤对应的文件
File[] files = file.listFiles((s) -> {
return s.getName().endsWith(".java");
});
if (files == null) return null;
for(File f : files){
String[] name = f.getName().split("\\.java");
Class<? extends Object> clazz = Class.forName("com.company.bean."+name[0]);
Object o = clazz.newInstance();
if(clazz != null)
lst.add(o);
}