一、Java 反射机制
二、利用反射实现数据库操作
三、数据对象与json的转换
一、Java 反射机制
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。
二、利用反射实现数据库操作
数据库操作,反射的好处:
(1) dao 层只需要编写一次基础数据库类操作代码(比如,增删改查等等),就可以充分利用继承关系实现不同模型的数据库操作。
(2) 修改数据库的表字段基本上不用大的修改 dao 层的代码(比如 sql 语句等等)
本例工程的目录组织结构大致如下:
也可以将 LTBeanMapConverter.java 放到 dao.common 包中。
1、本实例使用 mysql 数据库。基础配置文件,请参考上一篇文章《MySQL + Tomcat 工程》 http://www.cnblogs.com/matchboxy/articles/4113834.html
2、编写 model 类,本例中为 LTNews.java 类。
1 packagecom.matchbox.model.news;2
3 importjava.io.Serializable;4
5 importjavax.persistence.Column;6 importjavax.persistence.GeneratedValue;7 importjavax.persistence.GenerationType;8 importjavax.persistence.Id;9 importjavax.persistence.Table;10
11
12 /**
13 *@authorMATCH14 * @date 14-12-2915 */
16
17
18 @Table(name="news")19 public class LTNews implementsSerializable20 {21 private longid;22 private longtime;23 privateString url;24 privateString imgUrl;25 privateString type;26 privateString title;27 privateString author;28 privateString source;29 privateString outline;30 private intlanguage;31 private intfavourite;32 private intcomment;33 private intclick;34
35 @Column(name="id")36 @Id37 @GeneratedValue(strategy =GenerationType.IDENTITY)38 public longgetId() {39 returnid;40 }41
42 public void setId(longid) {43 this.id =id;44 }45
46 @Column(name="time")47 public longgetTime() {48 returntime;49 }50
51 public void setTime(longtime) {52 this.time =time;53 }54
55 @Column(name="url")56 publicString getUrl() {57 returnurl;58 }59
60 public voidsetUrl(String url) {61 this.url =url;62 }63
64 @Column(name="imgUrl")65 publicString getImgUrl() {66 returnimgUrl;67 }68
69 public voidsetImgUrl(String imgUrl) {70 this.imgUrl =imgUrl;71 }72
73 @Column(name="type")74 publicString getType() {75 returntype;76 }77
78 public voidsetType(String type) {79 this.type =type;80 }81
82 @Column(name="title")83 publicString getTitle() {84 returntitle;85 }86
87 public voidsetTitle(String title) {88 this.title =title;89 }90
91 @Column(name="author")92 publicString getAuthor() {93 returnauthor;94 }95
96 public voidsetAuthor(String author) {97 this.author =author;98 }99
100 @Column(name="source")101 publicString getSource() {102 returnsource;103 }104
105 public voidsetSource(String source) {106 this.source =source;107 }108
109 @Column(name="outline")110 publicString getOutline() {111 returnoutline;112 }113
114 public voidsetOutline(String outline) {115 this.outline =outline;116 }117
118 @Column(name="language")119 public intgetLanguage() {120 returnlanguage;121 }122
123 public void setLanguage(intlanguage) {124 this.language =language;125 }126
127 @Column(name="favourite")128 public intgetFavourite() {129 returnfavourite;130 }131
132 public void setFavourite(intfavourite) {133 this.favourite =favourite;134 }135
136 @Column(name="comment")137 public intgetComment() {138 returncomment;139 }140
141 public void setComment(intcomment) {142 this.comment =comment;143 }144
145 @Column(name="click")146 public intgetClick() {147 returnclick;148 }149
150 public void setClick(intclick) {151 this.click =click;152 }153 }
LTNews.java
其中:@Table(name="news") 为 news 数据库表。
@Column(name="id")
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
为表中列名为 id 的列为主键,自增长类型。每一个 @Column(name="***") 写在 get 方法前面,对应数据表中的列名到相应的属性,一般来讲属性名最好与列名一致。
3、编写基础接口类 dao.common.LTGenericDao.java ,主要声明一些要实现的数据库操作。
1 packagecom.matchbox.dao.common;2
3 importjava.io.Serializable;4 importjava.util.List;5 importjava.util.Map;6
7
8 /**
9 *@authorMATCH10 * @date 14-12-3011 */
12
13
14 public interface LTGenericDao
15 {16 publicString getTableName();17 publicString getPk();18 public ListgetAll();19 public longgetCount();20
21 publicID insert(T object);22 public List insertBatch(ListlistObject);23
24 public intdelete(ID id);25 public int deleteBatch(ListlistIds);26
27 public intupdate(T object);28
29 publicT select(ID id);30 public List selectByIds(Listids);31 public List selectByMap(Mapmap);32 }
LTGenericDao.java
这里需要运用模板的知识,其中: T 为模型类的 class , ID 为模型类对应的表的主键类型。
4、编写基础实现类 dao.common.impl.LTGenericDaoImpl.java ,提供接口类的基础实现。
1 packagecom.matchbox.dao.common.impl;2
3 importjava.beans.BeanInfo;4 importjava.beans.IntrospectionException;5 importjava.beans.Introspector;6 importjava.beans.PropertyDescriptor;7 importjava.io.Serializable;8 importjava.sql.Connection;9 importjava.sql.PreparedStatement;10 importjava.sql.SQLException;11 importjava.sql.Statement;12 importjava.sql.Types;13 importjava.util.ArrayList;14 importjava.util.Arrays;15 importjava.util.Date;16 importjava.util.HashMap;17 importjava.util.List;18 importjava.util.Map;19
20 importjavax.persistence.Column;21 importjavax.persistence.GeneratedValue;22 importjavax.persistence.GenerationType;23 importjavax.persistence.Id;24 importjavax.persistence.Table;25 importjavax.persistence.Transient;26
27 importorg.apache.commons.beanutils.BeanUtils;28 importorg.apache.commons.lang.StringUtils;29 importorg.springframework.core.annotation.AnnotationUtils;30 importorg.springframework.jdbc.core.JdbcTemplate;31 importorg.springframework.jdbc.core.PreparedStatementCreator;32 importorg.springframework.jdbc.core.support.JdbcDaoSupport;33 importorg.springframework.jdbc.support.GeneratedKeyHolder;34 importorg.springframework.jdbc.support.KeyHolder;35
36 importcom.matchbox.dao.common.LTGenericDao;37 importcom.matchbox.dao.co