学习目标
-
能够理解JDBC的概念
-
能够使用Connection接口
-
能够使用Statement接口
-
能够使用ResultSet接口
-
能够使用JDBC实现对单表数据增、删、改、查
-
能够使用JDBC操作事务
-
能够编写JDBC工具类
-
能够完成JDBC实现登录案例
02.JDBC:介绍【理解】
引入
为什么学习JDBC?
jdbc就是使用java代码操作数据库
用户是浏览器访问的web服务器(web后端–java代码),java代码操作永久的数据与数据库打交道
目标
- 理解JDBC的介绍
- 理解JDBC的作用
客户端操作MySQL数据库的方式
mysql数据库服务器有哪些:
1、dos命令行客户端访问数据库
2、sqlYog图形界面客户端访问数据库
3、java代码客户端访问数据库服务器【重要】
java代码会将sql命令给到数据库去操作,sql命令不变的
JDBC介绍
Java Data Base Connectivity , java数据库连接技术。jdbc是一套接口规范,运行开发人员根据接口规范连接访问操作不同的数据库。
java的接口: public interface 接口名字{ //定义抽象方法 } 抽象方法由实现类去实现
JDBC的作用
就是java操作数据库的技术
JDBC的由来
-
古老的做法:java程序与数据库进行通信编程操作数据库的数据
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ibI9OTe7-1606227564242)(/image-20200517211306124.png)]
缺点
1、java程序要写很复杂的通信代码与数据库进行交互
2、java程序要写不同的几套代码分别操作不同的数据库,操作一个数据库就要有一套不同的代码,非常麻烦
3、数据库是别人的,如果数据库经常升级,那么java程序也要升级,维护成本相当高
-
现代做法:java使用jdbc(一套接口)操作数据库
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s9kz9Cfq-1606227564244)(/image-20200518014306809.png)]操作过程
1、java提供了一套接口JDBC用于操作不同的数据库,JDBC接口的实现类是由数据库厂商提供,这些事项类有个专业名字数据库驱动,不同的数据库,有不同的驱动;
2、开发人员操作JDBC接口即可就访问操作了不同的数据库,所有通信的底层都有数据库厂商实现。
JDBC的好处
1、使用一套接口可以操作不同的数据库,使用非常简单,不用关系底层网络编程通信
2、切换数据库非常方便,只需要修改很少的内容就可以完成数据库切换,比如:mysql数据库切换为oracle
小结
-
说出JDBC的概念?
Java Data Base Connectivity java数据库连接技术
-
说出JDBC的作用?
就是使用java代码客户端操作不同的数据库
03.JDBC:操作数据库步骤【理解】
目标
1、理解jdbc操作数据库步骤
2、能够理解JDBC四个核心接口
讲解
JDBC会用到的包
1、jdk包(提供JDBC接口)
java.sql包: jdk普通包, 比如使用其中的接口java.sql.Connection,数据库连接接口
javax.sql包 : jdk的扩展包, 比如使用其中的接口javax.sql.DataSource, 数据库连接池
2、数据库驱动包(实现JDBC接口的实现类)
各个数据库厂商提供,比如我们操作mysql数据库,就需要导入mysql的数据库驱动包
JDBC访问数据库的步骤
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7T9qlB59-1606227564246)(/image-20200518095144310.png)]
小结
jdbc操作数据库步骤?
1、导入mysql数据库驱动包
2、注册mysql数据库驱动(DriverManager)
3、使用驱动获取数据库连接(Connection)
4、使用数据库连接创建运输器(Statement)
5、使用运输器发送sql并获取返回的结果(ResultSet)
04.JDBC:注册mysql驱动【理解】
目标
能够导入mysql驱动Jar包
能够通过JDBC注册数据库驱动
为什么注册mysql驱动?
因为mysql驱动包有JDBC接口的实现类
导入mysql驱动包
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-humeKNLq-1606227564248)(/image-20200518101045494.png)]
注册驱动代码
package _01_注册数据库驱动;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
* @author 黑马程序员
*/
public class Demo1 {
public static void main(String[] args) throws SQLException, ClassNotFoundException {
/*
* 目标:注册mysql数据库驱动
* 注册数据库驱动语法:
* DriverManager.registerDriver(Driver driver);
* 说明:Driver,英文“驱动”
* mysql驱动类:com.mysql.jdbc.Driver
* */
//注册驱动
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
//认识com.mysql.jdbc.Driver的源码
//源码分析结论:Driver类里面的静态代码块已经将驱动注册了
//疑问:DriverManager.registerDriver(new com.mysql.jdbc.Driver());注册了几次驱动?
//答:2次
//new com.mysql.jdbc.Driver(): 内部注册了第一次驱动
//DriverManager.registerDriver(上面的驱动对象):注册了第二次驱动
/*
* 注册驱动一次的方式:
* 方式1:直接new对象,new com.mysql.jdbc.Driver()
* 方式2:反射方式,Class.forName("com.mysql.jdbc.Driver"); 创建指定类的字节码对象Class
* 说明:反射方式创建Class字节码对象的时候,就会运行Drive类里面的静态代码块,实现注册驱动
*
* 推荐:使用方式2反射方式注册驱动
* 以后企业中的项目会连接不同的数据库,会将不同的数据库驱动类配置在配置文件中
* 我们需要读取配置文件中的驱动类全名:"com.mysql.jdbc.Driver"给到java代码去注册驱动
* 好处:便于切换数据库
* */
//验证创建Person类的字节码对象会不会运行里面的静态代码块
//Class.forName("_01_注册数据库驱动.Person");
//结论:会运行静态代码块
}
}
class Person{
static{
System.out.println("运行了Person的静态代码块");
}
}
运行效果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZlVPJ8mq-1606227564251)(/image-20200518102634949.png)]
小结
- 为什么要导入数据库厂商的mysql驱动Jar包?
因为mysql驱动包实现了JDBC的接口
-
JDBC注册数据库驱动代码推荐实现方式?
Class.forName("com.jdbc.mysql.Driver");
05.JDBC:获取数据库连接【应用】
目标
能够通过JDBC获取数据库连接
为什么获取数据库连接
因为通过连接操作数据库
创建day23数据库
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GgSHX2wT-1606227564252)(/image-20200518104935158.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RgwHXnA6-1606227564253)(/image-20200518104959732.png)]
目的是:通过jdbc连接这个数据库day23
获取数据库连接代码
package _02_获取数据库连接;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
* @author 黑马程序员
*/
public class Demo2 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
/*
* 目标:使用JDBC接口获取数据库连接对象并打印出来
* */
//1、注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2、获取数据库连接
// 获取连接的语法:
// Connection DriverManager.getConnection(String url,String user,String password);
// 含义:根据连接数据库的连接字符串、用户名和密码获取一个mysql的数据库连接对象
// 参数介绍:
// 第一个参数:url
// url作用:用于设置数据库服务器连接字符串
// url格式:jdbc:mysql://主机名:端口号/数据库名?name1=value1&name2=value2...
// jdbc介绍:连接的主协议,连接任何数据库主协议固定值
// mysql介绍:连接的子协议,不同的数据库不一样,这里代表连接mysql数据库服务器
// 主机名介绍:mysql数据库服务器的地址,本机是localhost,其他远程写ip就可以
// 端口号介绍:3306,设置mysql数据库的端口号,不同数据库不一样
// 数据库名介绍:指定要连接的具体数据库,例如:day23
// ?后面传递参数介绍:get方式传递请求参数数据
// 常用请求参数:characterEncoding=utf8
// 这个参数含义:设置客户端发送数据字符的码表
// 完整格式:
// jdbc:mysql://localhost:3306/day23?characterEncoding=utf8
// 简写格式(如果是本机数据库服务器,简写方式):
// jdbc:mysql:///day23?characterEncoding=utf8
// 第二个参数:user, 用于设置数据库账号名,这里使用"root"
// 第三个参数:password, 用于设置数据库账号的密码,这里使用"root"
//代码
Connection connection = DriverManager.getConnection(
"jdbc:mysql:///day23?characterEncoding=utf8",
"root",
"root"
);
System.out.println(connection);
//注意:每个信息都不能错,否则会发生异常,比如密码写错了,就会发生如图效果
}
}
效果
1.连接成功
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mBTtCNV2-1606227564254)(/image-20200518105610705.png)]
2.连接失败
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gB53DWFX-1606227564255)(/jdbc15.png)]
小结
-
JDBC获取数据库连接使用哪个API?
DriverManager.getConnection(url,user,password)
-
访问本机数据库连接字符串URL推荐写法?
jdbc:mysql:///数据库名?characterEncoding=utf8
06.JDBC:增加-删除-修改操作【应用】
目标
通过JDBC实现对数据增、删、改
案例效果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pC160ue3-1606227564256)(/image-20200518113207769.png)]
1、插入数据:手机
2、修改cid=2的类别名称为“化妆品”
3、将cid=1的数据删除
准备数据
-- 创建分类表
CREATE TABLE category (
cid INT PRIMARY KEY AUTO_INCREMENT,
cname VARCHAR(100)
);
-- 初始化数据
INSERT INTO category (cname) VALUES('家电');
INSERT INTO category (cname) VALUES('服饰');
INSERT INTO category (cname) VALUES('化妆品');
案例代码
package _03_使用Statement进行增删改数据;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/**
* @author 黑马程序员
*/
public class Demo3 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
/*
目标:使用Statement操作增、删、改
* 1、插入数据:手机
2、修改cid=2的类别名称为“化妆品”
3、将cid=1的数据删除
* */
//1、注册数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//2、获取数据库连接
Connection connection = DriverManager.getConnection(
"jdbc:mysql:///day23?characterEncoding=utf8",
"root",
"root"
);
//3、根据连接创建运输器Statement
//创建语法:Statement connection.createStatement();
Statement stmt = connection.createStatement();
//4、发送sql命令给数据库服务器去执行
/*
* Statement接口的方法1【推荐】:
* int executeUpdate(String sql);
* 含义:发送DML(增、删、改)命令的sql语句给数据库去执行并返回影响的行数int
* Statement接口的方法2【推荐】:
* ResultSet executeQuery(String sql);
* 含义:发送DQL(查询)命令的sql语句给数据库去执行并返回数据集ResultSet对象
* Statement接口的方法3【了解】:
* boolean execute(String sql);
* 含义:发送DQL(查询)/DML(增、删、改)命令的sql语句给数据库去执行并返回boolean数据
* 返回true: 代表执行的是DQL语句, 里面会判断是否有ResultSet返回,有就会返回true
* 返回false: 代表执行的是DML语句
* */
//命令1:插入数据:手机
String sql1 = "insert into category(cname) values('手机')";
int count = stmt.executeUpdate(sql1);
System.out.println("插入影响的行数:"+count);
//命令2:修改cid=2的类别名称为“化妆品”
String sql2="update category set cname='化妆品' where cid=2;";
//说明:在java代码中写sql语句命令结尾的分号,可有可无,推荐不用写
count = stmt.executeUpdate(sql2);
System.out.println("修改影响的行数:"+count);
//命令3:将cid=1的数据删除
String sql3 = "delete from category where cid=1";
count = stmt.executeUpdate(sql3);
System.out.println("删除影响的行数:"+count);
//5、释放资源
//分析:connection是连接资源需要释放,Statement是运输器也是资源需要释放
stmt.close();
connection.close();
}
}
小结
-
如何获取执行数据操作命令的对象Statement?
connection.createStatement();
-
执行增删改的sql语句命令的方法?
int stmt.executeUpdate(sql语句);
07.JDBC:查询数据【应用】
目标
能够掌握JDBC实现对数据查询
案例效果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B0o6A6pe-1606227564257)(/image-20200518120448342.png)]
查询过程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P4TavP6i-1606227564258)(/1554738711124.png)]
ResultSet的原理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AX3egUt6-1606227564259)(/image-20200518115746964.png)]
ResultSet获取数据的API
其实ResultSet获取数据的API是有规律的get后面加数据类型。我们统称getXXX()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NWPaHMK4-1606227564260)(/jdbc19.png)]
使用JDBC执行查询数据的步骤
- 注册驱动
- 获取连接
- Statement执行sql命令
- 释放资源
实现代码
package _04_使用Statement进行查询数据;
import java.sql.*;
/**
* @author 黑马程序员
*/
public class Demo4 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
/*
目标:使用Statement操作查询分类表所有数据
* */
//1、注册数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//2、获取数据库连接
Connection connection = DriverManager.getConnection(
"jdbc:mysql:///day23?characterEncoding=utf8",
"root",
"root"
);
//3、根据连接创建运输器Statement
Statement stmt = connection.createStatement();
//4、发送查询sql命令给数据库服务器去执行
/*
* Statement接口的查询方法:
* ResultSet executeQuery(String sql);
* 含义:发送DQL(查询)命令的sql语句给数据库去执行并返回数据集ResultSet对象
* */
String sql = "select * from category";
ResultSet rs = stmt.executeQuery(sql);
//解析ResultSet获取里面的数据
while(rs.next()){
//读取cid,根据位置获取
int cid = rs.getInt(1);//位置从1开始
//读取cname,根据字段名获取
String cname = rs.getString("cname");
//打印
System.out.println(cid+"===》"+cname);
}
//5、释放资源
//分析:connection需要释放,statement需要释放,resultSet是游标指针是一条一条从数据库获取需要释放资源
rs.close();
stmt.close();
connection.close();
}
}
注意:
- 如果光标在第一行之前,使用rs.getXXX()获取列值,报错:Before start of result set
- 如果光标在最后一行之后,使用rs.getXXX()获取列值,报错:After end of result set
小结
-
jdbc执行查询命令的方法?
ResultSet stmt.executeQuery(sql);
-
获取查询返回结果集类与如何读取及结果集数据?
while(rs.next){ rs.getXxxx(位置)/rs.getXxxx(字段名) 位置从1开始 }
08.BUG:经验分享【应用】
Bug1:没有导入驱动包的异常
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UtfoylOo-1606227564261)(/image-20200518141139978.png)]
运行程序就会报错
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UyaqTavo-1606227564262)(/image-20200518141314362.png)]
如何解决?
答:将mysql驱动包导入即可
为什么编译时不会发生错误?
答:编译时idea语法检查都是检查JDBC接口类型,由于已导入jdk包所以不会报错,但是运行程序的时候需要
JDBC接口实现类数据库驱动包,由于没有导入所以运行时是报错的
Bug2:执行增删改的错误使用
描述
初学者就会executeUpdate与executeQuery使用时混淆,执行增删改时使用了executeQuery
代码操作与异常信息
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xaej3Q9P-1606227564263)(/image-20200518141926290.png)]
如何解决
查询使用:executeQuery();
增删改使用:executeUpdate();
不能混淆
09.JDBC:手动事务【应用】
目标
能够掌握JDBC操作事务
讲解
之前我们是使用MySQL的命令来操作事务。接下来我们使用JDBC来操作银行转账的事务。
准备数据
CREATE TABLE account (
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10),
balance DOUBLE
);
-- 添加数据
INSERT INTO account (NAME, balance) VALUES ('张三', 1000), ('李四', 1000);
API介绍
Connection
接口中与事务有关的方法
-
void setAutoCommit(boolean autoCommit) throws SQLException; //autoCommit取值,false:不自动提交事务, ture:自动提交事务
-
void commit() throws SQLException; //提交事务
-
void rollback() throws SQLException; //回滚事务
手动事务的使用代码
try{
//开启手动事务
connection.setAutoCommit(false);
//执行业务操作
//执行第一条sql命令
//执行第二条sql命令
//执行第n条sql命令
//上面的命令没有发生错误,提交事务
connection.commit();
}catch(Exception e){
//如果上面某一条sql命令发生异常或错误就会来到这里,回滚事务
connection.rollback();
}
案例效果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ugsBnhqz-1606227564264)(/image-20200518022035094.png)]
第一次成功转账案例代码
package _05_使用JDBC事务进行转账业务;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/**
* @author 黑马程序员
*/
public class Demo5_COMMIT {
public static void main(String[] args) throws SQLException {
/*
* 目标:使用JDBC事务实现张三给李四转500元
* 分析:2条sql命令
* 转出sql、转入sql
* */
//1、定义使用的对象
Connection conn = null;
Statement stmt = null;
try {
//2、加载驱动
Class.forName("com.mysql.jdbc.Driver");
//3.获取连接
conn = DriverManager.getConnection(
"jdbc:mysql:///day23?characterEncoding=utf8",
"root",
"root"
);
//4、开启手动事务
conn.setAutoCommit(false);
//5、获取运输器
stmt = conn.createStatement();
//6、执行业务命令
//命令1:张三转出500
String sql = "update account set balance=balance-500 where name='张三'";
stmt.executeUpdate(sql);
//命令2:李四转入500
sql = "update account set balance=balance+500 where name='李四'";
stmt.executeUpdate(sql);
//7.运行到这里说明上面命令全部执行成功, 提交事务
conn.commit();
} catch (Exception e) {
e.printStackTrace();
//8.上面命令有错误会来到这里,回滚事务
conn.rollback();
}finally {
//无论是否发送异常,都要释放资源
if(stmt!=null){
stmt.close();
}
if(conn!=null){
conn.close();
}
}
}
}
第二次失败转账案例代码
package _05_使用JDBC事务进行转账业务;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/**
* @author 黑马程序员
*/
public class Demo6_ROLLBACK {
public static void main(String[] args) throws SQLException {
/*
* 目标:使用JDBC事务实现张三给李四转500元(让其发生错误回滚事务)
* 分析:2条sql命令
* 转出sql、转入sql
* */
//1、定义使用的对象
Connection conn = null;
Statement stmt = null;
try {
//2、加载驱动
Class.forName("com.mysql.jdbc.Driver");
//3.获取连接
conn = DriverManager.getConnection(
"jdbc:mysql:///day23?characterEncoding=utf8",
"root",
"root"
);
//4、开启手动事务
conn.setAutoCommit(false);
//5、获取运输器
stmt = conn.createStatement();
//6、执行业务命令
//命令1:张三转出500
String sql = "update account set balance=balance-500 where name='张三'";
stmt.executeUpdate(sql);
//发生异常错误
int a = 1/0; //自己模拟错误
//命令2:李四转入500
sql = "update account set balance=balance+500 where name='李四'";
stmt.executeUpdate(sql);
//7.运行到这里说明上面命令全部执行成功, 提交事务
conn.commit();
} catch (Exception e) {
e.printStackTrace();
//8.上面命令有错误会来到这里,回滚事务
conn.rollback();
}finally {
//无论是否发送异常,都要释放资源
if(stmt!=null){
stmt.close();
}
if(conn!=null){
conn.close();
}
}
}
}
小结
-
JDBC中手动控制事务代码?
connection.setAutoCommit(fasle);//手动提交事务 connection.commit();//不发生异常,提交事务 connection.rollback();//发生异常,回滚事务
10.JDBC工具类:编写【应用】
目标
能够编写JDBC获取连接与关闭资源的工具类
分析
每次使用JDBC操作数据库都要获取连接、并且释放资源,做着重复的事情,怎么办?
答:将获取连接与释放资源抽取到一个工具类中,之后就可以重用
JDBC工具类代码
JDBCUtils.java
package _06_编写JDBC工具类;
import java.sql.*;
/**
* @author 黑马程序员
*/
public class JdbcUtils {
//定义使用的信息
private static String URL = "jdbc:mysql:///day23?characterEncoding=utf8";
private static String Driver = "com.mysql.jdbc.Driver";
private static String USER = "root";
private static String PASSWORD = "root";
//1、对外提供获取数据库连接的方法
public static Connection getConnection() throws Exception {
//加载驱动
Class.forName(Driver);
//获取连接返回
return DriverManager.getConnection(URL,USER,PASSWORD);
}
//2、对外提供释放资源的方法
//2.1 提供查询释放3个资源的方法
public static void close(Connection conn, Statement stmt, ResultSet rs) throws Exception {
if(rs!=null){
rs.close();
}
if(stmt!=null){
stmt.close();
}
if(conn!=null){
conn.close();
}
}
//2.2 提供增删改释放2个资源的方法
public static void close(Connection conn, Statement stmt) throws Exception {
close(conn,stmt,null);
}
}
案例:使用jdbc工具类进行如下操作数据库
案例需求
- 创建一张员工表,包含id,name,age,address字段.
- 添加员工数据
- 修改员工数据
- 删除员工数据。
案例效果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v0JF4dPW-1606227564265)(/jdbc22.png)]
案例代码
package _07_使用jdbc工具类实现增删改;
import _06_编写JDBC工具类.JdbcUtils;
import java.sql.Connection;
import java.sql.Statement;
/**
* @author 黑马程序员
*/
public class Demo7 {
public static void main(String[] args) throws Exception {
//createTable();
//addEmployee();
//updateEmployee();
deteleEmployee();
}
//执行创建表的命令
private static void createTable() throws Exception {
//1、定义sql命令
String sql = "create table emp(\n" +
"id int primary key auto_increment,\n" +
"name varchar(200),\n" +
"age int,\n" +
"address varchar(50)\n" +
")";
//2、获取数据库连接
Connection conn = JdbcUtils.getConnection();
//3、获取运输器
Statement stmt = conn.createStatement();
//4、执行命令
stmt.executeUpdate(sql);//只要不是查询就使用这个执行sql命令
//5、释放资源
JdbcUtils.close(conn,stmt);
System.out.println("创建表成功");
}
//执行4个员工
private static void addEmployee() throws Exception {
//1、定义sql命令
String sql = "insert into emp \n" +
"values(null,'张三4',20,'北京'),\n" +
" (null,'李四4',21,'南京'),\n" +
" (null,'王五4',18,'东京'),\n" +
" (null,'赵六4',17,'西安')";
//2、获取数据库连接
Connection conn = JdbcUtils.getConnection();
//3、获取运输器
Statement stmt = conn.createStatement();
//4、执行命令
stmt.executeUpdate(sql);//只要不是查询就使用这个执行sql命令
//5、释放资源
JdbcUtils.close(conn,stmt);
System.out.println("插入表成功");
}
//更新id=3的员工姓名为田七,地址为天津
private static void updateEmployee() throws Exception {
//1、定义sql命令
String sql = "update emp set name='田七',address='天津' where id=3";
//2、获取数据库连接
Connection conn = JdbcUtils.getConnection();
//3、获取运输器
Statement stmt = conn.createStatement();
//4、执行命令
stmt.executeUpdate(sql);//只要不是查询就使用这个执行sql命令
//5、释放资源
JdbcUtils.close(conn,stmt);
System.out.println("更新成功");
}
//删除id=3
private static void deteleEmployee() throws Exception {
//1、定义sql命令
String sql = "delete from emp where id=3";
//2、获取数据库连接
Connection conn = JdbcUtils.getConnection();
//3、获取运输器
Statement stmt = conn.createStatement();
//4、执行命令
stmt.executeUpdate(sql);//只要不是查询就使用这个执行sql命令
//5、释放资源
JdbcUtils.close(conn,stmt);
System.out.println("删除成功");
}
}
小结
-
jdbc操作工具类提供哪些功能?
获取数据库连接的方法
释放资源的方法
11.JDBC工具类:配置文件优化【应用】
目标
优化工具类,将配置数据放入到配置文件中
为什么将配置数据放入到配置文件中?
以后企业会切换数据库,切换数据库主要是4个配置参数,如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RGvbryd8-1606227564267)(/image-20200518153714286.png)]
上面的参数需要修改,最后不要写死在代码里面,应该放入到配置文件中,让企业的工作人员可以做出对应的修改
操作步骤
1、在src目录下新建一个文件jdbc.properties,配置4个参数的信息
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bIP10714-1606227564268)(/image-20200518154120356.png)]
jdbc.properties代码
URL=jdbc:mysql:///day23?characterEncoding=utf8
Driver=com.mysql.jdbc.Driver
USER=root
PASSWORD=root
2、在JdbcUtils.java工具类中读取配置文件设置参数
实现代码
JdbcUtils工具类代码
package _06_编写JDBC工具类;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
/**
* @author 黑马程序员
*/
public class JdbcUtils {
//定义使用的信息
/* private static String URL = "jdbc:mysql:///day23?characterEncoding=utf8";
private static String Driver = "com.mysql.jdbc.Driver";
private static String USER = "root";
private static String PASSWORD = "root";
*/
private static String URL;
private static String Driver;
private static String USER;
private static String PASSWORD;
static {
try {
//在静态代码块中初始化上面的参数
//1、获取配置文件jdbc.properties文件的输入流(获取类路径下的资源输入流)
InputStream inputStream = JdbcUtils.class.getResourceAsStream("/jdbc.properties");
//2、解析properties文件内容使用Properties类
Properties properties = new Properties();
properties.load(inputStream);
//3.读取配置文件的数据给参数初始化
URL = properties.getProperty("URL");
Driver = properties.getProperty("Driver");
USER = properties.getProperty("USER");
PASSWORD = properties.getProperty("PASSWORD");
} catch (IOException e) {
e.printStackTrace();
}
}
//1、对外提供获取数据库连接的方法
public static Connection getConnection() throws Exception {
//加载驱动
Class.forName(Driver);
//获取连接返回
return DriverManager.getConnection(URL,USER,PASSWORD);
}
//2、对外提供释放资源的方法
//2.1 提供查询释放3个资源的方法
public static void close(Connection conn, Statement stmt, ResultSet rs) throws Exception {
if(rs!=null){
rs.close();
}
if(stmt!=null){
stmt.close();
}
if(conn!=null){
conn.close();
}
}
//2.2 提供增删改释放2个资源的方法
public static void close(Connection conn, Statement stmt) throws Exception {
close(conn,stmt,null);
}
}
小结
-
为什么将配置数据放入到配置文件中?
以后企业会切换数据库,企业的工作人员只要修改配置文件就可以切换数据库
12.JDBC:登录案例【应用】
目标
模拟用户输入账号和密码登录网站
- 输入正确的账号,密码,显示登录成功
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4n30Ieyf-1606227564270)(/登录案例01.png)] - 输入错误的账号,密码,显示登录失败
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SGMEQbXi-1606227564271)(/登录案例02.png)]
数据准备
CREATE TABLE USER (
id INT AUTO_INCREMENT PRIMARY KEY,
NAME VARCHAR(50),
PASSWORD VARCHAR(50)
);
INSERT INTO USER (NAME, PASSWORD) VALUES('admin', '123'), ('test', '123'), ('gm', '123');
案例分析
- 如何知道用户名与密码是否正确呢?
根据控制台获取输入的用户名与密码查询数据库,如果有就代表登录成功,否则登录失败
select * from user where name='输入的用户名' and password='输入的密码'
实现代码
package _08_登录案例;
import _06_编写JDBC工具类.JdbcUtils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;
/**
* @author 黑马程序员
*/
public class LoginTest {
public static void main(String[] args) throws Exception {
/*
* 目标:模拟用户登录案例
* */
//1、创建控制台输入流
Scanner sc = new Scanner(System.in);
//2、进行输出与获取用户名与密码
System.out.println("请输入账号:");
String name = sc.nextLine();
System.out.println("请输入密码:");
String password = sc.nextLine();
//3、执行数据库操作查询数据
String sql = "select * from user where name='"+name+"' and password='"+password+"'";
Connection conn = JdbcUtils.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
//4、校验登录结果
//分析:rs移动一次游标指针如果有数据就代表用户名与密码正确
if(rs.next()){
//登录成功
System.out.println("欢迎您,"+name);
}else{
//登录失败
System.out.println("账号或密码错误...");
}
//5、释放资源
JdbcUtils.close(conn,stmt,rs);
}
}
小结
-
如何知道用户登录成功?
根据输入的用户名与密码查询数据库,有数据代表登录成功,否则登录失败