注解和反射实现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映射数据了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/420836.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1008 数组元素循环右移问题 (20分)

输入样例: 6 2 1 2 3 4 5 6 输出样例: 5 6 1 2 3 4 # -*- coding: utf-8 -*- import mathdef right_shift(lst, m):n len(lst)m m % nfor j in range(math.gcd(m, n)):temp lst[j]i jwhile (i - m) % n > j:lst[i] lst[(i - m) % n]i (i - m) % nlst[i] tempretur…

其它数据类型和Json的转化

1.ResultSet→Json public static String resultSetToJson(ResultSet rs) throws SQLException,JSONException { // json数组 JSONArray array new JSONArray(); // 获取列数 ResultSetMetaData metaData rs.getMetaData(); int columnCount metaData.getColumnCount(…

MVC分层开发模式

MVC 1. 什么是mvc开发模式2. 基于servlet手写mvc框架1. 什么是mvc开发模式 mvc不是一种技术&#xff0c;只是一种开发模式使用分层开发模式能在大型项目中&#xff0c;让开发人员更好的协同工作便于项目的维护和扩展 M: Model 模型层->数据库层->daoV: View 视图层->…

1009 说反话 (20分)

1009 说反话 (20分) 给定一句英语&#xff0c;要求你编写程序&#xff0c;将句中所有单词的顺序颠倒输出。 输入格式&#xff1a; 测试输入包含一个测试用例&#xff0c;在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成&#xff0c;其中单词是由英文字…

C#_uploadify_mvc_version

jQuery Uploadify在ASP.NET MVC3中的使用 1、Uploadify简介 Uploadify是基于jQuery的一种上传插件&#xff0c;支持多文件、带进度条显示上传&#xff0c;在项目开发中常被使用。 Uploadify官方网址&#xff1a;http://www.uploadify.com/ 2、ASP.NET MVC3中的使用Uploadify 搭…

1010 一元多项式求导 (25分)

输入样例: 3 4 -5 2 6 1 -2 0 输出样例: 12 3 -10 1 6 0 # -*- coding: utf-8 -*-def get_derivation(lst):length len(lst)idx 0while idx < length:if lst[idx 1] ! 0:lst[idx] * lst[idx 1]lst[idx 1] - 1else:lst[idx] 0idx 2return lstif __name__ __main__…

VS2012 发布网站步骤

VS2012中发布网站的方式与以往有了不同&#xff0c;前面的版本发布如图 而2012点publish的时候弹出框有所不同&#xff0c;这边需要新建一个profile名字随便起&#xff0c;发布的方式有好几种&#xff0c; 当然不同的方式配置不同&#xff0c;用的最多的就是files system了 选择…

python 生成个性二维码

1. 效果 gif 图片二维码 带背景图二维码&#xff08;修改了&#xff09; 2. 依赖库 核心库myqr pip install myqr其它依赖库安装pip install pip install pillow, numpy, imageio3. 核心代码 我这里是F盘下的joy文件夹下面代码改变路径&#xff0c;图片名称参数即可 im…

1011 A+B 和 C (15分)

输入样例&#xff1a; 4 1 2 3 2 3 4 2147483647 0 2147483646 0 -2147483648 -2147483647 输出样例&#xff1a; Case #1: false Case #2: true Case #3: true Case #4: false # -*- coding: utf-8 -*-if __name__ __main__:n eval(input())input_list []for i in range…

SharePoint 2013:解决添加域名后每次都需要登录的问题

在SharePoint 2013中&#xff0c;当我们添加一个域名给SP后&#xff08;添加域名的方法请参考此文&#xff1a;http://www.cnblogs.com/jianyus/archive/2013/08/10/3249461.html &#xff09;&#xff0c;每次用域名访问都需要输入用户名和密码&#xff0c;即使该用户已经正确…

1012 数字分类 (20分)

输入样例 1&#xff1a; 13 1 2 3 4 5 6 7 8 9 10 20 16 18 输出样例 1&#xff1a; 30 11 2 9.7 9 输入样例 2&#xff1a; 8 1 2 4 5 6 7 9 16 输出样例 2&#xff1a; N 11 2 N 9 # -*- coding: utf-8 -*-def class_numbers(nums):arr [0] * 5exists [0] * 5flag1 1…

mvc框架upgrade

upgrade...1. actionservlet核心控制器更改以上1&#xff0c;2点2. 工具类&#xff08;对反射拿到的属性对象数据转型&#xff09;3. 业务服务类使用适配器设计模式针对上一篇文字做出了改造&#xff0c;既然要写手写lowb版mvc框架&#xff0c;就得付出一定代价&#xff0c;加大…

discuz中又拍云在ie8,chrome22下不能上传的问题

chrome22: 解决方法&#xff1a;http://www.baidufe.com/item/b17db6c1136a986b4272.html ie8&#xff1a;flash不能生成 重新安装flash player 14转载于:https://www.cnblogs.com/zhaozhilu/p/3807440.html

1013 数素数 (20分)

输入样例&#xff1a; 5 27 输出样例&#xff1a; 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 # -*- encoding: utf-8 -*- import mathdef get_primes(n):prime_list [1] * (n 1)for i in range(2, int(math.sqrt(n)) 1):if prime_list[i]…

Oracle 更新Opatch、打补丁

1.更新Opatch; 2.打补丁; 3.grid 打补丁; 1.更新Opatch(实验版本:oracle:11.2.0.3.0): 默认安装数据库后,在ORACLE_HOME 下会有个OPatch 文件夹,更新前先检查当前Opatch 版本: 1: [oraclesywu2 OPatch]$ ./opatch lsinventory 2: Invoking OPatch 11.2.0.1.7 3: 4: Ora…

jQuery学习--选择器的使用

jQuery基本选择器1. jQuery的ready事件 -> js的onload2. 选择器的使用1. jQuery的ready事件 -> js的onload 大多是第一种&#xff0c;匿名函数写法 <script type"text/javascript">// 匿名函数写法 ready 开始函数$(function() {// -> js的窗体加载事…

jQuery复选框多选问题

<html><head><title>work.html</title><script type"text/javascript" src"js/jquery-3.2.1.js"> </script><script type"text/javascript">$(function() { // 全选 / 全不选$($("#CheckedAll&…

1014 福尔摩斯的约会 (20分)

输入样例&#xff1a; 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm 输出样例&#xff1a; THU 14:04 # -*- coding: utf-8 -*- import stringweek {A: MON,B: TUE,C: WED,D: THU,E: FRI,F: SAT,G: SUN}hour {0:00, 1:01, 2:02, 3:03, 4:04, 5:05, 6:0…