1、JDBC概述
a、Java DataBase Connectivity Java 数据库连接技术
b、顾名思义:就是用过java语言操作数据库,操作表中的数据
c、是官方定义的一套操作所有关系型数据库的规则(接口)
1、在java中想要访问数据库只能通过JDBC
2、JDBC是java访问数据的基础,其他数据访问技术都是对JDBC的封装(hb,mb)
3、JDBC是为了访问不同的数据库,提供了一种同一的访问方式
4、JDBC本身是java连接数据库的一个标准,是进行数据库连接的抽象层,接口的实现由各大厂商来实现
实现步骤:
1. 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar
1.复制mysql-connector-java-5.1.37-bin.jar到项目的lib目录下
2.右键-->Add As Library
2. 注册驱动(安装驱动)
3. 获取数据库连接对象 Connection
4. 定义sql
5. 获取执行sql语句的对象 Statement
6. 执行sql,接受返回结果
7. 处理结果
8. 释放资源
2、JDBC api介绍
DriverManager:
注册驱动:
使用registerDriver注册驱动
static void registerDriver(Driver driver);
registerDriver(new Driver());
使用反射注册驱动
Class.forName("com.mysql.jdbc.Driver");
获取数据库连接:
static Connection getConnection(String url,String user,String password)
url:
指定连接的路径
jdbc:mysql://localhost:3306/数据库名称
若是连接本地则可简写:jdbc:mysql:///数据库名
user:
用户名
password:
密码
Connection:
获取sql语句执行对象和事务管理对象
1、点一个Statement对象,用于将SQL语句发送到数据库
2、点一个PreparedStatement,用于将参数化的SQL语句发送到数据库
事务管理:
1、点一个setAutoCommit(false)设置成手动提交
2、点一个commit()提交事务
3、点一个rollback()回滚事务
Statement:
用于执行静态SQL语句并返回其生成的结果的对象
1、点一个execute(sql),可执行任意的sql语句
2、点一个executeUpdate(sql),执行DML(insert,update,delete)语句,DDL(create,alter,drop)语句
3、点一个executeQuery(sql),执行DQL(select)语句
ResultSet:
表示数据库结果集的数据表,通常通过执行查询数据库的语句生成
1、点一个next(),将光标向前移一位,返回值为true代表有数据,false代表没数据
2、点一个getXxx(i),若i是整数则代表获取该列的值,若是字符串,则获取该字符串命名的列的值
3、点一个getObject(列名),根据列名获取所有列的类型的值
3、CRUD操作
编写步骤:
1、注册驱动
2、建立连接
3、编写sql
4、获取sql执行对象
5、执行sql对象并返回结果
6、处理结果
7、释放资源
添加数据:
public class JDBCInsert {
public static void main(String[] args) throws Exception {
// 1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 2.建立连接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db2", "root", "root");
// 3.编写sql(在java编写sql 结尾;可以省略)
String sql = "insert into account values(4,'lucy',1000)";
// 4.获取sql执行对象
Statement statement = connection.createStatement();
// 5.执行sql并返回结果
int i = statement.executeUpdate(sql);
// 6.处理结果
System.out.println(i);
// 7.释放资源
statement.close();
connection.close();
}
}
修改数据:
public class JDBCUpdate {
public static void main(String[] args) throws Exception {
// 1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 2.建立连接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db2", "root", "root");
// 3.编写sql
String sql = "update account set name = '松岛枫' where id = 4";
// 4.获取sql执行对象
Statement statement = connection.createStatement();
// 5.执行sql并返回结果
int i = statement.executeUpdate(sql);
// 6.处理结果
if (i>0) {
System.out.println("修改成功");
}else{
System.out.println("修改失败");
}
// 7.释放资源
statement.close();
connection.close();
}
}
删除数据:
public class JDBCDelete {
public static void main(String[] args) throws Exception {
// 1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 2.建立连接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db2", "root", "root");
// 3.编写sql
String sql = "delete from account where id = 4";
// 4.获取sql执行对象
Statement statement = connection.createStatement();
// 5.执行sql并返回结果
int i = statement.executeUpdate(sql);
// 6.处理结果
if (i>0) {
System.out.println("修改成功");
}else{
System.out.println("修改失败");
}
// 7.释放资源
statement.close();
connection.close();
}
}
查询数据:
package com.smiledog.domain;
public class Account {
private int id;
private String name;
private Double money;
// 有参无参构造....
// get和set方法....
// toString()...
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
public class JDBCQuery{
public static void main(String[] args) throwes Exception{
ArrayList<Account> list = new ArrayList<>();
// 1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 2.建立连接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/day23", "root", "root");
// 3.编写sql
String sql = "select * from account";
// 4.获取sql执行对象
Statement statement = connection.createStatement();
// 5.执行sql并返回结果
ResultSet resultSet = statement.executeQuery(sql);
// 6.处理结果
Account account = null;
while (resultSet.next()) {
// 获取数据
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
double money = resultSet.getDouble("money");
account = new Account();
account.setId(id);
account.setName(name);
account.setMoney(money);
list.add(account);
}
// 7.释放资源
resultSet.close();
statement.close();
connection.close();
// 遍历集合代码省略............
}
}
4、JDBC工具类编写
工具类呢,就是把一些重复的代码提取出来,能提取多少提取多少,整合到一个类里边,合理的编排,定义方法供外界调用。
不改变的代码可以提取,一致变得代码也可以提取,把一些一直改变的数据整合到一个集合里,改动代码只需要改动集合里的代码就行了,比如(properties集合)
JDBC工具类:
package com.smiledog.jdbc.demo.Util;
/*
@ClassName Util
@Author SmILeDog
@Date 2021/5/20
@Time 14:44
*/
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
public class JDBCUtil {
private JDBCUtil() {
}
private static Connection conn; //数据库连接对象
private static Statement stat = null; //sql执行对象
private static String driver = null; //驱动对象
private static String url = null; //数据库连接信息
private static String user = null; //数据库用户名
private static String password = null; //数据库用户名密码
private static String sql = null; //待执行的增删改的sql语句
private static String querysql = null; //待执行的查询sql语句
static{
try {
//读取配置文件
Properties pro = new Properties();
//方法一:直接读取配置文件
// pro.load(new FileReader("day01_jdbc\\src\\jdbc.properties"));
// 方法一:使用类加载器,进行读取配置文件
InputStream is = JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");
//方法三:java提供的专门获取jdbc配置文件的类
//ResourceBundle jdbc = ResourceBundle.getBundle("jdbc");
pro.load(is); //读取配置文件
driver = pro.getProperty("driverName"); //读取驱动
url = pro.getProperty("url"); //读取url
user = pro.getProperty("user"); //读取同户名
password = pro.getProperty("password"); //读取密码
sql = pro.getProperty("sql"); //读取增删改的sql语句
querysql = pro.getProperty("querysql"); //读取查询的sql语句
Class.forName(driver); //注册驱动
conn = DriverManager.getConnection(url, user, password); //获取数据库连接对象
//想想,没必要再搞这个了,上边获取到conn了,直接可以在那边获取就
//stat = conn.createStatement(); //获取sql语句执行对象
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection(){
return conn;
}
//获取sql执行对象
//public static Statement getStatement(){
// return stat;
//}
//获取增删改sql执行语句
public static String getSql(){
return sql;
}
//获取查询的sql执行语句
public static String getQuerySql(){
return querysql;
}
//获取释放资源
public static void getClose(Connection conn, Statement stat, ResultSet res){
if(stat != null){
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(res != null){
try {
res.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
~~~~~~~~~~~~~~jdbc.properties~~~~~~~~~~~~~~~~~
driverName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/库名?characterEncoding=utf-8
user=root
password=1234
sql=s增删改sql语句;
querysql=查询语句;
5、事务操作
一个包含多个步骤的业务操作,如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败
使用Connection对象来管理事务
1、开启事务
点一个setAutoCommit()事务,设置为false,即开始事务
注意:在执行sql之前开启事务
2、提交事务
点一个commit(),提交事务
注意:当所有的sql语句都执行完提交事务
3、回滚事务
点一个rollback(),回滚事务
注意:在catch中回滚事务
JDBC事务演示:
public class JDBCTX{
public static void mian(String[] args){
Connection connection = null;
Statement statement = null;
try {
// 1.获取连接【JdbcUtils工具类】
connection = JdbcUitls.getConnection();
// 2.开启事务
connection.setAutoCommit(false);
tatement = connection.createStatement();
// 3.罗志祥扣钱
// 机器故障
// 4.蝴蝶姐加钱
// 5.提交事务
connection.commit();
} catch (Exception e) {
try {
// 6.回滚事务
connection.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
} finally {
// 7.释放资源
JdbcUitls.close(statement, connection);
}
}
}
6、用户登录案例
案例需求:
1、通过键盘录入用户名和密码
2、判断用户是否登录成功
数据准备:
CREATE TABLE USER(
id INT PRIMARY KEY AUTO_INCREMENT, -- 主键ID
username VARCHAR(32), -- 用户名
PASSWORD VARCHAR(32) -- 密码
);
-- 添加数据
INSERT INTO USER VALUES(NULL,'zhangsan','123');
INSERT INTO USER VALUES(NULL,'lisi','234');
代码实现:
package com.smiledog.jdbc.test;
/*
@ClassName LoginTest
@Author SmILeDog
@Date 2021/5/20
@Time 19:21
*/
import com.smiledog.jdbc.test.Util.JDBCUtil;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;
public class LoginTest {
public static void main(String[] args) throws SQLException {
boolean b = false;
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户名:");
String uname = sc.nextLine();
System.out.println("请输入密码:");
String pwd = sc.nextLine();
Connection conn = JDBCUtil.getConnection();
Statement stat = conn.createStatement();
ResultSet res = stat.executeQuery(JDBCUtil.getQuerySql());
while (res.next()) {
String username = res.getString("username");
String password = res.getString("password");
if (username.equals(uname) && password.equals(pwd)){
b = true;
}
}
if (b){
System.out.println("登录成功!");
}else{
System.out.println("用户名或密码错误!");
}
JDBCUtil.getClose(conn,stat,res);
}
}