java动态生成sql语句开元_JAVA自定义注解实现SQL语句自动生成DEMO(2)

上一篇:http://blog.csdn.net/uckyk/article/details/76619013

SqlUtil增添了一个新功能,就是自动生成sql时候,传入已经定义好的对象,即可获得inser语句(带值)

上代码!

package com.ucky.annotation.hibernate;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

import java.util.Date;

import java.util.HashMap;

import java.util.Map;

/**

* 生成建表语句

*/

public class SqlUtil {

/*

* 生成创建table语句

* */

public static String create(Class> clazz) {

StringBuilder sb = new StringBuilder();

String tableName = getTableName(clazz);

if (null == tableName || "".equals(tableName)) {

return null;

}

sb.append("CREATE TABLE ").append(tableName).append("(");

Map columnMap = getColumn(clazz);

for (Map.Entry entry : columnMap.entrySet()) {

sb.append(entry.getKey());

sb.append(" ");

sb.append(entry.getValue());

sb.append(",");

}

sb.deleteCharAt(sb.length() - 1);

sb.append(")");

return sb.toString();

}

/*

* 生成插入语句

* */

public static String insert(Class> clazz) {

StringBuilder sb = new StringBuilder();

String tableName = getTableName(clazz);

sb.append("INSERT INTO ").append(tableName).append(" (");

Map columnMap = getColumn(clazz);

for (Map.Entry entry : columnMap.entrySet()) {

sb.append(entry.getKey());

sb.append(",");

}

sb.deleteCharAt(sb.length() - 1);

sb.append(") ").append("VALUES").append("(");

for (int i = 0; i < columnMap.size(); i++) {

sb.append("?").append(",");

}

sb.deleteCharAt(sb.length() - 1);

sb.append(")");

return sb.toString();

}

public static String delete() {

return null;

}

/*

* 获取表名称

* */

public static String getTableName(Class> clazz) {

//判断是否为Table注释类型是方法返回true,否则返回false

if (clazz.isAnnotationPresent(Table.class)) {

//获取注解信息

Table table = clazz.getAnnotation(Table.class);

if(!"".equals(table.name())){

return table.name();

}

}

return null;

}

/*

* 获取字段信息的Map

* */

public static Map getColumn(Class> clazz) {

Map columns = new HashMap();

//通过反射取得所有Field,因为table那里是注解指定的注解,类型,column是对应方法上的所以不能class.isAnnotationPresent直接判断

Field[] fields = clazz.getDeclaredFields();

if (fields != null) {

String columnName, type;

Column column;

for (int i$ = 0; i$ < fields.length; i$++) {

//判断当前field是否为Column注解

if (fields[i$].isAnnotationPresent(Column.class)) {

//获取注解对象

column = fields[i$].getAnnotation(Column.class);

columnName = column.name();

if("".equals(columnName)){

throw new RuntimeException("未找到对应字段名:" + i$);

}

//根据不同类型生成不同的SQL

if (int.class.isAssignableFrom(fields[i$].getType())) {

type = "int";

} else if (String.class.isAssignableFrom(fields[i$].getType())) {

type = "String";

} else if (Date.class.isAssignableFrom(fields[i$].getType())) {

type = "Date";

} else {

throw new RuntimeException("不支持数据类型:" + fields[i$].getType().getSimpleName());

}

type += (column.isNull() ? " " : " NOT NULL");

columns.put(columnName, type);

} else if (fields[i$].isAnnotationPresent(PrimaryKey.class)) {

PrimaryKey primaryKey = fields[i$].getAnnotation(PrimaryKey.class);

//将一个类的成员变量置为private,其实我也不知道啥意思,有知道的指点一下 ,谢谢!

fields[i$].setAccessible(true);

columnName = primaryKey.name();

if("".equals(columnName)){

throw new RuntimeException("未找到对应主键名" );

}

type = "INT PRIMARY KEY AUTO_INCREMENT";

columns.put(columnName, type);

}

}

}

return columns;

}

public static String insert(Class clazz , T entity){

Field[] fields = entity.getClass().getDeclaredFields();

String sql = insert(clazz);

for(int i$ = 0; i$

//获取字段信息名

String columnValue = fields[i$].getName();

columnValue = columnValue.substring(0,1).toUpperCase() + columnValue.substring(1);

try {

Method method = entity.getClass().getMethod("get" + columnValue);

String value = (String)method.invoke(entity).toString();

sql = sql.replaceFirst("\\?",value);

} catch (Exception e) {

e.printStackTrace();

}

}

return sql;

}

}

代码主要添加最后下面那些,方法有一些骚骚的,自己构造出来了一个getXxxx方法,然后repalceFirst取代,其他部分代码,在上面链接里面,

测试代码:

public class test {

public static void main(String[] args){

System.out.println(SqlUtil.create(Person.class));

System.out.println(SqlUtil.insert(Person.class));

Person p =new Person();

p.setId(1);

p.setName("111");

System.out.println(SqlUtil.insert(Person.class,p));

}

}

结果如下:

CREATE TABLE person(name String NOT NULL,id INT PRIMARY KEY AUTO_INCREMENT)

INSERT INTO person (name,id) VALUES(?,?)

INSERT INTO person (name,id) VALUES(1,111)

啦啦啦啦啦啦~~~~~~解决了,如果大神们有更好的方法解决 还望赐教!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用Java代码来生成SQL脚本。具体的步骤如下: 1. 连接数据库:使用Java提供的JDBC驱动程序连接到数据库。 ```java Connection conn = DriverManager.getConnection(url, username, password); ``` 2. 查询数据:使用SELECT语句查询数据并将结果保存在ResultSet对象中。 ```java Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM my_table"); ``` 3. 生成INSERT语句:遍历ResultSet对象并将每一行数据插入到INSERT语句中。 ```java StringBuilder sb = new StringBuilder(); while (rs.next()) { sb.append("INSERT INTO my_table (col1, col2, col3) VALUES ("); sb.append(rs.getInt("col1")).append(","); sb.append("'").append(rs.getString("col2")).append("',"); sb.append(rs.getDouble("col3")).append(");\n"); } ``` 4. 将INSERT语句保存到文件中:将生成的INSERT语句保存到文件中。 ```java FileWriter writer = new FileWriter("my_script.sql"); writer.write(sb.toString()); writer.close(); ``` 完整的Java代码如下: ```java import java.io.FileWriter; import java.sql.*; public class GenerateSqlScript { public static void main(String[] args) throws Exception { String url = "jdbc:mysql://localhost/my_database"; String username = "root"; String password = ""; Connection conn = DriverManager.getConnection(url, username, password); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM my_table"); StringBuilder sb = new StringBuilder(); while (rs.next()) { sb.append("INSERT INTO my_table (col1, col2, col3) VALUES ("); sb.append(rs.getInt("col1")).append(","); sb.append("'").append(rs.getString("col2")).append("',"); sb.append(rs.getDouble("col3")).append(");\n"); } FileWriter writer = new FileWriter("my_script.sql"); writer.write(sb.toString()); writer.close(); rs.close(); stmt.close(); conn.close(); } } ``` 这段代码将生成一个名为my_script.sql的文件,其中包含INSERT语句,可以用于将数据插入到另一个数据库或用于备份数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值