package util;

import org.apache.commons.beanutils.BeanUtils;

import java.lang.reflect.InvocationTargetException;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
* 基础DAO层,用于处理和数据库相关的操作
*
* 1. 通用的更新方法
* 2. 通用的查询方法
*/
public class BaseDao {
/*
通用的更新方法:
1. SQL
2. 参数不一样

流程:
1. 获取数据库连接对象
2. 预处理SQL语句
3. 给予SQL语句参数【重点】
4. 执行SQL语句

方法分析:
权限修饰 public
返回值类型 int 数据库操作受到影响的行数
方法名 update
形式参数列表:
1. SQL
2. 对应SQL语句的参数
a. 参数类型不确定
Java中所有的类都是Object类的子类
选择Object作为数据类型
b. 参数个数不确定
基础数组
Object[] parameters

public int update(String sql, Object[] parameters)

*/

/**
* 通过的更新方法,可以处理insert,update,delete 对应的SQL语句
*
* @param sql String类型SQL语句
* @param parameters 对应当前SQL语句的参数列表
* @return MySQL数据库操作受到影响的行数
*/
public int update(String sql, Object[] parameters) {
int affectedRows = 0;
PreparedStatement preparedStatement = null;
Connection connection = JdbcUtil.getConnection();

try {
preparedStatement = connection.prepareStatement(sql);

/*
这里需要对SQL语句进行参数赋值操作
这里需要确定SQL语句的?有多少个,参数有多少个?

使用JDBC提供的一种方式,参数元数据!!!
*/

// 获取SQL语句对应的参数个数
int parameterCount = preparedStatement.getParameterMetaData().getParameterCount();

// 对于SQL语句参数赋值之前,需要判断一些条件。
if (parameters != null && parameterCount == parameters.length) {
// 利用for循环,遍历数组,处理SQL语句对应的参数
for (int i = 0; i < parameters.length; i++) {
preparedStatement.setObject(i + 1, parameters[i]);
}
}

affectedRows = preparedStatement.executeUpdate();

} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtil.close(connection, preparedStatement);
}

return affectedRows;
}

/*
通用查询方法方法分析
权限修饰符 public
泛型:
T
返回值类型
void pass
int pass
List<T>
方法名:
query
形式参数列表:
1. String sql
2. SQL语句对应的参数列表,Object[] parameters
3. 不确定是什么东西
a. 约束泛型对应的具体数据类型
b. 参数确定了当前SQL语句查询的具体对应哪一个类对象

T t 还行 浪费空间 利用他获取Class类对象,为所欲为!!!
Class... initParameterTypes

Class<T> cls
Person.class
T ==> Person
cls ==> 利用反射可以为所欲为
public <T> List<T> query(String sql, Object[] parameters, Class<T> cls)
*/

/**
* 通用的查询方法,返回值是一个List集合,其中保存的数据类型是指定从Class<T>
*
* @param sql 需要处理的SQL语句 select语句
* @param parameters 对应的当前SQL语句的参数立碑
* @param cls 指定Class类对象,也是当前需要处理的数据类型,【不包含基本数据类型】
* @param <T> 泛型,用于当前操作的数据类型到底是哪一个
* @return List集合,带有指定的数据
*/
public <T> List<T> query(String sql, Object[] parameters, Class<T> cls) {
ResultSet resultSet = null;
PreparedStatement preparedStatement = null;

List<T> list = new ArrayList<>();

Connection connection = JdbcUtil.getConnection();

try {
preparedStatement = connection.prepareStatement(sql);

int parameterCount = preparedStatement.getParameterMetaData().getParameterCount();

if (parameters != null && parameterCount == parameters.length) {
for (int i = 0; i < parameterCount; i++) {
preparedStatement.setObject(i + 1, parameters[i]);
}
}

// 执行SQL语句,得到结果集对象
resultSet = preparedStatement.executeQuery();

// 获取结果集元数据
ResultSetMetaData metaData = resultSet.getMetaData();

// 获取当前结果集中字段个数
int columnCount = metaData.getColumnCount();

// 解析数据
while (resultSet.next()) {
T t = cls.getConstructor(null).newInstance(null);

for (int i = 1; i <= columnCount ; i++) {
// 获取字段名
String columnName = metaData.getColumnName(i);

// 取出对应数据,赋值类对象中对应成员变量
BeanUtils.setProperty(t, columnName, resultSet.getObject(columnName));
}

list.add(t);
}
} catch (SQLException | NoSuchMethodException | InstantiationException
| IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
} finally {
JdbcUtil.close(connection, preparedStatement, resultSet);
}

return list;
}

}

Java代码 简单用于处理和数据库相关的操作的更多相关文章

  1. Java秒杀简单设计二:数据库表和Dao层设计

    Java秒杀简单设计二:数据库表Dao层设计 上一篇中搭建springboot项目环境和设计数据库表  https://www.cnblogs.com/taiguyiba/p/9791431.html ...

  2. 小白老凯,初出茅庐!请多关照!简单分享一些 mysql 数据库的安装操作!请给为大神雅正!

    在我们写代码,存储数据时常常会用到各种数据库,如:mysql.access.sql.server.Oracle等等,在这里就说一下mysql数据库的的操作指令! 首先我们了解下如何安装mysql数据库 ...

  3. java代码简单练习

    总结: package com.ds; import java.awt.Color; import java.awt.FlowLayout; import javax.swing.JFrame; im ...

  4. 遗传算法与Java代码简单实现

    参阅地址: https://www.jianshu.com/p/ae5157c26af9 代码实现: public class GA { private int ChrNum = 10; //染色体数 ...

  5. java代码简单实现队列

    1. 基于链表简单实现 import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; / ...

  6. java代码简单实现栈

    1. 基于数组简单实现 /** * @author <a herf="mailto:yanwu0527@163.com">XuBaofeng</a> * @ ...

  7. 一段JAVA代码了解多线程,JUC、CAS原子性操作。

    @Test public void testPaceController_multiThread() throws InterruptedException { final PaceControlle ...

  8. JAVA使用JDBC连接,修改MySQL数据库(比较乱)

    原文地址1(连接MySQL图文) : http://www.cnblogs.com/GarfieldEr007/p/5746137.html 原文地址2 (修改MySQL图文): http://www ...

  9. Android数据库相关整理

    今天对Android中数据库相关的操作和代码做了一个整理,便于自己之后的查阅.主要内容有: 1.原生数据库写法 2.终端进sqlite的操作 3.第三方库 4.事务处理 5.权限和路径 一.原生数据库 ...

随机推荐

  1. SQL语句中 NOT IN 子句的“正确打开方式”

    在写SQL语句的时候,若where条件是判断用户不在某个集合当中,我们习惯使用 where 列名 not in (集合) 子句,这种写法本身没有问题,但实践过程中却发现很多人在写类似的SQL语句时,写 ...

  2. 微信小程序_(组件)swiper轮播图

    微信小程序swiper轮播图组件官方文档 传送门 Learn: swiper组件 一.swiper组件 indicator-dots:是否显示面板指示点[默认值false] autoplay:是否自动 ...

  3. Vue_(组件通讯)非父子关系组件通信

    Vue单项数据流 传送门 Vue中不同的组件,即使不存在父子关系也可以相互通信,我们称为非父子关系通信 我们需要借助一个空Vue实例,在不同的组件中,使用相同的Vue实例来发送/监听事件,达到数据通信 ...

  4. linux vmware 安装步骤

    一.下载vmware软件 二.下载centos镜像文件 三.安装步骤 以上相当于于硬件设备已经准备ok,接下来安装软件

  5. 使用Grizzy+Jersey搭建一个RESTful框架()报错Exception in thread "main" java.lang.AbstractMethodError: javax.ws.rs.core.UriBuilder.uri(Ljava/lang/String;)Ljavax/ws/rs/core/UriBuilder;

    报错的类涉及UriBuilder,我搜索类发现, 这个类存在于两个包中,我在baidu的时候,也有人提到是jar包冲突,我就删除了 这个依赖,问题解决了. 环境搭建过程请见地址https://blog ...

  6. IP输出 之 分片ip_fragment、ip_do_fragment

    概述 ip_fragment函数用于判断是否进行分片,在没有设置DF标记的情况下进入分片,如果设置了DF标记,则继续判断,如果不允许DF分片或者收到的最大分片大于MTU大小,则回复ICMP,释放skb ...

  7. 安装两个版本的python安装包,后安装的python程序打开时闪退

    1.环境变量的问题 (Win7)右键打开“计算机”的属性设置→高级系统设置→环境变量.  在系统变量中的path中,编辑,在末尾加入Python的安装路径“F:\Python27”, 路径与路径之间使 ...

  8. ccf 201703-4 地铁修建(95)(并查集)

    ccf 201703-4 地铁修建(95) 使用并查集,将路径按照耗时升序排列,依次加入路径,直到1和n连通,这时加入的最后一条路径,就是所需要修建的时间最长的路径. #include<iost ...

  9. selenium_java

    等待 页面全加载 ChromeOptions options=new ChromeOptions(); /** *(1) NONE: 当html下载完成之后,不等待解析完成,selenium会直接返回 ...

  10. leetcode334 递增的三元子序列

    class Solution { public: bool increasingTriplet(vector<int>& nums) { //使用双指针: int len=nums ...