zoukankan      html  css  js  c++  java
  • Java注解(三)

    上一篇了解了自定义注解的使用,不过里面的例子没有多大使用价值,这一回来个有用点的Demo。

    目标:将实体bean保存到数据库

    先来定义一个实体注解

    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Target(ElementType.TYPE)  
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Entity {
        String getTableName();
    }

    这个注解可用在类上,它有一个变量参数getTableName。

    其实意义很明显,就是一个实体类对应一张数据库的表,通过Entity注解将类和数据库表名关联起来

    那么,通过什么将类的参数和数据库表中的列关联起来呢?再来定义一个注解

    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Target(ElementType.FIELD) 
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Column {
        String getName();
    }

    有了Column注解,类里面的属性就和表中的列关联起来了。

    下面来看看POJO中怎么用这两个注解:

    @Entity(getTableName = "user")
    public class User {
        @Column(getName = "user_id")
        private String id;
        @Column(getName = "user_name")
        private String name;
        @Column(getName = "user_age")
        private int age;
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    }

    通过Entity和Column注解,就将一个实体bean和一张数据库表连接起来了。很多ORM映射就是采取这种方式实现的。

    最后,来感受一下注解给我们带来的便利,来个方法见证下~~

    import java.lang.reflect.Field;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    
    public class Session {
        public static void main(String[] args) {
            Session session = new Session();
            System.out.println(session.getInsertSql(new User()));
        }
    
        //在实际项目中,你可以save(obj)方法来保存一个bean
        public void save(Object obj) {
            // get a connection
            //PreparedStatement pstmt = getStatement(con, obj);
            //pstmt.execute();
        }
    
        //得到PreparedStatement
        public PreparedStatement getStatement(Connection con, Object obj)
                throws Exception {
            PreparedStatement pstmt = con.prepareStatement(getInsertSql(obj));
            Class<?> c = obj.getClass();
            Field[] fs = c.getDeclaredFields();
            for (int i = 0; i < fs.length; i++) {
                fs[i].setAccessible(true);
                pstmt.setObject(i + 1, fs[i].get(obj));
            }
            return pstmt;
        }
    
        //insert into tableName(ziduan1,ziduan2...) values(?,?...)
        public String getInsertSql(Object obj) {
            StringBuilder s = new StringBuilder();
            s.append("insert into ");
    
            Class<?> c = obj.getClass();
            String tableName = c.getSimpleName();//类名,不包含包名 User
            Entity entity = (Entity) c.getAnnotation(Entity.class);
            if (entity != null) {
                tableName = entity.getTableName();
            }
            s.append(tableName).append("(");
            Field[] fs = c.getDeclaredFields();
    
            for (int i = 0; i < fs.length; i++) {
                String fieldName = fs[i].getName();
                Column column = fs[i].getAnnotation(Column.class);
                if (column != null) {
                    fieldName = column.getName();
                }
                s = i == 0 ? s.append(fieldName) : s.append(",").append(fieldName);
            }
            s.append(") values").append(getString(fs.length));
            return s.toString();
    
        }
    
        //得到(?,?,?,...?,?)
        private String getString(int length) {
            StringBuilder s = new StringBuilder();
            s.append("(");
            for (int i = 0; i < length; i++) {
                s = i == 0 ? s.append("?") : s.append(",?");
            }
            s.append(")");
            return s.toString();
        }
    }

     OK,That's all!

  • 相关阅读:
    linux查看端口被占用等常用命令
    python批量修改文件内容及文件编码方式的处理
    为什么在Python里推荐使用多进程而不是多线程
    python小练习之读取文件写入excel
    python 小练习之生成手机号码
    python 小练习之删除文件夹下的所有文件,包括子文件夹中的文件
    python中 字符 字典 列表之间的转换
    统计表中 重复出现 XX次以上的数据
    java数据类型
    字符编码和python使用encode,decode转换utf-8, gbk, gb2312
  • 原文地址:https://www.cnblogs.com/yejg1212/p/3188791.html
Copyright © 2011-2022 走看看