教育改变生活
标题:
利用注解自动生成插入sql
[打印本页]
作者:
一秉
时间:
2020-7-12 21:20
标题:
利用注解自动生成插入sql
1、在项目开发过程中,简单的插入sql可以通过注解实现自动生成sql
2、准备两个注解,分别是Table和Column,Table可记录表的信息,Column可记录字段的信息,通过这两个注解可以将JavaBean和数据库建立连接。
3、
Table注解代码如下:
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
public String name();
}
Column代码如下:
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
public String name();//通过该字段可将属性和数据库字段对应起来
public Class<?> type() default String.class;//该字段可将
}
JavaBean的代码如下:(不包含Get和Set方法)
@Table(name="jiudian")
public class Hotel {
@Column(name = "id", type = Integer.class)
private Integer id;
private String name;
private String dizhi;
private String style;
private String info;
private String pic;
private String tel;
...
}
自动生成插入sql代码如下:
public static boolean insertWithoutId(Object value) {
String sql = "insert into ";
Table table = value.getClass().getAnnotation(Table.class);
String columns = "( ";
String values = "( ";
//getDeclaredFields 获取当前类的所有属性
Field[] fields = value.getClass().getDeclaredFields();
List<Object> vals = new ArrayList<Object>();
//通过反射获取字段和注解,如果不存在注解,则默认数据库字段和属性一致,并且为varchar类型
for (Field field : fields) {
//insert into table (userName, ) values (?, )
if (!field.getName().equals("id")) {
Column column = field.getAnnotation(Column.class);
if (null != column ) {
columns = columns + " " + column.name() + ", ";
} else {
columns = columns + field.getName() + ",";
}
values = values + " ?, ";
//userName getUserName -> getUserName
try {
String name = field.getName();
String methodName = "get" + name.substring(0,1).toUpperCase() + name.substring(1);
//动态的调用getUserName方法
Method method = value.getClass().getDeclaredMethod(methodName);
vals.add(method.invoke(value));//通过调用getXxx方法,获取对象的值,装入列表中
} catch (Exception e) {
}
}
}
columns = columns.substring(0, columns.lastIndexOf(",")) + " ) ";
values = values.substring(0, values.lastIndexOf(",")) + " )";
sql = sql + table.name() + columns +" values " + values;
Connection conn = DbUtils.getConnection();
PreparedStatement ps = null;
try {
ps = conn.prepareStatement(sql);
for (int i = 0 ; i < vals.size(); i++) {
ps.setObject(i+1, vals.get(i));//通过setObject可以给预执行文件设置值
}
ps.execute();
return true;
} catch (SQLException e) {
return false;
} finally {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
}
}
}
}
欢迎光临 教育改变生活 (http://bbs.goldoar.com/)
Powered by Discuz! X3.2