注解和反射写dao

  • 1. 注解的使用
  • 2. 使用注解体现映射关系
  • 针对上一篇文章,使用xml映射文件和反射实现dao,提出了扩展功能,利用注解来体现实体类和表的映射关系
  • 本文是上一篇文章的扩展
  • 使用反射和xml实现dao

1. 注解的使用

  • 什么是注解?
 @Overridepublic String toString() {return super.toString();}
  • @Override 就是一个注解,表示此方法是重写了父类的方法,此外还有许多Java里面的内置注解
  • 元注解(Retention, ElementType,Documented,Inherited)
  • 常用的两个元注解 (Retention, ElementType)
//定义注解在代码中的保留策略
@Retention(RetentionPolicy.RUNTIME)
//RetentionPolicy.RUNTIME 当前注解存在于源代码和编译后的class文件中,并加载到jvm中,可以在运行时获取
//RetentionPolicy.CLASS 当前注解存在于源代码和编译后的class文件中,但不会加载到jvm虚拟机
//RetentionPolicy.SOURCE 当前注解只存在于源代码中,不会编译到class文件中,也不会加载到jvm虚拟机
@Target(ElementType.TYPE) //指定当前注解能够用在什么地方
//ElementType.ANNOTATION_TYPE 当前注解可以使用在其他注解上
//ElementType.CONSTRUCTOR 当前注解可以用在构造函数上
//ElementType.FIELD 当前注解可以用在全局变量上
//ElementType.LOCAL_VARIABLE 当前注解可以用在局部变量上
//ElementType.METHOD 当前注解可以用在方法上
//ElementType.PACKAGE 当前注解可以用在包上
//ElementType.PARAMETER 当前注解可以用在参数上
//ElementType.TYPE 当前注解可以用在类型上
  • 自定义注解
package com.lovely.test;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.TYPE}) // 此注解只可用于属性 类型(接口,类...)
public @interface MyAnnotation {// 默认值// String name() default "default value: 123";String name();
}

2. 使用注解体现映射关系

  • 表注解,实体主键属性注解,实体类其它属性注解
package com.lovely.base;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Retention(RetentionPolicy.RUNTIME) // 运行时jvm可取到值
@Target(ElementType.TYPE) // 用来描述类
public @interface Table {String name(); // 定义属性
}
package com.lovely.base;@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD) // 用来描述属性的注解
public @interface Id {String idName();String idColumn();String seqName();
}
package com.lovely.base;@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Column {String columnName();
}
  • 以实体类goods为例
package com.lovely.entity;import java.sql.Date;import com.lovely.base.Column;
import com.lovely.base.Id;
import com.lovely.base.Table;/*** * @author echo lovely* * 注解的缺点 修改代码 要改变对应的列名**/
@Table(name="goods_info") // 表的信息可以反射得到
public class Goods {@Id(idName="gid", idColumn="goods_id", seqName="goods_seq")private Integer gid;@Column(columnName="goods_name")private String gname;@Column(columnName="goods_price")private Double gprice;@Column(columnName="goods_date")private Date gdate;@Column(columnName="goods_factory")private String gfactory;// 为减少代码/我去掉了set/get/构造
  • BaseDao里面增加了, 注解加载映射数据
public static HashMap<String, MapperData> map = new HashMap<String, MapperData>();static {// 利用注解解析 实体类和表的映射关系try {// 通过BaseDao 类的信息 拿到entity里面的所有类Class<?> baseDaoClass = Class.forName("com.lovely.dao.BaseDao");String filePath = baseDaoClass.getResource("/com/lovely/entity/").getFile();// System.out.println(filePath);File dir = new File(filePath);// 拿到所有类文件File[] files = dir.listFiles();for (File file : files) {// 类的全路径String className = "com.lovely.entity." + file.getName().substring(0, file.getName().indexOf("."));Class<?> entityClass = Class.forName(className);// 注解类型Table table = entityClass.getAnnotation(Table.class);// 实体类有注解 就可配置映射关系if (table != null) {MapperData mapperData = new MapperData();mapperData.setClassName(className);// 设置表名mapperData.setTableName(table.name());Field[] fields = entityClass.getDeclaredFields();for (int i = 0; i < fields.length; i++) {// id的注解Id id = fields[i].getAnnotation(Id.class);// System.out.println(id);if (id != null) {MapperId mapperId = new MapperId();mapperId.setIdName(id.idName());mapperId.setIdColumn(id.idColumn());mapperId.setSeqName(id.seqName());// 设置 主键映射关系到映射类mapperData.setMapperId(mapperId);}// 得到每个列的注解Column column = fields[i].getAnnotation(Column.class);if (column != null) {mapperData.getProperties().put(fields[i].getName(), column.columnName());}                       }map.put(className, mapperData);}}} catch (Exception e) {e.printStackTrace();}}
// 有了注解加载映射数据,就不要添加xml映射数据了。

注解和反射实现dao层增删改查相关推荐

  1. MySQL攻略 -DAO和增删改查通用方法-BasicDAO的认知与实现、案例练习

    文章目录 DAO和增删改查通用方法-BasicDao 分析问题 图形介绍 基本说明 应用实例 utils包 domain包 DAO包 test包 案例练习 DAO包 domain包 test包 DAO ...

  2. java servlet dao_Java+MyEclipse+Tomcat 详解Servlet和DAO数据库增删改查操作(源码)

    [实例简介] 该资源主要参考自己的博客http://blog.csdn.net/eastmount/article/details/45936121 讲诉Java+MyEclipse+Tomcat 详 ...

  3. MyBatisPlus:实现DAO的增删改查分页+属性设置,代码生成器(代码模板)

    1,MyBatisPlus入门案例与简介 这一节我们来学习下MyBatisPlus的入门案例与简介,这个和其他课程都不太一样,其他的课程都是先介绍概念,然后再写入门案例.而对于MyBatisPlus的 ...

  4. SpringBoot+MySql实现一对多再多对多的数据库的设计以及业务层增删改查的实现

    场景 SpringBoot+MySql+ElementUI实现一对多的数据库的设计以及增删改查的实现 https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article ...

  5. Java+MyEclipse+Tomcat (六)详解Servlet和DAO数据库增删改查操作

    此篇文章主要讲述DAO.Java Bean和Servlet实现操作数据库,把链接数据库.数据库操作.前端界面显示分模块化实现.其中包括数据的CRUD增删改查操作,并通过一个常用的JSP网站前端模板界面 ...

  6. [Java]完成Book的管理(entity/dao/test)增删改查操作[ArrayList]

    1.创建Entity /*** 完成Book的管理* 要求:有包entity/dao/test→查询,修改,删除,增加操作(ArrayList来存储)* @author Administrator** ...

  7. C#DAL层增删改查

    获取用户对象 查询 新增 删除 更新

  8. springcloud微服务实现增删改查

    随着微服务的出现,我们开发的效率比之前也快了很多,相比传统的开发模式,微服务提供的更加便捷,使我们开发人员开发速度有了很大的提高,为此我相比之前写的结合springcloud结合mybati实现增删改 ...

  9. Spring整合JDBCTemplate实现数据库增删改查操作

    SpringJDBC: 正常jdbc连接数据库流程: 1.注册驱动 2. 获取连接 2. 获取Statement或者PreparedStatement对象 3. 执行sql操作 4. 处理结果集 查询 ...

最新文章

  1. 报道 | 1899篇论文、1329个机构、6012位作者,NeurIPS 2020谁在独领风骚?
  2. 预训练模型transformers综合总结(一)
  3. GPU中与CUDA相关的几个概念
  4. android发送短信指定收件人,android-发送短信给收件人
  5. C#中的thread和task之Task
  6. 实现了发动机功能,支持Slider Motor、Hinge Motor、Hinge2 Motor。
  7. matlab层次分析法程序购置设备,[转载]MATLAB实现层次分析程序
  8. (32)Verilog HDL按位运算
  9. bzoj 5093 [Lydsy1711月赛]图的价值——第二类斯特林数
  10. SAP License:标准价格修改
  11. 1.深入分布式缓存:从原理到实践 --- 缓存为王
  12. linux awk sed经典题,awk与sed命令面试题整理
  13. 从Source Insight到Vim
  14. 在几何画板中如何制作圆柱的侧面展开动画_几何画板制作圆柱体的形成动画演示方法...
  15. 同步 IO 和异步 IO
  16. 是HTML+CSS的学习笔记捏
  17. HDU 1880魔咒词典
  18. 《Python语言程序设计》刘卫国主编字符串与正则表达式习题5详解(选择)
  19. 1334: PIPI计数
  20. 应用安全系列之二十九:密码管理

热门文章

  1. 前端学习(1607):跨域请求
  2. 前端学习(1359) :学生档案信息管理1
  3. 前端学习(1307):模块查找规则二
  4. 前端学习(982):jquery概述
  5. 前端学习(848):为什么学习节点操作和节点简介
  6. 前端学习(544):node的全局模块
  7. spring mvc学习(5):IDEA修改背景颜色大全
  8. 玩转oracle 11g(11):开启归档模式
  9. 实例33:python
  10. while(1)和while(0)