JavaEE企业开发新技术5

目录

2.18 综合应用-1

2.19 综合应用-2

2.20 综合应用-3

2.21 综合应用-4

2.22 综合应用-5

Synchronized :


2.18 综合应用-1

反射的高级应用

DAO开发中,实体类对应DAO的实现类中有很多方法的代码具有高度相似性,为了提供代码的复用性,降低冗余度,可以通过反射的方式可以定义一个公共的DAO,只要提供实体类名,就可以得到对应数据库表中的所有记录。

用到的知识点:

(1)JDBC的基本操作

(2)单例设计模式

(3)数据库结果集对应的元数据(ResultSetMeteDate)

(4)反射

命名的规范化要求:

(1)实体类类名每个首字母大写,数据库表字段名称要与实体类属性名称一致,数据库表中字段命名的时候每个单词首字母要大写。

(2)数据库表命名以“t_”开头,后面跟对应的实体类名称,首字母小写。

源码:

package cn.edu.xync.myweb.reflect;import java.lang.reflect.Method;
import java.security.Timestamp;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;class JDBCUtil{private static JDBCUtil util=null;//定义私有的静态成员private JDBCUtil() {//加载驱动try {Class.forName("com.mysql.cj.jdbc.Driver");} catch (ClassNotFoundException e) {e.printStackTrace();}}public static JDBCUtil getInstance() {//判断util这个静态成员属性有没有被实例化synchronized(JDBCUtil.class) {if(util==null) {util=new JDBCUtil();//实例化}return util;}	}public Connection getConnection() throws SQLException {//返回链接对象return DriverManager.getConnection("jdbc:mysql://localhost:3306/mysqldb?characterEncoding=UTF-8","root","1234567890");}public void close(ResultSet rs, Statement stmt, Connection con) {try {if (rs != null) // 关闭并释放资源rs.close();if (stmt != null)stmt.close();if (con != null)con.close();} catch (SQLException e) {e.printStackTrace();}}
}

JDBCUtil使用了封装类并使用了单例设计模式

2.19 综合应用-2

class CommonDAO {// 定义公共的DAO/** 根据实体类名将其对应的数据库表中所有的记录封装成实体类集合返回 说明:数据库表字段名称要与实体类属性名称一致,数据库表中字段命名的时候每个单词首字母要大写*/public List getBeans(String beanName) throws Exception {// 得到对应的数据库表名称String tableName = this.getTableName(beanName);System.out.println(tableName);String sql = "select * from " + tableName;// select * from t_accountList lists = new ArrayList();// 把表里的每一行转换成实体类存放在集合里JDBCUtil util = JDBCUtil.getInstance();try {Connection con = util.getConnection();Statement stmt = con.createStatement();ResultSet rs = stmt.executeQuery(sql);ResultSetMetaData rsmd = rs.getMetaData();// 结果集元数据:通过它能够知道结果集对应的表有几列,// 这些列的名称,数据类型等信息都在结果集元数据当中// 得到当前表共有几个字段int columnCount = rsmd.getColumnCount();while (rs.next()) {// 对结果集遍历,每执行一次就要通过反射的方法把对应的实体类的clazz对象创建出来// 实体类必须放到cn.xysfxy.sprintboot.entity包中Class clazz = Class.forName("cn.edu.xync.myweb.entity." + beanName);// 实例化对象Object obj = clazz.newInstance();//对列进行循环				
for (int i = 1; i <= columnCount; i++) {System.out.println(rsmd.getColumnName(i));// 拿到列名System.out.println(rsmd.getColumnTypeName(i));// 拿到列对应的数据类型的名称// 将数据表字段第一个字母转换成大写,为下边拿到setXXX方法使用String methodName = this.firstCharToUppercase(rsmd.getColumnName(i));// 根据反射调用setXXX方法给实体类对象属性赋值Method method = clazz.getDeclaredMethod("set" + methodName,this.getAttributeClassType(rsmd.getColumnTypeName(i)));
//得到setId方法传入的java类型// setIdmethod.invoke(obj, rs.getObject(i));//传值}lists.add(obj);// 添加到集合里}} catch (SQLException e) {e.printStackTrace();}return lists;}// 根据数据库表中某个列的数据类型返回对应的Java数据类型的Class对象private Class getAttributeClassType(String columnType) {Class clazz = null;if ("VARCHAR".equalsIgnoreCase(columnType))clazz = String.class;if ("INT".equalsIgnoreCase(columnType))clazz = Integer.class;if ("Float".equalsIgnoreCase(columnType))clazz = Float.class;if ("DATETIME".equalsIgnoreCase(columnType))clazz = Timestamp.class;return clazz;}// 将数据表列名第一个字母转换成大写private String firstCharToUppercase(String columnName) {String uppercaseString = columnName.toUpperCase();char firstChar = uppercaseString.charAt(0);String firstCharString = String.valueOf(firstChar);return firstCharString.concat(columnName.substring(1, columnName.length()));}/** 根据实体类名称得到对应的数据表名称 命名必须遵守的规范 例如Account,对应的表名称为t_account*/private String getTableName(String beanName) {char oldFirstChar = beanName.charAt(0);// 实体类名首字母先转换成字符串形式,再转换成小写String newFirstChar = String.valueOf(oldFirstChar).toLowerCase();// 拼接字符串String tableName = "t_" + beanName.replaceFirst(String.valueOf(oldFirstChar), newFirstChar);//替换字符return tableName;// 把Account-->t_account}
}

2.20 综合应用-3

2.21 综合应用-4

public class GenericTest {public static void main(String[] args) {CommonDAO dao = new CommonDAO();List lists = null;try {lists = dao.getBeans("User");// lists=dao.getBeans("Goods");for(int i=0;i<lists.size();i++) {System.out.println(lists.get(i));}} catch (Exception e) {e.printStackTrace();}}
}

运行结果:

总结:这是通过反射和JDBC结果集元数据相结合的一个例子,目的:减少代码的冗余,提高代码的复用性

2.22 综合应用-5

一般我们不会去传递类的名称,我们都是传递类的Class对象

applicationContext.getBean(XXX.class)

private String getTableName(Class beanType) {//String beanNameWithPackage=beanType.getName();//得到的类名包含了package信息String beanName=beanType.getSimpleName();//得到AccountSystem.out.println(beanName);
//		//cn.xxx.xxx.Account
//		System.out.println(beanNameWithPackage);
//		String subName[] =beanNameWithPackage.split("\\.");//按.转义拆分成字符串数组
//		String beanName=subName[subName.length-1];//拿到最后一个字符串char oldFirstChar = beanName(0);// 实体类名首字母先转换成字符串形式.charAt,再转换成小写String newFirstChar = String.valueOf(oldFirstChar).toLowerCase();// 拼接字符串String tableName = "t_" + beanName.replaceFirst(String.valueOf(oldFirstChar), newFirstChar);return tableName;// 把Account-->t_account}//因为我们传递进来的就是Class对象,所以直接调用newInstance()方法就行

运行结果:

Synchronized :

当多个并发线程(thread1和thread2)访问同一个对象(ThreadSyn)中的synchronized代码块时,就相当于对这个代码块加了锁,在同一时刻只能有一个线程得到执行,其他线程受阻塞,必须等待当前线程执行完这个代码块以后才能执行该代码块。

当多个线程访问 不同对象 的同步代码块,线程访问各自同步代码块,线程不会阻塞,互不干扰。

总结

1、无论synchronized关键字加在方法上还是对象上,如果它作用的对象是非静态的,则它取得的锁是对象;如果synchronized作用的对象是一个静态方法或一个类,则它取得的锁是对类,该类所有的对象同一把锁。

2、每个对象只有一个锁(lock)与之相关联,谁拿到这个锁谁就可以运行它所控制的那段代码。

3、实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。

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

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

相关文章

MoneyPrinterTurbo-利用AI大模型,一键生成高清短视频

MoneyPrinterTurbo-利用AI大模型&#xff0c;一键生成高清短视频 在今天的信息爆炸的时代&#xff0c;短视频已经成为最受欢迎的信息传递方式之一。无论是分享生活瞬间&#xff0c;还是传递重要信息&#xff0c;短视频都是最直观&#xff0c;最具影响力的手段。但是&#xff0…

SpringBoot:正常启动,Controller 无法访问

一、server.servlet.context-path配置的作用 定义&#xff1a; server.servlet.context-path # Context path of the application. 应用的上下文路径&#xff0c;也可以称为项目路径&#xff0c;是构成url地址的一部分。 server.servlet.context-path不配置时&#xff0c;默认…

问题 E: 实验11_9_链表归并

题目描述 已知有两个递增的正整数序列A和B&#xff0c;序列中元素个数未知&#xff0c;同一序列中不会有重复元素出现&#xff0c;有可能某个序列为空。现要求将序列B归并到序列A中&#xff0c;且归并后序列A的数据仍然按递增顺序排列。如果序列B中某些数据在序列A中也存在&am…

微软 SDL 安全研发生命周期详解

微软SDL&#xff08;Security Development Lifecycle&#xff09;是一种安全软件开发的方法论&#xff0c;它强调在整个产品开发过程中融入安全考虑因素。SDL 是一个动态的过程&#xff0c;包括多个阶段和活动&#xff0c;以确保产品的安全开发、测试、部署和运行。Microsoft 要…

11.哀家要长脑子了!

目录 1.453. 最小操作次数使数组元素相等 - 力扣&#xff08;LeetCode&#xff09; 2.665. 非递减数列 - 力扣&#xff08;LeetCode&#xff09; 3. 283. 移动零 - 力扣&#xff08;LeetCode&#xff09; 4. 3114. 替换字符可以得到的最晚时间 - 力扣&#xff08;LeetCode…

说说我理解的数据库中的Schema吧

一、SQL标准对schema如何定义&#xff1f; ISO/IEC 9075-1 SQL标准中将schema定义为描述符的持久命名集合&#xff08;a persistent, named collection of descriptors&#xff09;。 大部分的网上资料定义Schema如下&#xff1a; schema是用来组织和管理数据的一种方式。它…

activiti7.0集成人大金仓数据库

说明 人大金仓数据库和mysql数据库比较相似&#xff0c;部分语法也类似。activiti中默认集成的是mysql数据源&#xff0c;而且并没有集成过人大金仓数据库。所以想要集成人大金仓数据库就要将该类的的数据源配置到其中去。这里的思路就是在流程引擎初始化数据库datasource的时…

对中小企业来说,一次的勒索事件有可能造成致命的伤害

勒索攻击越来越频繁 去年的勒索事件数据呈现出显著的增长趋势。具体来说&#xff0c;全球范围内的勒索软件攻击活动愈演愈烈&#xff0c;受害者数量创下历史新高&#xff0c;同比增长了46%。 例如&#xff0c;2023年伊始&#xff0c;英国皇家邮政成为了勒索团伙LockBit的大型…

QT 使用redis ,连接并使用

一.redis安装 链接&#xff1a;https://pan.baidu.com/s/17fXKOj5M4VIypR0y5_xtHw 提取码&#xff1a;1234 1.下载得到文件夹如图 course_redis为安装包。 2.启动Redis服务 把安装包解压到某个路径下即可。 打开cmd窗口&#xff0c;切换到Redis安装路径&#xff0c;输入 r…

LLM激活稀疏性加速

相关工作 Deja vu Contextual sparsity for efficient llms at inference time LLM in a flash Efficient Large Language Model Inference with Limited Memory ReLU Strikes Back Exploiting Activation Sparsity in Large Language Models ReLU2 Wins: Discovering Effi…

量子飞跃:从根本上改变复杂问题的解决方式

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 编辑丨王珩 编译/排版丨沛贤 深度好文&#xff1a;1000字丨5分钟阅读 利用多功能量子比特的量子计算机已处于解决复杂优化问题的最前沿&#xff0c;例如旅行商问题&#xff0c;这是一个典型的…

GRU之我见(含案例讲解)

GRU&#xff08;Gated Recurrent Unit&#xff09;是一种常用于处理序列数据的深度学习模型&#xff0c;特别是在自然语言处理&#xff08;NLP&#xff09;和时间序列分析领域。它是一种循环神经网络&#xff08;RNN&#xff09;的变种&#xff0c;旨在解决长期依赖和梯度消失问…

torch.where()中并行方式的实现

torch.where()中一般有三个参数。 第一个参数是一个判断条件。 第二个参数是条件成立时的值。 第三个参数是条件不成立时的值。 for batch in range(2):for i in range(256):for j in range(256):output[batch][i][j] 0 if tensor_count_0[A_arg[batch,i,j]][B_arg[batch,i…

MATLAB利用A星/A*算法求障碍地图两点最短路径

MATLAB利用A星/A*算法求障碍地图两点最短路径 MATLAB利用A星/A*算法求障碍地图两点最短路径

大模型日报2024-04-12

大模型日报 2024-04-12 大模型资讯 Meta即将发布具有“人类水平认知”的AI模型 摘要: Meta公司宣称即将推出具备“人类水平认知”的人工智能模型。这标志着我们可能即将进入一个全新的大型语言模型和聊天机器人领域。Meta的Llama 3和OpenAI的GPT-5将为这一领域带来革命性的进展…

前端-每天一道面试题(1)-HTML常见的布局方式

哈喽&#xff0c;大家好&#xff0c;本来今天要更新项目内容的&#xff0c;但是考虑到由于是全国大学生服务外包大赛组委会的题目&#xff0c;而且比赛目前也正在进行&#xff0c;作品提交尚未截止&#xff0c;为了避免由于试题版权而引发的一系列问题&#xff0c;这个系列目前…

10、【代理模式】通过引入一个代理对象来控制对原始对象的访问的方式。

你好&#xff0c;我是程序员雪球。 今天我们了解代理模式的原理、静态代理和动态代理的区别、Spring AOP 和动态代理的关系、代理模式的使用场景&#xff0c;以及用 Java 实现一个动态代理示例 一、代理模式的原理 代理模式是一种设计模式&#xff0c;它提供了一种通过引入一个…

概念:CPU、内存、磁盘、Android内存分配

cpu CPU的全称是Central Processing Unit&#xff0c;中文名称为中央处理单元。它是计算机硬件的核心部件&#xff0c;负责解释计算机程序指令并处理计算机软件中的数据。简言之&#xff0c;CPU执行计算机程序中的操作指令&#xff0c;包括基本算术、逻辑、控制和输入/输出&am…

手把手带你搞懂电压跌落测试DIP

针对很多入门小白不懂元器件&#xff0c;一些老工程师上班很多年有的也不懂得总结知识点&#xff0c;以及想学习不知道怎么系统学习的这一类人群&#xff0c;前方知识点来袭&#xff0c;请君放心食用~ 一&#xff0c;项目背景介绍 最近做项目过程中&#xff0c;客户要求要做电…

wps使用Latex编辑公式没有Latex formula

wps使用Latex编辑公式没有Latex formula 1. 下载CTEX2. 下载LaTeXEE3. 配置Miktex4. 配置latexee5. 用管理员权限运行latexeqedit.exe6. wps插入latex公式 1. 下载CTEX 下载CTEX网址&#xff0c;我下载的下图这个&#xff0c;下载完了之后运行exe文件安装ctex。 2. 下载LaTe…