} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
-
使用jdbc对于增删改方法的封装
-
对于增删改方法,仍有大部分的冗余代码,但在这些冗余代码中又有一些是不同的
-
例如sql语句,以及传入的参数,所以可把相同的代码封装,不同的代码抽取
-
这只是代码的简化,并不是程序的优化
-
@param sql 对于sql语句的抽取
-
@param obj 可变长参数
-
可变长参数必须是最后一个形参,也只能有一个这样的形参
-
在该方法内部,将obj当成一个数组使用。
-
@throws SQLException
*/
public static void update(String sql,Object…obj) throws SQLException{
Connection conn = null;
PreparedStatement ps = null;
try{
//调用本类中的获取连接方法
conn = getConnection();
ps = conn.prepareStatement(sql);
//再判断传入的参数是否为空
if (obj != null) {
//如果不为空则挨个赋值
for (int i = 0; i < obj.length; i++) {
ps.setObject(i+1, obj[i]);
}
}
ps.executeUpdate();
//这里不用catch异常是因为要在dao中去处理
}finally{
//这里的conn连接不要关,在services层中去关闭!在services中处理事务!
toClose(null, ps, null);
}
}
/*
-
反射:
-
什么是类对象和类的对象?
-
Student s = new Student();
s是类的对象,是某一个类创建出来的对象,这个类是Student
//1.在运行期加载一个类到虚拟机中
Class c = Class.forName(“com.macw.Student”);
//c就是Student的类对象
//2. 通过反射创建Student类的对象
Object o = c.newInstance();
//o 是Student类的对象
//3.获取Student类指定的方法 和 获取所有的方法
Method method = c.getMethod(“方法名”,形参类型);
//method指某一个方法
method.invoke(对象,实参); //动态调用该方法
Method[] methods = c.getMethods();
//methods指类中所有的方法
*/
/**
-
查询多条
-
是用来规范泛型的,
-
@throws SQLException
-
@throws IllegalAccessException
-
@throws InstantiationException
-
@throws InvocationTargetException
-
@throws IllegalArgumentException
*/
public static List select(String sql,Class clz,Object…obj) throws SQLException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
List list = null;
try {
conn = getConnection();
// 1,预加载SQL语句
ps = conn.prepareStatement(sql);
// 2,设置占位符
if (obj != null) {
for (int i = 0; i < obj.length; i++) {
ps.setObject(i+1, obj[i]);
}
}
// 3,执行SQL语句
rs = ps.executeQuery();
// 获取查询结果集中的元数据
// 元数据可以理解为查询结果中的列名
ResultSetMetaData md = rs.getMetaData();
// 获取查询到的列的个数;
int columnCount = md.getColumnCount();
// System.out.println(columnCount);
list = new ArrayList<>();
T t = null;
while(rs.next()){//while每循环一次,代表一行数据。
//clz代表实体类对象,
// 创建实体类的对象
t = clz.newInstance();
for (int i = 0; i < columnCount; i++) {//一行数据有几列就循环几次
// 根据下标获取列名
String columnName = md.getColumnName(i+1);
// 再根据列名获取对应列的值
Object value = rs.getObject(columnName);
// 要将每一列的值赋值给t对象的属性,要要求表中的列名和实体类属性名必须一致!
// 这是通过字符串拼接成 setName();方法
String methodName = “set” + columnName.substring(0, 1).toUpperCase()+
columnName.substring(1).toLowerCase();
// 获取当前实体类中传递过来的所有方法
Method[] methods = clz.getMethods();
// 进行for循环获取所有的set方法
for (Method m : methods) {
// 判断所有的方法中有没有查询结果列名拼成的set方法
// 获取实体类中所有的方法名用:m.getName()方法
if (m.getName().equals(methodName)) {
// Oracle中的number类型对应java中的java.math.BigDecimal类型
/**
-
rs.getInt(“id”); 那么number类型就被转换成了int类型;
-
rs.getDouble(“price”);那么number类型就转换成了double类型
-
rs.getObject(“列名”); 那么返回的实际类型是java.math.BigDecimal;
-
Bigdecimal 没有精度损失,多用户银行等的金融计算;
*/
// value如果是Bigdecimal类型,意味着在数据库中是number类型
// 所以需要强转成int或者double类型
if (value == null) {//如果有空的数据,不再强转直接跳过
continue;
}
else if (value instanceof BigDecimal) {
Class<?> c2 = m.getParameterTypes()[0];
if (c2.getName().equals(“java.lang.Integer”)) {
value = ((BigDecimal)value).intValue();
}else
if(c2.getName().equals(“double”)){
value = ((BigDecimal)value).doubleValue();
}
else
if(c2.getName().equals(“int”)){
value = ((BigDecimal)value).intValue();
}
}
//动态执行set方法
m.invoke(t, value);
}
}
}
//while每循环一次,就创建一个实体类对象,给对象的属性赋值,
// 然后将对象存储到list集合中
list.add(t);
}
}finally{
toClose(null, ps, rs);
}
return list;
}
}
jdbcUtil工具类的使用:
如下所示:
先自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以扫码领取!
![img](https://img-blog.csdnimg.cn/img_convert/fd061ef207d6a64107d66284dc5f1fae.jpeg)
最后我们该如何学习?
1、看视频进行系统学习
这几年的Crud经历,让我明白自己真的算是菜鸡中的战斗机,也正因为Crud,导致自己技术比较零散,也不够深入不够系统,所以重新进行学习是很有必要的。我差的是系统知识,差的结构框架和思路,所以通过视频来学习,效果更好,也更全面。关于视频学习,个人可以推荐去B站进行学习,B站上有很多学习视频,唯一的缺点就是免费的容易过时。
另外,我自己也珍藏了好几套视频资料躺在网盘里,有需要的我也可以分享给你:
2、读源码,看实战笔记,学习大神思路
“编程语言是程序员的表达的方式,而架构是程序员对世界的认知”。所以,程序员要想快速认知并学习架构,读源码是必不可少的。阅读源码,是解决问题 + 理解事物,更重要的:看到源码背后的想法;程序员说:读万行源码,行万种实践。
Spring源码深度解析:
Mybatis 3源码深度解析:
Redis学习笔记:
Spring Boot核心技术-笔记:
3、面试前夕,刷题冲刺
面试的前一周时间内,就可以开始刷题冲刺了。请记住,刷题的时候,技术的优先,算法的看些基本的,比如排序等即可,而智力题,除非是校招,否则一般不怎么会问。
关于面试刷题,我个人也准备了一套系统的面试题,帮助你举一反三:
只有技术过硬,在哪儿都不愁就业,“万般带不去,唯有业随身”学习本来就不是在课堂那几年说了算,而是在人生的旅途中不间断的事情。
人生短暂,别稀里糊涂的活一辈子,不要将就。
1711392037338)]
Redis学习笔记:
[外链图片转存中…(img-ZqgOI9Vt-1711392037338)]
Spring Boot核心技术-笔记:
[外链图片转存中…(img-vhYNfCeK-1711392037338)]
3、面试前夕,刷题冲刺
面试的前一周时间内,就可以开始刷题冲刺了。请记住,刷题的时候,技术的优先,算法的看些基本的,比如排序等即可,而智力题,除非是校招,否则一般不怎么会问。
关于面试刷题,我个人也准备了一套系统的面试题,帮助你举一反三:
[外链图片转存中…(img-5A7B3Azf-1711392037338)]
只有技术过硬,在哪儿都不愁就业,“万般带不去,唯有业随身”学习本来就不是在课堂那几年说了算,而是在人生的旅途中不间断的事情。
人生短暂,别稀里糊涂的活一辈子,不要将就。
需要更多Java资料的小伙伴可以帮忙点赞+关注,点击传送门,即可免费领取!