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

1、使用properties配置文件

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

文件要求如下:

1)文件位置:任意,建议在src下

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

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

  a)key命名自定义,如果是多个单词,习惯使用点分隔。例如:jdbc.driver

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

2、创建配置文件

右击src->new->file命名...

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

3.1、加载配置文件:ResourceBundle对象(JDBCUtils_V2.java文件)

 package cn.itheima.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 Administrator
*
*/
public class JDBCUtils_V2 {
private static String driver; //驱动
private static String url; //路径
private static String username; //用户名
private static String password; //密码 /*
* 静态代码块加载配置文件信息
*/
static{
//1.使用JDK提供的工具类加载properties文件,getBundle()方法只需要填写文件,不加后缀!!!
ResourceBundle bundle=ResourceBundle.getBundle("db");
//2.通过key获得需要的值
driver=bundle.getString("driver");
url=bundle.getString("url");
username=bundle.getString("username");
password=bundle.getString("password");
} /*
* 获取连接方法
*/
public static Connection getConnection(){
Connection conn=null;
try {
//1.注册驱动
Class.forName(driver);
//2.获得连接
conn=DriverManager.getConnection(url,username,password);
} 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();
}
}
}
}

3.2、加载配置文件:Properties对象((JDBCUtils_V3.java文件)可选)

 package cn.itheima.jdbc;

 import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
import java.util.ResourceBundle; /**
* 提供获取连接和释放资源的方法
* @author Administrator
*
*/
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对象
Properties props=new 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();
}
}
/*
* 获取连接方法
*/
public static Connection getConnection(){
Connection conn=null;
try {
//1.注册驱动
Class.forName(driver);
//2.获得连接
conn=DriverManager.getConnection(url,username,password);
} 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();
}
}
}
}

4、实现CRUD操作(查询和添加使用的JDBCUtils_V2.java、删除和修改使用的是JDBCUtils_V3.java文件)

 package cn.itheima.jdbc.test;

 import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException; import org.junit.Test; import cn.itheima.jdbc.JDBCUtils_V2;
import cn.itheima.jdbc.JDBCUtils_V3; /*
* 测试工具类
*/
public class TestUtils {
/*
* 根据id查询用户信息
*/
@Test
public void testFindUserById() {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
// 1.获取连接
conn = JDBCUtils_V2.getConnection();
// 2.编写sql语句
String sql = "select * from tbl_user where uid=?";
// 3.获取执行sql语句对象
pstmt = conn.prepareStatement(sql);
// 4.设置参数
pstmt.setInt(1, 2);
// 5.执行查询操作
rs = pstmt.executeQuery();
// 6.处理结果集
while (rs.next()) {
System.out.println(rs.getString(2) + "----" + rs.getString("upassword"));
}
// 释放资源放在此处不行滴!
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 7.释放资源
JDBCUtils_V2.release(conn, pstmt, rs);
}
} /*
* 添加用户信息方法
*/
@Test
public void testAdd(){
Connection conn=null;
PreparedStatement pstmt=null;
try{
//1.获取连接
conn=JDBCUtils_V2.getConnection();
//2.编写sql语句
String sql="insert into tbl_user values(null,?,?)";
//3.获取执行sql语句对象
pstmt=conn.prepareStatement(sql);
//4.设置参数
pstmt.setString(1, "hehe");
pstmt.setString(2,"789");
//5.执行插入操作
int row=pstmt.executeUpdate();
if(row>0){
System.out.print("添加成功!");
}else{
System.out.print("添加失败 ");
}
}catch(Exception e){
e.printStackTrace();
}finally{
//6.释放资源
JDBCUtils_V2.release(conn, pstmt, null);
}
} /*
* 根据id删除用户信息
*/
@Test
public void testDeleteById(){
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
// 1.获取连接
conn = JDBCUtils_V3.getConnection();
// 2.编写sql语句
String sql = "delete from tbl_user where uid=?";
// 3.获取执行sql语句对象
pstmt = conn.prepareStatement(sql);
// 4.设置参数
pstmt.setInt(1, 4);
// 5.执行删除操作
int row=pstmt.executeUpdate();
if(row>0){
System.out.print("删除成功!");
}else{
System.out.print("删除失败 ");
}
}catch(Exception e){
e.printStackTrace();
}finally{
//6.释放资源
JDBCUtils_V3.release(conn, pstmt, null);
}
} /*
* 根据id更新用户信息
*/
@Test
public void testUpdateById(){
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
// 1.获取连接
conn = JDBCUtils_V3.getConnection();
// 2.编写sql语句
String sql = "update tbl_user set upassword=? where uid=?";
// 3.获取执行sql语句对象
pstmt = conn.prepareStatement(sql);
// 4.设置参数
pstmt.setString(1, "233");
pstmt.setInt(2, 5);
// 5.执行更新操作
int row=pstmt.executeUpdate();
if(row>0){
System.out.print("更新成功!");
}else{
System.out.print("更新失败 ");
}
}catch(Exception e){
e.printStackTrace();
}finally{
//6.释放资源
JDBCUtils_V3.release(conn, pstmt, null);
}
}
}

查询uid=2的效果如下:

添加成功的效果如下:

删除uid=4的效果如下:

更新uid=5的密码为233的效果如下:

MySQL学习(五)——使用JDBC完成用户表CRUD的操作的更多相关文章

  1. 使用JDBC完成分类表CRUD的操作

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

  2. MySQL学习笔记三:库和表的管理

    1.MySQL数据库服务配置好后,系统会有4个默认的数据库. information_schema:虚拟对象,其对象都保存在内存中 performance_schema:服务器性能指标库 mysql: ...

  3. MySQL学习之——锁(行锁、表锁、页锁、乐观锁、悲观锁等)

    转载. https://blog.csdn.net/mysteryhaohao/article/details/51669741 锁,在现实生活中是为我们想要隐藏于外界所使用的一种工具.在计算机中,是 ...

  4. MySQL学习【第三篇用户管理】

    一.用户管理 1.给mysql用户设密码以及删除用户 1.给mysql的root用户设置密码 [root@db02 scripts]# mysqladmin -uroot -p password '1 ...

  5. mysql安装,卸载; 库和表的基础操作

    数据库  """ 1.什么是数据库:管理数据的系统 - 安装某种管理数据的系统 - 管理的对象本质是文件 2.存储数据的位置:内存.硬盘 3.什么是系统:运行在硬件基础上 ...

  6. MySQL学习(四)Join 等开发常用的操作 --- 2019年2月

    1.查数据太多不会把内存用光 InnoDB 的数据是保存在主键索引上,然后索引树分割保存在数据页上,数据页存在内存中/磁盘.change buffer 就是先把修改操作记录,然后读数据的时候,内存没有 ...

  7. 【MySQL】实现线上千万数据表添加字段操作以及缓存刷新

    需求背景: 由于业务需求,需要在线上用户表添加渠道字段,用于区分不同渠道注册的用户,目前该表有20+个字段,8个索引 线上用户数据大概1500W左右,需要不停机增加数据库字段,同时需要刷新Redis缓 ...

  8. MySql学习(五) —— 数据库优化理论篇(一)

    一.数据库管理系统 数据库管理系统(Database Management System, DBMS) 衡量是否是数据库的标准: ACID:是指在数据库管理系统(DBMS)中事务所具有的四个特性: 1 ...

  9. Mysql系列五:数据库分库分表中间件mycat的安装和mycat配置详解

    一.mycat的安装 环境准备:准备一台虚拟机192.168.152.128 1. 下载mycat cd /softwarewget http:-linux.tar.gz 2. 解压mycat tar ...

随机推荐

  1. 洛谷P3381 【模板】最小费用最大流(dijstra费用流)

    题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表 ...

  2. IntelliJ Idea下Go项目开启Debug调试

    1.新建Go项目,创建入口go文件(Test1.go),随便写点啥,比如: package main import "fmt" func main(){ fmt.Println(& ...

  3. UWP Control Toolkit Collections 求UWP工作

    1. it is like wechat wait-sliderdeleteitem in iOS 看起来比较像微信删掉项 now support listview and gridview in C ...

  4. ZBrush中Pinch捏挤笔刷介绍

    随着版本的升级ZBrush®中给我们提供了越来越多的笔刷,对于这款软件来说,笔刷的使用是第一要素,也会一直伴随我们创作.虽然Zbrush中有那么多的笔刷,但是很多朋友会根据自己的习惯来使用,这个并不是 ...

  5. 第四章 Python之文件处理

    文件操作 文件操作一般分为三步:打开文件得到文件句柄并赋值给一个变量--->通过句柄对文件进行操作-->关闭文件 f=open(r'C:\Users\hesha\PycharmProjec ...

  6. v4l2程序实例

    #include <stdio.h> #include <string.h> #include <errno.h> #include <stdlib.h> ...

  7. MyEclipse报错Access restriction: The type BASE64Encoder is not accessible due to restriction on required library

    错误截图: 解决办法: 1.进入Project --> Properties --> Java Build Path --> Libraries 2.remove 掉 JRE Sys ...

  8. poj2411 Mondriaan's Dream (状压dp+多米诺骨牌问题)

    这道题的解析这个博客写得很好 https://blog.csdn.net/shiwei408/article/details/8821853 大致意思就是我们可以只处理两行之间的关系,然后通过这两个关 ...

  9. async、await 优缺点

    async.await 优缺点 async 和 await 相比直接使用 Promise 来说,优势在于处理 then 的调用链,能够更清晰准确的写出代码.缺点在于滥用 await 可能会导致性能问题 ...

  10. NoReferencedTableError: Foreign key associated with column ** with which to generate a foreign key to target column 'id'

    1.使用 python flask 框架做项目时,在实体类中配置了 映射关系, message: id = db.Column(db.Integer, primary_key=True)message ...