MySQL学习(五)——使用JDBC完成用户表CRUD的操作
通过案例我们发现“获得连接”和“释放资源”两次代码将在之后的增删改查所有功能中都存在,开发中遇到此种情况,将采用工具类的方法进行抽取,从而达到代码的重复利用。
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的操作的更多相关文章
- 使用JDBC完成分类表CRUD的操作
工具类 通过之前的案例回顾,不难发现,有很多的代码操作是重复的,比如“获取链接”和“释放资源”等,将来在增删改查中经常遇到,开发中遇到这种情况,将采用工具类的方法进行抽取,从而达到代码的重复利用. 此 ...
- MySQL学习笔记三:库和表的管理
1.MySQL数据库服务配置好后,系统会有4个默认的数据库. information_schema:虚拟对象,其对象都保存在内存中 performance_schema:服务器性能指标库 mysql: ...
- MySQL学习之——锁(行锁、表锁、页锁、乐观锁、悲观锁等)
转载. https://blog.csdn.net/mysteryhaohao/article/details/51669741 锁,在现实生活中是为我们想要隐藏于外界所使用的一种工具.在计算机中,是 ...
- MySQL学习【第三篇用户管理】
一.用户管理 1.给mysql用户设密码以及删除用户 1.给mysql的root用户设置密码 [root@db02 scripts]# mysqladmin -uroot -p password '1 ...
- mysql安装,卸载; 库和表的基础操作
数据库 """ 1.什么是数据库:管理数据的系统 - 安装某种管理数据的系统 - 管理的对象本质是文件 2.存储数据的位置:内存.硬盘 3.什么是系统:运行在硬件基础上 ...
- MySQL学习(四)Join 等开发常用的操作 --- 2019年2月
1.查数据太多不会把内存用光 InnoDB 的数据是保存在主键索引上,然后索引树分割保存在数据页上,数据页存在内存中/磁盘.change buffer 就是先把修改操作记录,然后读数据的时候,内存没有 ...
- 【MySQL】实现线上千万数据表添加字段操作以及缓存刷新
需求背景: 由于业务需求,需要在线上用户表添加渠道字段,用于区分不同渠道注册的用户,目前该表有20+个字段,8个索引 线上用户数据大概1500W左右,需要不停机增加数据库字段,同时需要刷新Redis缓 ...
- MySql学习(五) —— 数据库优化理论篇(一)
一.数据库管理系统 数据库管理系统(Database Management System, DBMS) 衡量是否是数据库的标准: ACID:是指在数据库管理系统(DBMS)中事务所具有的四个特性: 1 ...
- Mysql系列五:数据库分库分表中间件mycat的安装和mycat配置详解
一.mycat的安装 环境准备:准备一台虚拟机192.168.152.128 1. 下载mycat cd /softwarewget http:-linux.tar.gz 2. 解压mycat tar ...
随机推荐
- php.ini控制文件上传大小配置项
; Whether to allow HTTP file uploads.file_uploads = On ; Temporary directory for HTTP uploaded files ...
- HD-ACM算法专攻系列(22)——Max Sum
问题描述: AC源码: 此题考察动态规划,解题思路:遍历(但有技巧),在于当前i各之和为负数时,直接选择以第i+1个为开头,在于当前i各之和为正数时,第i个可以不用作为开头(因为前i+1个之和一定大于 ...
- 自定义TempData跨平台思路
一:TempData的自定义实现... TempData是用Session实现的,既然是Session,那模式是线程方式...这样的Session是没法进行跨平台的... 那么这就涉及到如何在多台机器 ...
- Java 多线程(一)Thread
线程的六种状态 1.新建状态 new了但是没有启动的线程的状态,如“Thread thread = new Thread()”,thread就是一个处于新建状态的线程. 2.运行状态 new出来的线程 ...
- Android ListView getView()方法重复调用导致position错位
问题现状:Android ListView getView()方法重复调用导致position错位 解决办法:把ListView布局文件的layout_height属性改为fill_parent或者m ...
- asp实现阿里大鱼短信API接口的方法
阿里大鱼是阿里推出的产品,官方提供JAVA..NET.PHP等版本的SDK下载,不知为何,唯独不提供ASP版本的SDK. 不提供没关系,自己写就是了,参照官方提供的API写一个就是了. 本来以为无非是 ...
- List of features and minimum Clang version with support
#1: C++11 Language Feature C++11 Proposal Available in Clang? Rvalue references N2118 Clang 2.9 ...
- map————两个数组的交集(2)
class Solution { public: vector<int> intersect(vector<int>& nums1, vector<int> ...
- Codeforces Round #487 (Div. 2) C. A Mist of Florescence 构造
题意: 让你构造一个 n∗mn*mn∗m 矩阵,这个矩阵由 444 种字符填充构成,给定 444 个整数,即矩阵中每种字符构成的联通块个数,n,mn,mn,m 需要你自己定,但是不能超过505050. ...
- 【HiJ1m】在NOIP2017前写过的有用的东西汇总
http://www.cnblogs.com/Elfish/p/7544623.html 高级树状数组 http://www.cnblogs.com/Elfish/p/7554420.html BST ...