工具类

通过之前的案例回顾,不难发现,有很多的代码操作是重复的,比如“获取链接”和“释放资源”等,将来在增删改查中经常遇到,开发中遇到这种情况,将采用工具类的方法进行抽取,从而达到代码的重复利用。

此处使用V1版本,之后还有替他版本。

获取链接

    /**
* 获取连接方法
*
* @return
*/
public static Connection getConnection() {
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/web08", "root", "root");
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}

释放资源 

    public static void release(Connection conn, PreparedStatement pstmt, ResultSet rs) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
} }

编写查询案例

创建新的 Java 工程

编写工具类 JDBCUtils.java

package cn.jayvee.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException; /**
* 提供获取链接和资源的方法
* @author Jayvee
* @date 2019-5-12 下午4:22:24
* @version V1.0
*
*/
public class JDBCUtils_V1 { /**
* 获取链接方法
* @return
*/
public static Connection getConnection(){
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/dbtest","root","123456");
} catch (Exception e) {
e.printStackTrace();
}
return conn;
} public static void release(Connection conn,PreparedStatement pstmt,ResultSet rs){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (pstmt!=null) {
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn!=null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} }

编写测试类 TestUtils.java

package cn.jayvee.test;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException; import org.junit.Test; import cn.jayvee.jdbc.JDBCUtils_V1; /**
* 测试工具类
*
* @author Jayvee
* @date 2019-5-12 下午4:38:54
* @version V1.0
*/
public class TestUtils { /**
* 根据id查询用户信息
*/
@Test
public void testFindUserById() {
Connection conn = null;
ResultSet rs = null;
PreparedStatement pstmt = null;
try {
// 1.获取链接
conn = JDBCUtils_V1.getConnection();
// 2.编写sql语句
String sql = "select * from student where id=?";
// 3.获取执行sql语句对象
pstmt = conn.prepareStatement(sql);
// 4.设置参数(1表示第一个问号,2表示第一个问号的值是2)
pstmt.setInt(1, 2);
// 5.执行查询操作
rs = pstmt.executeQuery();
// 6.处理结果集
while (rs.next()) {
// rs.getString(2)表示获取这条数据的第二列的数据
// rs.getString("age")表示获取这条数据中age字段的之
System.out.print(rs.getString(2) + "----" + rs.getString("age"));
}
// 释放资源放在这里不可行!
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 7.释放资源
JDBCUtils_V1.release(conn, pstmt, rs);
}
} }

数据库数据

   

运行结果

  

使用 Properties 配置文件

  开发中获得链接的四个参数(驱动、URL、用户名、密码)通常都存在在配置文件中,方便后期维护,程序如果需要更换数据库,只需要修改配置文件即可。

通常情况下,我们习惯使用 properties 文件,此文件我们将作如下要求:

  1. 文件位置:任意,建议src下。

  2. 文件名称:任意,扩展名为 properties 。

  3. 文件内容:一行一组数据,格式是“ key = value ”。

    a)key 命名自定义,不能带有空格,如果是多个单词,习惯使用点分隔。例如“ jdbc.driver ”

    b)value值不支持中文,不能带有空格,如果需要使用非英文字符,将进行 Unicode 转换。

项目练习

在 src 目录下创建一个 db.properties 配置文件。

  

文件内编写如下配置(具体情况具体改)

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/dbtest?useUnicode=true&characterEncoding=utf8
username=root
password=123456

加载配置文件:ResourceBundle 对象

  我们在V2版本中使用JDK提供的工具类 ResourceBundle 加载 properties 文件,ResourceBundle 提供 getBundle() 方法用于只提供 properties 文件即可,之后使用 getString(key) 通过 key 获得 value的值。

编写代码案例 

创建一个JDBCUitls_V2.java 工具类

  

编写内容

package cn.jayvee.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ResourceBundle; /**
* 提供获取链接和资源的方法
* @author Jayvee
* @date 2019-5-12 下午4:22:24
* @version V1.0
*
*/
public class JDBCUtils_V2 { private static String driver;
private static String url;
private static String username;
private static String password; /**
* 静态代码块加载配置文件信息
*/
static{
// 加载配置文件
ResourceBundle bundle = ResourceBundle.getBundle("db");
driver = bundle.getString("driver");
url = bundle.getString("url");
username = bundle.getString("username");
password = bundle.getString("password");
} /**
* 获取链接方法
* @return
*/
public static Connection getConnection(){
Connection conn = null;
try {
Class.forName(driver);
conn = DriverManager.getConnection(url,username,password);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
/**
* 释放资源
* @param conn
* @param pstmt
* @param rs
*/
public static void release(Connection conn,PreparedStatement pstmt,ResultSet rs){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (pstmt!=null) {
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn!=null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

编写 TestUtils.java 文件

package cn.jayvee.test;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException; import javax.management.RuntimeErrorException; import org.junit.Test; import cn.jayvee.jdbc.JDBCUtils_V1;
import cn.jayvee.jdbc.JDBCUtils_V2; /**
* 测试工具类
*
* @author Jayvee
* @date 2019-5-12 下午4:38:54
* @version V1.0
*/
public class TestUtils { /**
* 添加用户信息方法
*/
@Test
public void testAdd(){
Connection conn = null;
PreparedStatement pstmt = null;
try {
// 1.获取连接
conn = JDBCUtils_V2.getConnection();
// 2.编写 sql 语句
String sql = "insert into student values(null,?,?)";
// 3.获取执行sql语句对象
pstmt = conn.prepareStatement(sql);
// 4.设置参数
pstmt.setString(1, "wangjiawei");
pstmt.setString(2, "25");
// 5.执行插入操作
int row = pstmt.executeUpdate();
if (row>0) {
System.out.println("添加成功!");
}else{
System.out.println("添加失败!");
}
} catch (Exception e) {
throw new RuntimeException(e);
}finally{
// 6.释放资源
JDBCUtils_V2.release(conn, pstmt, null);
}
}
/**
* 根据id查询用户信息
*/
public void testFindUserById() {
Connection conn = null;
ResultSet rs = null;
PreparedStatement pstmt = null;
try {
// 1.获取链接
conn = JDBCUtils_V1.getConnection();
// 2.编写sql语句
String sql = "select * from student where id=?";
// 3.获取执行sql语句对象
pstmt = conn.prepareStatement(sql);
// 4.设置参数(1表示第一个问号,2表示第一个问号的值是2)
pstmt.setInt(1, 2);
// 5.执行查询操作
rs = pstmt.executeQuery();
// 6.处理结果集
while (rs.next()) {
// rs.getString(2)表示获取这条数据的第二列的数据
// rs.getString("age")表示获取这条数据中age字段的之
System.out.print(rs.getString(2) + "----" + rs.getString("age"));
}
// 释放资源放在这里不可行!
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 7.释放资源
JDBCUtils_V1.release(conn, pstmt, rs);
}
} }

  

  

加载配置文件:Properties 对象

   对应 properties 文件的处理,开发中也会使用 Properties 对象将进行,在V3版本中,我们将采用加载 properties 文件获得流,然后使用 properties 对象进行处理。

创建一个JDBCUitls_V3.java 工具类

  

编写内容

package cn.jayvee.jdbc;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException; /**
* 提供获取链接和资源的方法
*
* @author Jayvee
* @date 2019-5-12 下午4:22:24
* @version V1.0
*
*/
public class JDBCUtils_V3 { private static String driver;
private static String url;
private static String username;
private static String password; /**
* 静态代码块加载配置文件信息
*/
static {
try {
// 1.通过当前类获取类加载器
ClassLoader classLoader = JDBCUtils_V3.class.getClassLoader();
// 2.通过类加载器的方法获取一个输入流
InputStream is = classLoader.getResourceAsStream("db.properties");
// 3.创建一个properties对象
java.util.Properties props = new java.util.Properties();
// 4.加载输入流
props.load(is);
// 5.获取相关参数的值
driver = props.getProperty("driver");
url = props.getProperty("url");
username = props.getProperty("username");
password = props.getProperty("password");
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 获取链接方法
*
* @return
*/
public static Connection getConnection() {
Connection conn = null;
try {
Class.forName(driver);
conn = DriverManager.getConnection(url, username, password);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
} /**
* 释放资源
*
* @param conn
* @param pstmt
* @param rs
*/
public static void release(Connection conn, PreparedStatement pstmt,
ResultSet rs) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} }

在 TestUtils.java 中编写删除方法

package cn.jayvee.test;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException; import javax.management.RuntimeErrorException; import org.junit.Test; import cn.jayvee.jdbc.JDBCUtils_V1;
import cn.jayvee.jdbc.JDBCUtils_V2;
import cn.jayvee.jdbc.JDBCUtils_V3; /**
* 测试工具类
*
* @author Jayvee
* @date 2019-5-12 下午4:38:54
* @version V1.0
*/
public class TestUtils { /**
* 根据id删除信息
*/
@Test
public void testDeleteById(){
Connection conn = null;
PreparedStatement pstmt = null;
try {
// 1.获取连接
conn = JDBCUtils_V3.getConnection();
// 2.编写 sql 语句
String sql = "delete from student where id=?";
// 3.获取执行sql语句对象
pstmt = conn.prepareStatement(sql);
// 4.设置参数
pstmt.setInt(1, 3);
// 5.执行删除操作
int row = pstmt.executeUpdate();
if (row>0) {
System.out.println("删除成功!");
}else{
System.out.println("删除失败!");
}
} catch (Exception e) {
throw new RuntimeException(e);
}finally{
// 6.释放资源
JDBCUtils_V3.release(conn, pstmt, null);
}
} /**
* 添加用户信息方法
*/
public void testAdd(){
Connection conn = null;
PreparedStatement pstmt = null;
try {
// 1.获取连接
conn = JDBCUtils_V2.getConnection();
// 2.编写 sql 语句
String sql = "insert into student values(null,?,?)";
// 3.获取执行sql语句对象
pstmt = conn.prepareStatement(sql);
// 4.设置参数
pstmt.setString(1, "wangjiawei");
pstmt.setString(2, "25");
// 5.执行插入操作
int row = pstmt.executeUpdate();
if (row>0) {
System.out.println("添加成功!");
}else{
System.out.println("添加失败!");
}
} catch (Exception e) {
throw new RuntimeException(e);
}finally{
// 6.释放资源
JDBCUtils_V2.release(conn, pstmt, null);
}
} /**
* 根据id查询用户信息
*/
public void testFindUserById() {
Connection conn = null;
ResultSet rs = null;
PreparedStatement pstmt = null;
try {
// 1.获取链接
conn = JDBCUtils_V1.getConnection();
// 2.编写sql语句
String sql = "select * from student where id=?";
// 3.获取执行sql语句对象
pstmt = conn.prepareStatement(sql);
// 4.设置参数(1表示第一个问号,2表示第一个问号的值是2)
pstmt.setInt(1, 2);
// 5.执行查询操作
rs = pstmt.executeQuery();
// 6.处理结果集
while (rs.next()) {
// rs.getString(2)表示获取这条数据的第二列的数据
// rs.getString("age")表示获取这条数据中age字段的之
System.out.print(rs.getString(2) + "----" + rs.getString("age"));
}
// 释放资源放在这里不可行!
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 7.释放资源
JDBCUtils_V1.release(conn, pstmt, rs);
}
} }

  

    

在 TestUtils.java 中编写更新方法

package cn.jayvee.test;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException; import org.junit.Test; import cn.jayvee.jdbc.JDBCUtils_V1;
import cn.jayvee.jdbc.JDBCUtils_V2;
import cn.jayvee.jdbc.JDBCUtils_V3; /**
* 测试工具类
*
* @author Jayvee
* @date 2019-5-12 下午4:38:54
* @version V1.0
*/
public class TestUtils { /**
* 根据id更新信息
*/
@Test
public void testUpdateById(){
Connection conn = null;
PreparedStatement pstmt = null;
try {
// 1.获取连接
conn = JDBCUtils_V3.getConnection();
// 2.编写 sql 语句
String sql = "update student set age=? where id=?";
// 3.获取执行sql语句对象
pstmt = conn.prepareStatement(sql);
// 4.设置参数
pstmt.setInt(1, 18);
pstmt.setInt(2, 1);
// 5.执行更新操作
int row = pstmt.executeUpdate();
if (row>0) {
System.out.println("更新成功!");
}else{
System.out.println("更新失败!");
}
} catch (Exception e) {
throw new RuntimeException(e);
}finally{
// 6.释放资源
JDBCUtils_V3.release(conn, pstmt, null);
}
}
/**
* 根据id删除信息
*/
public void testDeleteById(){
Connection conn = null;
PreparedStatement pstmt = null;
try {
// 1.获取连接
conn = JDBCUtils_V3.getConnection();
// 2.编写 sql 语句
String sql = "delete from student where id=?";
// 3.获取执行sql语句对象
pstmt = conn.prepareStatement(sql);
// 4.设置参数
pstmt.setInt(1, 3);
// 5.执行删除操作
int row = pstmt.executeUpdate();
if (row>0) {
System.out.println("删除成功!");
}else{
System.out.println("删除失败!");
}
} catch (Exception e) {
throw new RuntimeException(e);
}finally{
// 6.释放资源
JDBCUtils_V3.release(conn, pstmt, null);
}
} /**
* 添加用户信息方法
*/
public void testAdd(){
Connection conn = null;
PreparedStatement pstmt = null;
try {
// 1.获取连接
conn = JDBCUtils_V2.getConnection();
// 2.编写 sql 语句
String sql = "insert into student values(null,?,?)";
// 3.获取执行sql语句对象
pstmt = conn.prepareStatement(sql);
// 4.设置参数
pstmt.setString(1, "wangjiawei");
pstmt.setString(2, "25");
// 5.执行插入操作
int row = pstmt.executeUpdate();
if (row>0) {
System.out.println("添加成功!");
}else{
System.out.println("添加失败!");
}
} catch (Exception e) {
throw new RuntimeException(e);
}finally{
// 6.释放资源
JDBCUtils_V2.release(conn, pstmt, null);
}
} /**
* 根据id查询用户信息
*/
public void testFindUserById() {
Connection conn = null;
ResultSet rs = null;
PreparedStatement pstmt = null;
try {
// 1.获取链接
conn = JDBCUtils_V1.getConnection();
// 2.编写sql语句
String sql = "select * from student where id=?";
// 3.获取执行sql语句对象
pstmt = conn.prepareStatement(sql);
// 4.设置参数(1表示第一个问号,2表示第一个问号的值是2)
pstmt.setInt(1, 2);
// 5.执行查询操作
rs = pstmt.executeQuery();
// 6.处理结果集
while (rs.next()) {
// rs.getString(2)表示获取这条数据的第二列的数据
// rs.getString("age")表示获取这条数据中age字段的之
System.out.print(rs.getString(2) + "----" + rs.getString("age"));
}
// 释放资源放在这里不可行!
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 7.释放资源
JDBCUtils_V1.release(conn, pstmt, rs);
}
} }

项目代码:https://github.com/wjw1014/JavaMysqlStudy/tree/master/web09 (小白操作,仅供参考!)

使用JDBC完成分类表CRUD的操作的更多相关文章

  1. MySQL学习(五)——使用JDBC完成用户表CRUD的操作

    通过案例我们发现“获得连接”和“释放资源”两次代码将在之后的增删改查所有功能中都存在,开发中遇到此种情况,将采用工具类的方法进行抽取,从而达到代码的重复利用. 1.使用properties配置文件 开 ...

  2. 03008_使用JDBC对分类表进行增删改查操作

    1.创建数据库分类表 #创建数据库 create database mybase; #使用数据库 use dmybase; ###创建分类表 create table sort( sid int PR ...

  3. 通过jdbc完成单表的curd操作以及对JDBCUtils的封装

    概述:jdbc是oracle公司制定的一套规范(一套接口),驱动是jdbc的实现类,由数据库厂商提供.所以我们可以通过一套规范实现对不同的数据库操作(多态) jdbc的作用:连接数据库,发送sql语句 ...

  4. JDBC(1)-数据库连接和CRUD操作

    关于jdbc的全部jar包 链接:https://pan.baidu.com/s/1peofgu89SpepTTYuZuphNw 提取码:vd5v 一.获取数据库连接 1. Driver接口介绍 ja ...

  5. 【JDBC核心】实现 CRUD 操作

    实现 CRUD 操作 操作和访问数据库 数据库连接被用于向数据库服务器发送命令和 SQL 语句,并接受数据库服务器返回的结果.其实一个数据库连接就是一个 Socket 连接. java.sql 包中有 ...

  6. 十九 Spring的JDBC模版使用: 模版的CRUD的操作

    Spring的JDBC模版使用: 模版的CRUD的操作 保存操作 修改操作 删除操作 查询操作 import com.ithheima.jdbc.domian.Account; @RunWith(Sp ...

  7. javaweb学习总结(三十三)——使用JDBC对数据库进行CRUD

    一.statement对象介绍 Jdbc中的statement对象用于向数据库发送SQL语句,想完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查语句即可. Statement对象的exe ...

  8. javaweb(三十三)——使用JDBC对数据库进行CRUD

    一.statement对象介绍 Jdbc中的statement对象用于向数据库发送SQL语句,想完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查语句即可. Statement对象的exe ...

  9. 基于MVC4+EasyUI的Web开发框架形成之旅--基类控制器CRUD的操作

    在上一篇随笔中,我对Web开发框架的总体界面进行了介绍,其中并提到了我的<Web开发框架>的控制器的设计关系,Web开发框架沿用了我的<Winform开发框架>的很多架构设计思 ...

随机推荐

  1. 记录 Docker 的学习过程 (数据挂载)

    docker 存储篇 容器中的存储是分层的, 在容器中,如果我们要创建一个文件,会在文件的最上层(可写层)创建 容器中内置的文件,默认来讲是只读的,只有自己创建的文件才是可写状态 比如说 /etc/p ...

  2. jquery 清除内容

    jQuery empty() 方法删除被选元素的子元素. $("#div1").empty(); 清空文本框的值 $("#password").val(&quo ...

  3. .NET知识梳理——4.特性Attribute

    1. 特性 1.1        特性Attribute 特性就是一个类,继承自Attribute抽象类(该类无抽象方法.避免实例化),约定俗成用Attribute类结尾,标记时可省略掉Attribu ...

  4. intermediate-python-for-data-science

    目录 matplotlib plot Scatter Plot histogram Customization Dictionaries, Part 1 Create dictionary dicti ...

  5. SequoiaDB巨杉数据库入门:快速搭建流媒体服务器

    使用SequoiaDB的分布式文件系统搭建流媒体服务器 介绍 如今使用移动互联网的年轻人开始越来越多使用短视频展示自我,而流媒体则是支撑在线视频播放的核心技术.当我们开始构建流媒体站点时,往往面临最大 ...

  6. 【15】【有点特殊的dp】 剪绳子

    题目 给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m.n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]...k[m] .请问 k[0]k[1]...* ...

  7. 【HTML】如何在网页中屏蔽右键 ?

    如何在网页中屏蔽右键 众所周知,要保护一个页面,最基础的就是要屏蔽右键.而现在网页上用得最多的是function click(),即下面这段代码:   <script> function ...

  8. Docker+JMeter单机版+File Browser

    基于JMeter5.1.1+File Browser2.1.0  JMeter发起压测  File Browser作为文件服务器 一.目录结构: Dockerfile文件: FROM ubuntu:1 ...

  9. python之路之生成器和的迭代器

    生成器的基本原理 生成器实现xrange 迭代器

  10. layui之普通数据表格显示switch选择表单组件

    先看效果: 一般这写什么switch组件,下拉框组件只在表单显示,如果要在其他地方显示就要注意一下细节 默默跳槽一下这个layui,真的蛋疼,每次用它东西都要各种设置东西,无语 接下来看下代码: HT ...