注解和反射实现dao层增删改查
注解和反射写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层增删改查相关推荐
- MySQL攻略 -DAO和增删改查通用方法-BasicDAO的认知与实现、案例练习
文章目录 DAO和增删改查通用方法-BasicDao 分析问题 图形介绍 基本说明 应用实例 utils包 domain包 DAO包 test包 案例练习 DAO包 domain包 test包 DAO ...
- java servlet dao_Java+MyEclipse+Tomcat 详解Servlet和DAO数据库增删改查操作(源码)
[实例简介] 该资源主要参考自己的博客http://blog.csdn.net/eastmount/article/details/45936121 讲诉Java+MyEclipse+Tomcat 详 ...
- MyBatisPlus:实现DAO的增删改查分页+属性设置,代码生成器(代码模板)
1,MyBatisPlus入门案例与简介 这一节我们来学习下MyBatisPlus的入门案例与简介,这个和其他课程都不太一样,其他的课程都是先介绍概念,然后再写入门案例.而对于MyBatisPlus的 ...
- SpringBoot+MySql实现一对多再多对多的数据库的设计以及业务层增删改查的实现
场景 SpringBoot+MySql+ElementUI实现一对多的数据库的设计以及增删改查的实现 https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article ...
- Java+MyEclipse+Tomcat (六)详解Servlet和DAO数据库增删改查操作
此篇文章主要讲述DAO.Java Bean和Servlet实现操作数据库,把链接数据库.数据库操作.前端界面显示分模块化实现.其中包括数据的CRUD增删改查操作,并通过一个常用的JSP网站前端模板界面 ...
- [Java]完成Book的管理(entity/dao/test)增删改查操作[ArrayList]
1.创建Entity /*** 完成Book的管理* 要求:有包entity/dao/test→查询,修改,删除,增加操作(ArrayList来存储)* @author Administrator** ...
- C#DAL层增删改查
获取用户对象 查询 新增 删除 更新
- springcloud微服务实现增删改查
随着微服务的出现,我们开发的效率比之前也快了很多,相比传统的开发模式,微服务提供的更加便捷,使我们开发人员开发速度有了很大的提高,为此我相比之前写的结合springcloud结合mybati实现增删改 ...
- Spring整合JDBCTemplate实现数据库增删改查操作
SpringJDBC: 正常jdbc连接数据库流程: 1.注册驱动 2. 获取连接 2. 获取Statement或者PreparedStatement对象 3. 执行sql操作 4. 处理结果集 查询 ...
最新文章
- 报道 | 1899篇论文、1329个机构、6012位作者,NeurIPS 2020谁在独领风骚?
- 预训练模型transformers综合总结(一)
- GPU中与CUDA相关的几个概念
- android发送短信指定收件人,android-发送短信给收件人
- C#中的thread和task之Task
- 实现了发动机功能,支持Slider Motor、Hinge Motor、Hinge2 Motor。
- matlab层次分析法程序购置设备,[转载]MATLAB实现层次分析程序
- (32)Verilog HDL按位运算
- bzoj 5093 [Lydsy1711月赛]图的价值——第二类斯特林数
- SAP License:标准价格修改
- 1.深入分布式缓存:从原理到实践 --- 缓存为王
- linux awk sed经典题,awk与sed命令面试题整理
- 从Source Insight到Vim
- 在几何画板中如何制作圆柱的侧面展开动画_几何画板制作圆柱体的形成动画演示方法...
- 同步 IO 和异步 IO
- 是HTML+CSS的学习笔记捏
- HDU 1880魔咒词典
- 《Python语言程序设计》刘卫国主编字符串与正则表达式习题5详解(选择)
- 1334: PIPI计数
- 应用安全系列之二十九:密码管理