package data;
import java.sql.*;
public class db {
private static String driver = "com.mysql.cj.jdbc.Driver";
private static String connString = "jdbc:mysql://127.0.0.1:3316/data?serverTimezone=UTC";
//------------------------------------记得添加库mysql-connector-java-5.1.48-bin.jar到WEB-INF/lib文件夹
// private static String driver = "com.mysql.jdbc.Driver"; //jar库中的驱动程序
// private static String connString = "jdbc:mysql://localhost:3306/data?useSSL=false"; //IP,端口,数据库名,不使用SSL安全连接
// private static String driver="com.mysql.cj.jdbc.Driver";
// private static String connString="jdbc:mysql://localhost:3306/data?useSSL=false&serverTimezone=UTC";
private static String username = "root"; //连接数据库时的用户名
private static String password = "123456"; //连接数据库时的密码
private static Connection conn = null; //数据库连接
private static Statement stmt = null; //事务,接口实例
private static ResultSet rs = null; //结果集,记录集
private static PreparedStatement pstmt = null; //预处理的事务(接口实例)
/**
* 创建数据库连接
*/
private static Connection getConnecion() {
Connection myConn = null;
try {
Class.forName(driver); //加载驱动程序
myConn = DriverManager.getConnection(connString, username, password); //创建数据库连接
} catch (Exception e) {
System.err.println("\r\n创建数据库连接失败: " + e.getMessage() + "\r\n"); //输出错误信息到控制台
//转义符:\r是回车,\n是换行,前者使光标回到行首(return),后者使光标下移一行(next)
}
return myConn; //返回null表示创建连接失败
}
//------------以下public公用方法采用static静态类型,能在网页源代码中直接引用而无需创建对象实例
/**
* 执行数据查询。 需要调用db.close()。除非查询时报错,即当rs=null时,才不需要调用db.close()。
* @param sql - 参数sql为准备执行的sql语句。
* 样例:select * from tb_student where studentId='888'。
* @return ResultSet - 记录集。
*/
public static ResultSet select(String sql) { //如果只有一个参数,则优先执行此方法(明确了参数个数)
rs = null;
try {
if (conn == null || conn.isClosed()) { //如果尚未创建连接,或连接已关闭
conn = getConnecion(); //连接数据库
stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
//创建事务stmt,数据游标能向前移动,只读。效率更高
//stmt = conn.createStatement(); //创建事务stmt,以默认方式。效率稍低
} else if (stmt == null || stmt.isClosed()) { //如果尚未创建事务,或事务已被关闭
stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
}
rs = stmt.executeQuery(sql); //执行查询此sql语句
System.out.println("查询:" + sql); //优先执行此方法,即使有可变参数的select()方法
} catch (Exception e) {
close(); //出错则关闭连接
System.err.println("\r\n查询数据失败: " + e.getMessage() + "\r\n");
}
return rs; //返回记录集。即使没查到数据,也不是null。当出错时才会是null
}
/**
* 执行数据查询。 需要调用db.close()。除非查询时报错,即当rs=null时,才不需要调用db.close()。
* @param args - args[0]是准备执行的sql语句,其它参数是附加给sql的参数值列表。
* 样例:select('select * from tb_student where studentId=?', '888')。
* @return ResultSet - 记录集。
*/
public static ResultSet select(String... args) { //使用了可变参数(参数个数大于或等于0)
rs = null;
try {
if (args == null || args.length == 0)
return rs;
String sql = args[0]; //第1个参数是sql语句
if (conn == null || conn.isClosed()) { //如果尚未创建连接,或连接已关闭
conn = getConnecion(); //连接数据库
}
pstmt = conn.prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
//预处理的事务,数据游标能向前移动,只读。效率更高
for (int i = 1; i < args.length; i++) { //从第2个参数开始
pstmt.setObject(i, args[i]); //从第1个占位符?开始
}
rs = pstmt.executeQuery(); //执行查询。sql语句已在前面指定(将被预编译)
//System.out.println("查询2:" + pstmt.toString()); //能输出最终执行的SQL语句
} catch (Exception e) {
close(); //出错则关闭连接
System.err.println("\r\n查询数据失败: " + e.getMessage() + "\r\n");
}
return rs; //返回记录集。即使没查到数据,也不是null。当出错时才会是null
}
/**
* 执行数据更新。已经调用了db.close()。
* @param args - args[0]是准备执行的sql语句,其它参数是附加给sql的参数值列表。
* 样例:update('update tb_student set studentName=? where studentId=?', 'tom', '888')。
* @return int - 被更新的记录行数。
*/
public static int update(String... args) {
return executeUpdate(args); //返回被影响的记录数。返回0表示没有记录被更新
}
/**
* 执行数据删除。已经调用了db.close()。
* @param args - args[0]是准备执行的sql语句,其它参数是附加给sql的参数值列表。
* 样例:delete('delete from tb_student where studentId=?', '888')。
* @return int - 被删除的记录行数。
*/
public static int delete(String... args) {
return executeUpdate(args); //返回被影响的记录数。返回0表示没有记录被删除
}
/**
* 执行数据更新或删除。已经调用了db.close()。
* @param args - args[0]是准备执行的sql语句,其它参数是附加给sql的参数值列表。
* @return int - 被更新或删除的记录行数。
*/
private static int executeUpdate(String... args) { //此方法是private类型的,供内部调用
int count = 0;
try {
if (args == null || args.length == 0)
return count;
String sql = args[0]; //第1个参数是sql语句
if (conn == null || conn.isClosed()) { //如果尚未创建连接,或连接已关闭
conn = getConnecion(); //连接数据库
}
pstmt = conn.prepareStatement(sql); //预处理的事务
for (int i = 1; i < args.length; i++) { //从第2个参数开始
pstmt.setObject(i, args[i]); //从第1个占位符?开始
}
count = pstmt.executeUpdate(); //执行数据更新或删除,得到被影响的记录行数
} catch (Exception e) {
System.err.println("\r\n数据更新或删除失败: " + e.getMessage() + "\r\n");
} finally {
close(); //无论成功与否,都关闭连接
}
return count; //返回被影响的记录数。如果没有记录被更新或删除则,则为默认的0
}
/**
* 执行数据插入。已经调用了db.close()。
* @param args - args[0]是准备执行的sql语句,其它参数是附加给sql的参数值列表。
* 样例:insert('insert into tb_student set (studentNo, studentName) values (?,?)', '006', 'tom')。
* @return String - 新添记录的id。如果返回"0"则表示新添记录失败。
*/
public static String insert(String... args) {
String id = "0";
int count = 0;
try {
if (args == null || args.length == 0)
return id;
String sql = args[0]; //第1个参数是sql语句
if (conn == null || conn.isClosed()) { //如
loseper
- 粉丝: 0
- 资源: 1
最新资源
- 以鸢尾花数据集分类,python实现随机森林算法
- 大模型前沿技术及未来应用展望(面壁智能 2024)PPT(53页).pptx
- halcon机器视觉6-1.hdev
- halcon机器视觉6-4.hdev
- 大语言模型赋能自动化测试实践、挑战与展望(复旦大学 2024)PPT(54页).pptx
- halcon机器视觉6-7.hdev
- 大语言模型MOSS研发进展(复旦大学 2024)PPT(55页).pptx
- 大模型在众安银行研发领域效能提升方面的探索与实践(2024)PPT(56页).pptx
- 光伏三相并网Simulink仿真模型(光伏并网仿真模型) 电路包括五个主要模块:PV光伏阵列+Boost DC DC 变器+三相
- 基于python的人脸识别的实验室智能门禁系统源码数据库论文.docx
- 个人毕业设计 - 基于树莓派、OpenCV及Python语言的人脸识别.zip
- 基于python的人脸识别智能化小区门禁管理系统源码数据库论文.docx
- 全网Linux期末考题大全
- matlab小波阈值降噪,音频、视频降噪代码,还包括一个自定义修改的阈值函数,代码自己写的和网络上的不一样
- 智慧中小学学生端学习软件
- 撒旦将很快改变撒旦大神
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论0