一、基本概念
1.概念:Java DataBase Connectivity Java 数据库连接, Java语言操作数据库
2.JDBC的本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。
3.简要的快速入门
步骤:
1.导入驱动jar包
1.复制jar包到libs文件夹中去
2.右键-->Add As Library
2. 注册驱动
3.获取数据库连接Connection
4.定义sql语句
5.获取执行sql的对象Statement/PreparedStatement
6.对数据集进行操作(处理结果)ResultSet
7.释放资源
快速入门的代码实现
2. 注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
3.获取数据库连接Connection
Connection conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/ds3?useSSL=false&serverTimezone=UTC","root","simeon");
4.定义sql语句
String sql = "update account set balance = 4000";
5.获取执行sql的对象Statement/PreparedStatement
Statement statement=conn.createStatement();
6.对数据集进行操作(处理结果)ResultSet
resultSet = statement.executeQuery(sql);
7.释放资源
resuleSet.close();
statment.close;
conn.close();
二、各个类的详解
1. DriverManager:驱动管理对象
1. 注册驱动:告诉程序该使用哪一个数据库驱动jar
static void registerDriver(Driver driver) :注册并给定驱动程序 DriverManager 。
但我们写代码时常常使用Class.forName("com.mysql.cj.jdbc.Driver");
这样写的原因是因为源码中存在这样的一个方法
static {
try { java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
2. 获取数据库连接:
方法:static Connection getConnection(String url, String user, String password)
url:jdbc:mysql//ip地址(域名):3306/db3
若服务器和客户机在一台电脑上可以简写为:
jdbc:mysql///db3
如:jdbc:mysql//localhost:3306/db3 或jdbc:mysql///db3
user:用户名
password:密码
2. Connection:数据库连接对象
获取连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/ds3?useSSL=false&serverTimezone=UTC", "root", "simeon");
获取执行sql对象的方法
Statement中的createStatement()
管理事务
1.开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务
2.提交事务:commit()
3.回滚事务:rollback()
3. Statement:执行sql的对象
1. boolean execute(String sql) :可以执行任意的sql 了解
2. int executeUpdate(String sql) :执行DML(insert、update、delete)语句DDL(create,alter、drop)语句
返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功 返回值>0的则执行成功,反之,则失败。
3. ResultSet executeQuery(String sql) :执行DQL(select)语句
4. ResultSet:结果集对象,封装查询结果
boolean next(): 游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据),如果是,则返回false,如果不是则返回true
getXxx(参数):获取数据
Xxx:代表数据类型 如: int getInt() , String getString()
参数:
1. int:代表列的编号,从1开始 如: getString(1)
2. String:代表列名称。 如: getDouble("balance")
5. PreparedStatement:执行sql的对象
1. SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性问题
如:输入用户随便,输入密码:a' or 'a' = 'a
sql:select * from user where username = 'fhdsjkf' and password = 'a' or 'a' = 'a'
解决sql注入问题:使用PreparedStatement对象来解决
预编译的SQL:参数使用?作为占位符
注意:sql的参数使用?作为占位符。 如:select * from user where username = ? and password = ?;
获取执行sql语句的对象 PreparedStatement Connection.prepareStatement(String sql)
给?赋值:
方法: setXxx(参数1,参数2)
参数1:?的位置编号 从1 开始
参数2:?的值
执行sql,接受返回结果,不需要传递sql语句
处理结果
释放资源
6.定义JDBC工具类来简化步骤
/*
* 注册驱动方法getDriver
*/
public void getDriver(){
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/*
* 获取连接方法getConnection
*
*/
static{
try {
Properties properties = new Properties();
//获取src路径下的文件的方式--->ClassLoader 类加载器
ClassLoader classLoader = JDBCTool.class.getClassLoader();
URL res = classLoader.getResource("jdbc.properties");
String path = res.getPath();
properties.load(new FileReader(path));
//3. 获取数据,赋值
url = properties.getProperty("url");
user = properties.getProperty("user");
password = properties.getProperty("password");
driver = properties.getProperty("driver");
Class.forName(driver);
}catch(Exception e){
e.printStackTrace();
}
}
public Connection getConnection() throws SQLException {
return DriverManager.getConnection(url,user,password);
}
/*
* 释放资源getClose方法
*/
public void getClose(Connection conn, Statement statement, ResultSet resultSet){
if (resultSet!=null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(statement!=null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
三、程序
/*
* 1. 通过键盘录入用户名和密码
* 2. 判断用户是否登录成功
*/
package my;
import we.JDBCTool;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
/*
* 1. 通过键盘录入用户名和密码
* 2. 判断用户是否登录成功
*/
public class JDBCDemo5 {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
System.out.println("请输入用户名");
String username=sc.nextLine();
System.out.println("请输入密码");
String password=sc.nextLine();
boolean flag=new JDBCDemo5().login(username,password);
if(flag)
System.out.println("登陆成功");
else
System.out.println("用户名或密码错误");
}
public boolean login(String username,String password) {
if(username==null||password==null)
return false;
JDBCTool tool = new JDBCTool();
Connection conn = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
tool.getDriver();
conn = tool.getConnection();
String sql = "select * from stu8 where username=? and password=?";
preparedStatement = conn.prepareStatement(sql);
preparedStatement.setString(1, username);
preparedStatement.setString(2, password);
resultSet = preparedStatement.executeQuery();
if(resultSet.next()){
return true;
}else
return false;
} catch (SQLException e) {
e.printStackTrace();
}finally {
tool.getClose(conn,preparedStatement,resultSet);
}
return false;
}
}