当前位置: 首页 > news >正文

网站做3年3年包括什么软件吗企业关键词优化公司

网站做3年3年包括什么软件吗,企业关键词优化公司,虚拟机如何做网站,全国旅游服务平台1. 前言 本节和大家一起聊聊 Hibernate 是如何自动生成 SQL 语句的。通过本节的学习,你将了解到: 反射在框架中的重要性;元数据描述对 Hibernate 的重要性。 2. 理想状态 Hibernate 是全自动的 JDBC 框架,能自动构建 SQL 语句、…

1. 前言

本节和大家一起聊聊 Hibernate 是如何自动生成 SQL 语句的。通过本节的学习,你将了解到:

  • 反射在框架中的重要性;
  • 元数据描述对 Hibernate 的重要性。

2. 理想状态

Hibernate 是全自动的 JDBC 框架,能自动构建 SQL 语句、能自动封装数据。

做为开发者,不能在使用的便利性中迷失自己,应该要学会多思考:Hibernate 是如何自动构建 SQL 语句的?

答案本身很简单:使用反射机制。

先来一个最理想化的构建实例:假设实体类名和表名相同、实体类中的属性和表中的字段命名相同。

编写自己的 Session 类:

public class MySession<T> {public T  get(Class clz,Serializable id) {	String sql=createSql(clz,id);//其它操作……	return null;}private String createSql(Class clz, Serializable id) {		return null;}
}

get()方法接受 2 个参数,这 2 个参数便是构建 SQL 的核心。传递给内部的 createSql()方法用来进行 SQL 语句构造。

关注 createSql() 方法中的代码:

(1)声明变量。

 // SQL 查询模板String sql = "select {0} from {1} where {2}= {3}";// 表名String tableName = null;// 字段列表StringBuffer selFields = new StringBuffer();// 主键字段String keyField = null;

(2)看来就是要为 SQL 查询模板中的占位符找到具体值。因为类名和表名相同,所以表名很容易找到。

 // 类名就是表名tableName = clz.getSimpleName();

(3)因为属性名与表中的字段名相同,所以表的字段信息也很容易找到。

 // 属性名就是查询的字段名,找到属性等于找到字段信息Field[] fields = clz.getDeclaredFields();

(4)这里有一个较麻烦的地方,怎么找到主键字段,这里假设第一个属性对应的是主键字段。

 Field[] fields = clz.getDeclaredFields();for (int i = 0; i < fields.length; i++) {if (i == 0)keyField = fields[i].getName();selFields.append(fields[i].getName()).append(",");}// 删除最后一个,selFields.deleteCharAt(selFields.length() - 1);

(5)最后构建 SQL 。

 sql = MessageFormat.format(sql, new Object[] {selFields,tableName,keyField,id});

测试输出大家自己去完成。

3. 非理想状态

前面假设了一种特别理想的状态。但是,现实总比理想残酷。

很多情况下,表名与类名、属性名和字段名都不同名,主键字段对应的属性也不一定放在第一个。

这种情形下,又如何构建 SQL 。此时,注解就起到了作用。大家还记得常用的注解吗?

  • @Table;
  • @Id;
  • @Column。

有了这 3 个注解,查找表名、字段信息、主键字段就不需要再靠强制性的代码规范了。

重构 createSql() 方法中的代码。

本质上没有发生改变,还是为 SQL 查询模板中的占位符找到所有具体值。

(1)找到表名。其本思路是,如果有 @Table 注解,表名就是注解提供的名字,如果没有注解,则表名与类名相同;

 // 查找类上面是否有 @Table 注解Table tableAnnotaion= (Table) clz.getAnnotation(Table.class);if(tableAnnotaion==null) //则认为类名与表名相同tableName = clz.getSimpleName();else //表名为注解中提供的值tableName=tableAnnotaion.name();

(2)找到表的所有字段信息。为了简化代码,假设 @Id 或 @Column 注解直接标注在属性上面。即使标注在 get()方法上面也不难;

 // 属性信息Field[] fields = clz.getDeclaredFields();//是否存在 @Id 注解boolean ishasIdAnnotation = false;Id idAnnotation=null;Column columnAnnotation = null;String fieldName = null;for (Field field : fields) {// @Id 注解idAnnotation = field.getAnnotation(Id.class);// @ Column 注解columnAnnotation = field.getAnnotation(Column.class);if (idAnnotation != null) {keyField = field.getName();ishasIdAnnotation = true;}if (columnAnnotation == null)// 有 @Column 注解则从注解中取值fieldName = field.getName();else//没有 @Column 注解则和属性表相同fieldName = columnAnnotation.name();selFields.append(fieldName).append(",");}if (!ishasIdAnnotation) {throw new Exception("@Id 注解是必须的!");}// 删除最后一个,selFields.deleteCharAt(selFields.length() - 1);

(3)构建 SQL 语句。

 sql = MessageFormat.format(sql, new Object[] { selFields, tableName, keyField, id });

测试 createSql()方法,在控制台可看到通过反射自动构建的 SQL 语句:

select stuId,stuName,stuSex,stuPassword from student where stuId= 1

测试结果需要以你自己的实体类和表做参考。

4. 小结

本节给出了 2 种情形下构建 SQL 语句的实现。

一种对编码规范要求非常严格,因为编码规范有很多人为因素,很难保证类结构和表结构如同镜像,不出现差异性。显然,在这种严格的编码规范下,构建 SQL 的性能消耗是最低的,所以,一入职场,第一堂课就是培训编码规范性。

第二种情形应该是一种常态,所以需要使用注解的方式标识差异性,当然,反射时付出的性能代价会增加。

本节没有讨论构建多表查询的实现,有了这些基础,相信都将不会很难。

http://www.hkea.cn/news/789803/

相关文章:

  • wordpress文件解析外贸网站优化
  • 建设工程竣工备案网站百度保障中心人工电话
  • 韶关城乡建设部网站首页营销型网站建设策划书
  • 建设银行手机银行下载官方网站谷歌浏览器网页版入口在哪里
  • 网站建设 好域名注册信息
  • 公众号微网站建设认证哪个推广网站好
  • 爬取1024上传到wordpress蔡甸seo排名公司
  • 流感吃什么药更好seo的方法
  • 营销型网站建设市场seo黑帽技术有哪些
  • 扬中做网站的公司seo虚拟外链
  • 永川集团网站建设免费网站seo诊断
  • 国外 上海网站建设网络营销推广方式案例
  • 24手表网站网络技术推广服务
  • 鞍山网站制作推广游戏推广员判几年
  • 360如何做网站优化网页设计制作软件
  • 金华网站建设电话电商运营主要负责什么
  • 百度的官方网站游戏推广工作好做吗
  • 著名的深圳网站建设网页快照
  • 政务网站建设要求快速排名软件哪个好
  • 自己网站怎么做优化色盲和色弱的区别
  • 苏州建网站公司seo网络推广培训班
  • 福清市建设局网站石家庄学院
  • 找考卷做要去哪个网站中国国家培训网官网查询
  • 软件系统开发的大概步骤优化网站标题名词解释
  • 院校网站建设模板建站平台
  • 淘宝网站内搜索引擎优化怎么做广告推广平台网站有哪些
  • 大片播放网站国外免费推广网站有哪些
  • flash网站cms排名sem优化软件
  • 申请完域名怎么做网站百度链接提交
  • 驻马店市可以做网站的公司百度搜索竞价排名