java代码自动生成数据库表中对应的类文件及操作数据库功能
程序员文章站
2022-03-19 16:11:37
java代码自动生成数据库表中对应的类文件及操作数据库功能1. 创建数据库和数据库表2. 导入mysql jar包(mysql-connector-java-5.1.47)及mchange-commons-java-0.2.10(可选项)3. 导入c3p0的jar包(c3p0-0.9.5.1)和配置文件(xml)并完成配置方法(工具类):MyJDBCutil.autoGenerateAllBeanS(String url);参数:url – 生成class文件的路径作用:自动生成数据库...
java代码自动生成数据库表中对应的类文件及操作数据库功能
1. 创建数据库和数据库表
2. 导入mysql jar包(mysql-connector-java-5.1.47)及mchange-commons-java-0.2.10(可选项)
3. 导入c3p0的jar包(c3p0-0.9.5.1)和配置文件(xml)并完成配置
4. 书写以下java语句(工具类)
所需工具下载链接:https://download.csdn.net/download/weixin_51311218/13971936
方法(工具类):
- MyJDBCutil.autoGenerateAllBeanS(String url);
- 参数:url – 生成class文件的路径
- 作用:自动生成数据库中对应表中的类文件
- MyJDBCutil.autoGenerateFormatBean(String table,String url);
- 参数1:数据库中的表名
- 参数2:生成class文件的路径
- 作用:自动生成数据库中对应表中的类文件
- 数据查询DQL(select)
- Arrlist<E> list = MyJDBCutil.dql(String sql,Class<E> c,Object …obj);
- 参数1:数据查询的sql语句
- 参数2:需要查询的表对应的class文件
- 参数3:sql语句“?”占位符所占位的元素
- 返回值:对应的集合
- 作用:查询方法,通过sql语句获取对应的集合
- 数据操纵DML(delete/update/insert)
- MyJDBCutil.dml(Connection con,String sql,Object … obj)
- 参数1:事务的连接
- 参数2:数据操纵的sql语句
- 参数3:sql语句“?”占位符所占位的元素
- 作用:支持事务的数据操纵方法
package com.yunhe.util;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Set;
public class MyJDBCutil {
private static ComboPooledDataSource dpds;
static {
//创建连接池对象加载配置文件
dpds=new ComboPooledDataSource();
}
//返回一个新的连接
public static Connection getCon() {
Connection con = null;
try {
//使用连接池获取连接
con=dpds.getConnection();
} catch (Exception e) {
e.printStackTrace();
}
return con;
}
//更新方法
public static int dml(String sql,Object ... obj) {
Connection con = getCon();//获取连接
try {
PreparedStatement ps = con.prepareStatement(sql);
for (int i=0;i<obj.length;i++){
ps.setObject(i+1,obj[i]);
}
return ps.executeUpdate();
}catch (Exception e){
e.printStackTrace();
return 0;
}finally {
close(con);
}
}
//支持事务的更新方法
public static int dml(Connection con,String sql,Object ... obj) throws SQLException {
con.setAutoCommit(false);
PreparedStatement ps = con.prepareStatement(sql);
for (int i=0;i<obj.length;i++){
ps.setObject(i+1,obj[i]);
}
return ps.executeUpdate();
}
//查询方法
public static <E> ArrayList<E> dql(String sql,Class<E> c, Object ...obj) {
Connection con = getCon();//获取连接
ArrayList<E> list=new ArrayList<>();
ResultSet rs=null;
try {
PreparedStatement ps = con.prepareStatement(sql);
for (int i=0;i<obj.length;i++){
ps.setObject(i+1,obj[i]);
}
ResultSetMetaData metaData = ps.getMetaData();//获取查询元数据
//元数据中包含所有关于本次sql查询的数据(不包含结果数据)
//获取查询结果返回数据列的数目
int columnCount = metaData.getColumnCount();
//创建对应长度的数组用于保存相应的列名
String [] colimNameArr=new String[columnCount];
//循环获取指定列名名存储至数组中
for (int i=0;i<colimNameArr.length;i++){
// colimNameArr[i]=metaData.getColumnName(i+1);
colimNameArr[i]=metaData.getColumnLabel(i+1);
}
rs = ps.executeQuery();
while(rs.next()){
//使用反射调用泛型类的无参构造方法创建对象
E e= c.newInstance();
//数组循环获取对应列的数据
for (String colName:colimNameArr) {
Object value = rs.getObject(colName);//获取指定列的数据
//使用反射获取指定属性
//获取代表当前列 指定类的属性类型
//获取指定名称的代表指定属性的类型对象
Field declaredField = c.getDeclaredField(colName);
//为指定属性的类型对象授权 (私有属性必须授权后才能使用)
declaredField.setAccessible(true);
//为指定对象 对应属性赋值
declaredField.set(e,value);
}
list.add(e);
}
return list;
}catch (Exception e){
e.printStackTrace();
return null;
}finally {
close(rs,con);
}
}
//关闭方法
public static void close(Connection con){
try {
con.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
public static void close(ResultSet rs,Connection con){
try {
rs.close();
con.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
// 自动生成当前连接数据库所有bean对象保存至指定包下
public static void autoGenerateAllBeanS(String beanUrl) {
try {
Connection con = getCon();
String sql = "show tables";
PreparedStatement ps = con.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
autoGenerateFormatBean(rs.getString(1), beanUrl);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void autoGenerateFormatBean(String tables, String beanUrl) {
String sql = "select * from " + tables;
try {
File directory = new File("");// 参数为空
String courseFile = directory.getCanonicalPath();// 获取当前项目路径
String replace = "src/" + beanUrl.replace(".", "/");
String beanNane = tables.toUpperCase().charAt(0) + tables.substring(1);// 当前类名
File file = new File(courseFile, replace + "/" + beanNane + ".java");// 当前类的文件对象
file.createNewFile();
Connection con = getCon();
PreparedStatement ps = con.prepareStatement(sql);
ResultSetMetaData metaData = ps.getMetaData();
// 创建map集合 key为列名 value为对应的java类型
HashMap<String, String> names = new HashMap<>();
// 创建list集合存储所有的属性(顺序)
ArrayList<String> nameList = new ArrayList<>();
for (int i = 0; i < metaData.getColumnCount(); i++) {
String columnLabel = metaData.getColumnLabel(i + 1);// 获取指定列名
String columnTypeName = metaData.getColumnTypeName(i + 1);// 获取列类型
names.put(columnLabel, dbTOjava(columnTypeName));
nameList.add(columnLabel);
}
FileWriter fw = new FileWriter(file);
BufferedWriter bw = new BufferedWriter(fw);
// 书写包
bw.write("package " + beanUrl + ";");
bw.newLine();
bw.newLine();
// 书写导入包
bw.write("import java.sql.*;");
bw.newLine();
bw.newLine();
// 书写类名
bw.write("public class " + beanNane + " {");
bw.newLine();
// 生成全部属性
for (String key : nameList) {
String value = names.get(key);
bw.write(" private " + value + " " + key + ";");
bw.newLine();
}
bw.newLine();
// 生成无参构造方法
bw.write(" public " + beanNane + "() {");
bw.newLine();
bw.write(" super();");
bw.newLine();
bw.write(" }");
bw.newLine();
bw.newLine();
// 生成全参构造方法
bw.write(" public " + beanNane + "(");
for (int i = 0; i < nameList.size(); i++) {
String key = nameList.get(i);
if (i != nameList.size() - 1) {
bw.write(names.get(key) + " " + key + ",");
} else {
bw.write(names.get(key) + " " + key);
}
}
bw.write(") {");
bw.newLine();
bw.write(" super();");
bw.newLine();
for (String key : nameList) {
bw.write(" this." + key + " = " + key + ";");
bw.newLine();
}
bw.write(" }");
bw.newLine();
bw.newLine();
// 生成全部属性对应getset方法
for (String key : nameList) {
String value = names.get(key);
bw.write(" public " + value + " get" + key.toUpperCase().charAt(0) + key.substring(1) + "() {");
bw.newLine();
bw.write(" return this." + key + ";");
bw.newLine();
bw.write(" }");
bw.newLine();
bw.newLine();
bw.write(" public void set" + key.toUpperCase().charAt(0) + key.substring(1) + "(" + value + " " + key
+ ") {");
bw.newLine();
bw.write(" this." + key + " = " + key + ";");
bw.newLine();
bw.write(" }");
bw.newLine();
bw.newLine();
}
for (int i = 0; i < nameList.size(); i++) {
String string = nameList.get(i);
nameList.set(i, string + "= \"+ " + string + " + \"");
}
// 生成toString方法
bw.write(" @Override");
bw.newLine();
bw.write(" public String toString() {");
bw.newLine();
bw.write(" return \"" + beanNane + " ");
bw.write(nameList.toString());
bw.write("\";");
bw.newLine();
bw.write(" }");
bw.newLine();
bw.write("}");
bw.flush();
bw.close();
} catch (Exception e) {
e.printStackTrace();
}
}
// 转换方法 将数据库列对象转换为指定java类型字符串
private static String dbTOjava(String type) {
if (type.equals("INT")) {
return "int";
} else if (type.equals("VARCHAR")||type.equals("CHAR")) {
return "String";
} else if (type.equals("DOUBLE")) {
return "double";
} else if (type.equals("FLOAT")) {
return "float";
}else if (type.equals("TIMESTAMP")||type.equals("DATETIME")||type.equals("DATE")||type.equals("TIME")){
return "Timestamp";
} else {
return "Object";
}
}
}
本文地址:https://blog.csdn.net/weixin_51311218/article/details/111872320