Mysql的JDBC连接和CRUD操作

2024-06-16 20:48

本文主要是介绍Mysql的JDBC连接和CRUD操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文目的:演示用Eclipse编写Java项目实现数据库的连接和基本的增删改查操作


项目结构如下图所示:

这里写图片描述


数据库结构如下:

CREATE TABLE `stu` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(20) COLLATE utf8_bin DEFAULT NULL,`age` int(3) DEFAULT NULL,`gradeid` int(11) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8 COLLATE=utf8_bin

这里写图片描述


database-info.properties配置文件如下:

driver=com.mysql.jdbc.Driver
#tcjt084 is your database's name
url=jdbc:mysql://localhost:3306/tcjt084
#root is your database username
user=root
#admin is your database password
password=admin

Student.java建实体类如下

package entity;//实体类
public class Stu {private int id;private String name;private int age;public Stu() {}public Stu(int id, String name, int age) {super();this.id = id;this.name = name;this.age = age;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Stu [id=" + id + ", name=" + name + ", age=" + age + "]";}}

ReadDBInfo.java工具类读取数据库信息如下:

package jdbc;import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;public class ReadDBInfo {// 单例模式对象声明 静态私有private static ReadDBInfo prop = null;// Properties对象Properties p = new Properties();// 私有构造方法,一定要是私有的,私有外部就不能直接new本类对象了,实现单例模式目的private ReadDBInfo() {}/*** 单例模式* @return 本类的对象*/public static ReadDBInfo getInstance() {if (prop == null) {prop = new ReadDBInfo();}return prop;}/*** @param key:关键字* @return String 根据key读取到的properties中的值*/public String getDBInfo(String key) {try {// Creates a new FileReader, //given the name of the file to read from.//创建一个新的FileReader,给定要读取的文件的名称。FileReader fr = new FileReader("src/database-info.properties");// Reads a property list (key and element pairs) from //the input character stream in a simple line-oriented format. //从输入字符流中读取一个属性列表(键和元素对),以一个简单的行为导向的格式p.load(fr);// 根据properties 返回key的值/*Searches for the property with the specified key in this property list.If the key is not found in this property list, the default property list, and its defaults, recursively, are then checked. The method returns null if the property is not found.*///在属性列表中搜索具有指定键的属性。//如果在此属性列表中没有找到该键,则会对默认属性列表及其默认值进行递归检查。//如果没有找到该属性,该方法将返回null。return p.getProperty(key);} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return null;}
}

BaseDao.java如下:

package dao;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;import jdbc.ReadDBInfo;public class BaseDao {ReadDBInfo prop = ReadDBInfo.getInstance();// 获取driver url user password值,从properties文件中String driver = prop.getDBInfo("driver");String url = prop.getDBInfo("url");String user = prop.getDBInfo("user");String password = prop.getDBInfo("password");// 数据库连接对象Connection conn = null;// sql语句处理对象PreparedStatement ps = null;// 结果集对象ResultSet rs = null;/*** 与数据库建立起连接* @return void*/public void getConn() {try {//加载驱动//使用给定的字符串名称返回与类或接口关联的类对象。//调用此方法等价于:类。//forName(className,true,currentLoader)://当前加载器表示当前类的定义类装入器。Class.forName(driver);//获取与数据库的连接//尝试建立与给定数据库URL的连接。//DriverManager试图从注册的JDBC驱动程序中选择适当的驱动程序。//注意:如果用户或密码属性也被指定为url的一部分,//那么它将被定义为哪个值优先。//为了获得最大的可移植性,应用程序应该只指定一次属性。conn = DriverManager.getConnection(url, user, password);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}}/*** 关闭rs,ps,conn* @return void*/public void closeAll() {if (rs != null) {try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if (ps != null) {try {ps.close();} catch (SQLException e) {e.printStackTrace();}}if (conn != null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}/*** 执行sql语句获取查找到的结果集* @param objs* obj数组 用来存放sql中?的值* @param sql* sql语句* @return ResultSet 返回结果集*/public ResultSet baseSelect(Object[] objs, String sql) {getConn();/* * 创建一个PreparedStatement对象,用于向数据库发送参数化的SQL语句。* 具有或不带参数的SQL语句可以预编译并存储在PreparedStatement对象中。* 然后可以使用此对象多次有效地执行此语句。*/ps = conn.prepareStatement(sql);for (int i = 0; i < objs.length; i++) {/** 使用给定对象设置指定参数的值。* JDBC规范指定了从Java对象类型到SQL类型的标准映射。* 在发送到数据库之前,给定的参数将转换为相应的SQL类型。*/ps.setObject(i + 1, objs[i]);}/** 在这个PreparedStatement对象中执行SQL查询,* 并返回由查询生成的ResultSet对象。* 返回类型:包含查询生成的数据的ResultSet对象;没有空*/rs = ps.executeQuery();return rs;} catch (SQLException e) {e.printStackTrace();}return null;}/*** 执行sql语句对数据库中的数据进行操作,增删改* @param objs* obj数组 用来存放sql中?的值* @param sql* sql语句* @return int 有多少条数据被修改*/public int baseUpdate(Object[] objs, String sql) {getConn();try {ps = conn.prepareStatement(sql);for (int i = 0; i < objs.length; i++) {ps.setObject(i + 1, objs[i]);}/** 在这个PreparedStatement对象中执行SQL语句,* 它必须是一个SQL数据操作语言(DML)语句,如插入、更新或删除;* 或者一个没有返回任何内容的SQL语句,比如DDL语句。*/int lines = ps.executeUpdate();return lines;} catch (SQLException e) {e.printStackTrace();}return 0;}
}

StuDao接口如下:

package dao;import java.util.List;import entity.Stu;public interface StuDao {List<Stu> getAll();Stu getStuById(int id);int getCount();boolean update(Stu s);boolean delete(int id);boolean add(Stu s);
}

StuDaoImpl实现StuDao接口:

package dao;import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;import entity.Stu;public class StuDaoImpl extends BaseDao implements StuDao {/*** 查找所有信息* @return Stu类的List*/@Overridepublic List<Stu> getAll() {String sql = "select * from stu";ResultSet rs = baseSelect(new Object[] {}, sql);//构造一个初始容量为10的空列表。存放Student对象List<Stu> list = new ArrayList<>();try {//rs.next():/** 将光标从当前位置向前移动一行。* 一个ResultSet游标最初定位在第一行之前;* 第一个对方法的调用使第一行成为当前行;* 第二个调用使第二行变成当前行,以此类推。* 当对下一个方法的调用返回false时,光标将位于最后一行之后。*/while (rs.next()) {Stu s = new Stu();/** 在这个ResultSet对象的当前行中检索指定列的值,* 作为Java编程语言中的int类型。*/s.setId(rs.getInt("id"));s.setName(rs.getString("name"));s.setAge(rs.getInt("age"));list.add(s);}return list;} catch (SQLException e) {e.printStackTrace();}return null;}/*** 根据id查找Stu* @param id* @return Stu对象*/@Overridepublic Stu getStuById(int id) {String sql = "select * from stu where id=?";Object[] objs = new Object[] { id };ResultSet rs = baseSelect(objs, sql);Stu s = new Stu();try {while (rs.next()) {s.setId(rs.getInt("id"));s.setName(rs.getString("name"));s.setAge(rs.getInt("age"));}return s;} catch (SQLException e) {e.printStackTrace();}return null;}/*** 一共有多少条信息* @return int*/@Overridepublic int getCount() {String sql = "select count(*) from stu";ResultSet rs = baseSelect(new Object[] {}, sql);int count = 0;try {while (rs.next()) {count = rs.getInt(1);}return count;} catch (SQLException e) {e.printStackTrace();}return 0;}/*** 更新Stu信息* @param Stu s:Stu对象* @return boolean true 成功 false 失败*/@Overridepublic boolean update(Stu s) {String sql = "update stu set name=?,age=? where id=?";Object[] objs = new Object[] { s.getName(), s.getAge(), s.getId() };int lines = baseUpdate(objs, sql);if (lines > 0) {return true;}return false;}/*** 根据id删除信息* @param id:id * @return boolean true 成功 false 失败*/@Overridepublic boolean delete(int id) {String sql = "delete from stu where id=?";Object[] objs = new Object[] { id };int lines = baseUpdate(objs, sql);if (lines > 0) {return true;}return false;}/*** 添加Stu信息* @param s:要添加的对象* @return boolean true 成功 false 失败*/@Overridepublic boolean add(Stu s) {String sql = "insert into stu values(null,?,?)";Object[] objs = new Object[] { s.getName(), s.getAge() };int lines = baseUpdate(objs, sql);if (lines > 0) {return true;}return false;}
}

Test类 测试如下:

package test;import java.util.List;
import java.util.Scanner;import org.junit.Before;
import org.junit.Test;import dao.StuDao;
import dao.StuDaoImpl;
import entity.Stu;public class Tests {private StuDao dao;@Beforepublic void init() {dao = new StuDaoImpl();}// 查所有@Testpublic void testGetAll() {List<Stu> list = dao.getAll();for (Stu s : list) {System.out.println(s);}}// 查记录数@Testpublic void testGetCounts() {System.out.println(dao.getCount());}// 根据id查找@Testpublic void testGetStuById() {Scanner input = new Scanner(System.in);System.out.println("请输入要查询的id:");int id = input.nextInt();Stu s = dao.getStuById(id);if (s == null) {System.out.println("未查询到结果!");} else {System.out.println(s);}input.close();}// 新增学生信息@Testpublic void testAdd() {Scanner input = new Scanner(System.in);System.out.println("请输入姓名:");String name = input.next();System.out.println("请输入年龄:");String ageStr = input.next();int age = Integer.parseInt(ageStr);System.out.println(dao.add(new Stu(0, name, age)));input.close();}// 删除学生信息@Testpublic void testDel() {Scanner input = new Scanner(System.in);System.out.println("请输入要删除的id:");int id = input.nextInt();System.out.println(dao.delete(id));input.close();}// 修改学生信息@Testpublic void testUpd() {Scanner input = new Scanner(System.in);System.out.println("请输入ID:");int id = input.nextInt();System.out.println("请输入姓名:");String name = input.next();System.out.println("请输入年龄:");String ageStr = input.next();int age = Integer.parseInt(ageStr);System.out.println(dao.update(new Stu(id, name, age)));input.close();}
}

测试结果:查所有getAll
这里写图片描述


测试结果:查条数getCounts
这里写图片描述


测试结果:根据id查找getById
这里写图片描述


增删改就不贴出来了都是可行的~

这篇关于Mysql的JDBC连接和CRUD操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1067515

相关文章

MySQL 中的 CAST 函数详解及常见用法

《MySQL中的CAST函数详解及常见用法》CAST函数是MySQL中用于数据类型转换的重要函数,它允许你将一个值从一种数据类型转换为另一种数据类型,本文给大家介绍MySQL中的CAST... 目录mysql 中的 CAST 函数详解一、基本语法二、支持的数据类型三、常见用法示例1. 字符串转数字2. 数字

Mysql实现范围分区表(新增、删除、重组、查看)

《Mysql实现范围分区表(新增、删除、重组、查看)》MySQL分区表的四种类型(范围、哈希、列表、键值),主要介绍了范围分区的创建、查询、添加、删除及重组织操作,具有一定的参考价值,感兴趣的可以了解... 目录一、mysql分区表分类二、范围分区(Range Partitioning1、新建分区表:2、分

MySQL 定时新增分区的实现示例

《MySQL定时新增分区的实现示例》本文主要介绍了通过存储过程和定时任务实现MySQL分区的自动创建,解决大数据量下手动维护的繁琐问题,具有一定的参考价值,感兴趣的可以了解一下... mysql创建好分区之后,有时候会需要自动创建分区。比如,一些表数据量非常大,有些数据是热点数据,按照日期分区MululbU

SQL Server配置管理器无法打开的四种解决方法

《SQLServer配置管理器无法打开的四种解决方法》本文总结了SQLServer配置管理器无法打开的四种解决方法,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录方法一:桌面图标进入方法二:运行窗口进入检查版本号对照表php方法三:查找文件路径方法四:检查 S

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

MySQL中查找重复值的实现

《MySQL中查找重复值的实现》查找重复值是一项常见需求,比如在数据清理、数据分析、数据质量检查等场景下,我们常常需要找出表中某列或多列的重复值,具有一定的参考价值,感兴趣的可以了解一下... 目录技术背景实现步骤方法一:使用GROUP BY和HAVING子句方法二:仅返回重复值方法三:返回完整记录方法四:

从入门到精通MySQL联合查询

《从入门到精通MySQL联合查询》:本文主要介绍从入门到精通MySQL联合查询,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下... 目录摘要1. 多表联合查询时mysql内部原理2. 内连接3. 外连接4. 自连接5. 子查询6. 合并查询7. 插入查询结果摘要前面我们学习了数据库设计时要满

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE