0

0

利用Java针对MySql封装的jdbc框架类JdbcUtils完整实现(包含增删_MySQL

PHP中文网

PHP中文网

发布时间:2016-06-01 13:13:04

|

1489人浏览过

|

来源于php中文网

原创

最近看老罗的视频,跟着完成了利用java操作mysql数据库的一个框架类jdbcutils.java,完成对数据库的增删改查。其中查询这块,包括普通的查询和利用反射完成的查询,主要包括以下几个函数接口:

1、public Connection getConnection() 获得数据库的连接
2、public boolean updateByPreparedStatement(String sql, List
3、public Map
4、public List

上面四个函数已经包括了MySQl的所有操作,完全能够满足使用需要。视频里老罗还扩展了两个反射来查询的函数。

5、public

6、 public

下面附完整代码:

立即学习Java免费学习笔记(深入)”;

JdbcUtils.java

package com.jdbc.dbutils;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;import java.sql.SQLException;
import java.util.ArrayList;import java.util.HashMap;
import java.util.List;import java.util.Map;
import domain.UserInfo;
public class JdbcUtils {	//数据库用户名	
private static final String USERNAME = "root";	//数据库密码	
private static final String PASSWORD = "yanzi";	//驱动信息 	
private static final String DRIVER = "com.mysql.jdbc.Driver";	//数据库地址	
private static final String URL = "jdbc:mysql://localhost:3306/mydb";	
private Connection connection;	
private PreparedStatement pstmt;	
private ResultSet resultSet;	
public JdbcUtils() {		// TODO Auto-generated constructor stub		
try{			
Class.forName(DRIVER);			
System.out.println("数据库连接成功!");		
}catch(Exception e){		
}	
}		
/**	 
* 获得数据库的连接	 
* @return	 
*/	
public Connection getConnection(){		
try {			
connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);		
} 
catch (SQLException e) {			// TODO Auto-generated catch block			
e.printStackTrace();		
}		
return connection;	
}		
/**	 
* 增加、删除、改	 
* @param sql	 
* @param params	 
* @return	 
* @throws SQLException	 
*/	
public boolean updateByPreparedStatement(String sql, Listparams)throws SQLException{		
boolean flag = false;		
int result = -1;		
pstmt = connection.prepareStatement(sql);		
int index = 1;		
if(params != null && !params.isEmpty()){			
for(int i=0; i0 ? true : false;		
return flag;	
}	
/**	 
* 查询单条记录	 
* @param sql	 
* @param params	 
* @return	 
* @throws SQLException	 
*/	
public MapfindSimpleResult(String sql, Listparams) throws SQLException{		
Mapmap = new HashMap();		
int index  = 1;		
pstmt = connection.prepareStatement(sql);		
if(params != null && !params.isEmpty()){			
for(int i=0; i findModeResult(String sql, Listparams) throws SQLException{		
List list = new ArrayList();		
int index = 1;		
pstmt = connection.prepareStatement(sql);		
if(params != null && !params.isEmpty()){			
for(int i = 0; i list = jdbcUtils.findModeResult(sql2, null);		
System.out.println(list);
*/		
//利用反射查询 单条记录		
String sql = "select * from userinfo where username = ? ";		
Listparams = new ArrayList();		
params.add("李四");		
UserInfo userInfo;		
try {			
userInfo = jdbcUtils.findSimpleRefResult(sql, params, UserInfo.class);			
System.out.print(userInfo);		
} 
catch (Exception e) {			
// TODO Auto-generated catch block			
e.printStackTrace();		
}	
}
}

+----------+-------------+------+-----+---------+----------------+

是用Nvicat提前创建好的:

/

因为有两个接口用到了反射,因此对应的JavaBean UserInfo.java代码如下:

package domain;
import java.io.Serializable;
public class UserInfo implements Serializable{
/** 
*  
*/
private static final long serialVersionUID = 1L;
private int id;private String username;
private String pswd;
public UserInfo() {// TODO Auto-generated constructor stub}
public int getId() {return id;}
public void setId(int id) {this.id = id;}
public String getUsername() 
{return username;}
public void setUsername(String username) 
{this.username = username;}
public String getPswd() {return pswd;}
public void setPswd(String pswd) {this.pswd = pswd;}
@Override
public String toString() 
{return "UserInfo [id=" + id + ", username=" + username + ", pswd="+ pswd + "]";
}
}

补充说明:

1. 在安装完mysql-connector-java-gpl-5.1.26.exe后会发现找不到jar包,其实jar文件在C:/Program Files/MySQL/MySQL Connector J目录下,有两个jar包:

/

用哪一个都ok。在Java工程里新建一个文件夹libs,然后将mysql-connector-java-5.1.26-bin.jar拷贝过去,右键单击 add to build path就ok了。

2.抛开这个框架类JdbcUtils.java来说,操作数据库的一般性步骤如下:

(1)连接数据库,加载驱动: Class.forName(DRIVER); DRIVER = "com.mysql.jdbc.Driver";这本身就是反射!!

(2) 利用用户名和密码及数据库的名字连接,这一步才是真正的连接:

connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);

其中:String URL = "jdbc:mysql://localhost:3306/mydb";

(3)编写一个sql语句,其中的参数用?来代替,然后将参数写到List里。

执行:pstmt = connection.prepareStatement(sql); 然后将参数从list里取出来填充到pstmt里。

(4)如果是增、删、改执行:result = pstmt.executeUpdate(); 其中的result是执行完影响的数据库里的行数,也即几条记录。如果是查询执行:resultSet = pstmt.executeQuery(); 返回的类型是ResultSet类型。之后就是把resultSet 弄成Map或List

3.关于查询操作,在得到resultSet后利用getMetaData得到表的结构信息,如getColumnCount()得到有多少个列。String cols_name = metaData.getColumnName(i+1); 得到每个列的属性名称,如是id、username还是pswd.然后从Object cols_value = resultSet.getObject(cols_name);取出来,放到Map或List

4.关于查询里利用的反射操作,步骤如下:

大同搜索
大同搜索

多语言高质量的AI搜索

下载

(1) T resultObject = cls.newInstance(); 利用class文件的newInstance()方法创建一个实例。

(2)在通过getColumnCount()得到有多少个列之后,进入循环,

String cols_name = metaData.getColumnName(i+1);

读取每一列的属性名字和放的值。通过属性的名字cols_name进行反射:Field field = cls.getDeclaredField(cols_name);这样就得到了Field 等于类里的成员变量,field.setAccessible(true); //打开javabean的访问权限 在利用set方法将从数据库中查出来的cols_value通过JavaBean 也即定义的UserInfo这个类的 set方法赋进去。field.set(resultObject, cols_value);

5.一般意义上,要利用Java的反射需要以下步骤

(1)加载Class对象,这个一般有两种方式:Class cls1 = UserInfo.class 或

Class cls2 = Class.forName("domain.UserInfo") 后者是利用包名+类名的方法。

(2)反射出来Class之后干啥事呢?一个类不外乎构造函数成员变量成员函数。所以得到Class之后就可以干这三件事。

A、关于构造函数,获得Constructor 有四种方法:

Constructor getConstructor(Class[] params)
Constructor[] getConstructors()
Constructor getDeclaredConstructor(Class[] params)
Constructor[] getDeclaredConstructors()

这四个函数,如果不传参数则是获得所有的构造函数,得到的是一个集合。如果传特定的参数,则是寻找这个特定的构造函数,不带Declared是获得公共的public,带了Declared是可以获得私有构造函数。 得到构造函数后就可以利用反射创建实例了:

Constructor con1[] = cls1.getDeclaredConstructors();

B、关于成员变量,同样有四种方法:

public Field getDeclaredField(String name) 获取任意指定名字的成员

本文封装的JdbcUtils类就是利用这种方式操作类里的私有成员变量,记得要setAccessible打开开关。如下:

Field field = cls.getDeclaredField(cols_name);

C、关于成员函数,也有四种方法:

public Method[] getMethods() 获取所有的共有方法的集合

参数1:方法名 参数2:参数类型集合

下面是利用文中的UserInfo这个类写的一个完成的反射例子,拿到setUsername(String username)方法,然后反射。再拿到getUsername()方法再反射,然后打印出结果:

Class clcs = UserInfo.class;

在反射方法的时候,Method f = clcs.getDeclaredMethod("setUsername", String.class); 原函数里的输入参数是什么类型,就写什么类型.class. 如原来的setXXX需要输入参数String,反射的时候就写String.class.

6. JavaBean是反射的一种,反射对构造函数之类的没任何要求,JavaBean要求这个类必须继承Serializable即可串行化,另外构造函数必须为public. 另外,就是JavaBean在得到某个field后可以直接调用set和get,而不必再反射得到method后再执行。

最后,反射是在程序运行的时候而非编译时!!!

参考:链接1 链接2 链接3

以上就是利用Java针对MySql封装的jdbc框架类JdbcUtils完整实现(包含增删_MySQL的内容,更多相关内容请关注PHP中文网(www.php.cn)!

相关文章

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python 序列化
Python 序列化

本专题整合了python序列化、反序列化相关内容,阅读专题下面的文章了解更多详细内容。

12

2026.02.02

AO3官网入口与中文阅读设置 AO3网页版使用与访问
AO3官网入口与中文阅读设置 AO3网页版使用与访问

本专题围绕 Archive of Our Own(AO3)官网入口展开,系统整理 AO3 最新可用官网地址、网页版访问方式、正确打开链接的方法,并详细讲解 AO3 中文界面设置、阅读语言切换及基础使用流程,帮助用户稳定访问 AO3 官网,高效完成中文阅读与作品浏览。

200

2026.02.02

主流快递单号查询入口 实时物流进度一站式追踪专题
主流快递单号查询入口 实时物流进度一站式追踪专题

本专题聚合极兔快递、京东快递、中通快递、圆通快递、韵达快递等主流物流平台的单号查询与运单追踪内容,重点解决单号查询、手机号查物流、官网入口直达、包裹进度实时追踪等高频问题,帮助用户快速获取最新物流状态,提升查件效率与使用体验。

98

2026.02.02

Golang WebAssembly(WASM)开发入门
Golang WebAssembly(WASM)开发入门

本专题系统讲解 Golang 在 WebAssembly(WASM)开发中的实践方法,涵盖 WASM 基础原理、Go 编译到 WASM 的流程、与 JavaScript 的交互方式、性能与体积优化,以及典型应用场景(如前端计算、跨平台模块)。帮助开发者掌握 Go 在新一代 Web 技术栈中的应用能力。

15

2026.02.02

PHP Swoole 高性能服务开发
PHP Swoole 高性能服务开发

本专题聚焦 PHP Swoole 扩展在高性能服务端开发中的应用,系统讲解协程模型、异步IO、TCP/HTTP/WebSocket服务器、进程与任务管理、常驻内存架构设计。通过实战案例,帮助开发者掌握 使用 PHP 构建高并发、低延迟服务端应用的工程化能力。

16

2026.02.02

Java JNI 与本地代码交互实战
Java JNI 与本地代码交互实战

本专题系统讲解 Java 通过 JNI 调用 C/C++ 本地代码的核心机制,涵盖 JNI 基本原理、数据类型映射、内存管理、异常处理、性能优化策略以及典型应用场景(如高性能计算、底层库封装)。通过实战示例,帮助开发者掌握 Java 与本地代码混合开发的完整流程。

9

2026.02.02

go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

62

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

56

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

28

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.2万人学习

C# 教程
C# 教程

共94课时 | 8.4万人学习

Java 教程
Java 教程

共578课时 | 56.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号