网络

教育改变生活

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 924|回复: 0
打印 上一主题 下一主题

利用注解自动生成插入sql

[复制链接]

97

主题

98

帖子

447

积分

版主

Rank: 7Rank: 7Rank: 7

积分
447
跳转到指定楼层
楼主
发表于 2020-7-12 21:20:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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) {
                }
            }
        }
        
    }
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

WEB前端

QQ|手机版|小黑屋|金桨网|助学堂  咨询请联系站长。

GMT+8, 2024-12-22 17:26 , Processed in 0.031594 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表