文章目录
JDBC概念
Java DataBase Connectivity
,Java 数据库连接, Java语言操作数据库;
JDBC是Sun公司定义的一套操作所有关系型数据库的规范;各个数据库厂商去实现这套接口,提供数据库驱动jar包;程序员可以使用这套接口编程,真正执行的代码是驱动jar包中的实现类。
JDBC快速入门
- 导入驱动jar包
mysql-connector-java-5.1.37-bin.jar
- 注册和加载驱动
- 获取数据库连接对象
- 定义SQL语句
- 获取执行SQL的对象
- 执行SQL语句
- 返回结果集
- 释放资源
ResultSet-->Statement-->Connection
package com.jdbc.demo;
import com.utils.JDBCUtils;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCDemo {
public static void main(String[] args) throws SQLException {
Connection conn = null;
Statement stmt = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql:///school", "root", "123456");
String sql = "insert into student values ('08005','孙七','男','18')";
stmt = conn.createStatement();
int count = stmt.executeUpdate(sql);
if (count > 0) {
System.out.println("添加成功!");
} else {
System.out.println("添加失败!");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
详解JDBC各个对象
DriverManager 驱动管理对象
- 注册驱动
告诉程序该使用哪一个数据库驱动jar包
static void registerDriver(Driver driver)
源码中在com.mysql.jdbc .Driver类中存在静态代码块;
写代码直接使用:Class.forName("com.mysql.jdbc.Driver");
注意:mysql 5 之后的驱动 jar包可以省略注册驱动的步骤; - 获取数据库连接
static Connection getConnection(String url, String user, String password)
user:用户名,password:密码,url:指定连接的路径
协议名:子协议://服务器名或ip地址:端口号/数据库名[?参数=参数值]
注意:简写jdbc:mysql:///数据库名
必须是本地服务器,端口号是3306;
如果数据库出现乱码,可以指定参数:?characterEncoding=utf8
Connection 数据库连接对象
- 获取执行SQL的对象
①Statement createStatement()
②PreparedStatement prepareStatement(String sql)
- 管理事务
开启事务:setAutoCommit(boolean autoCommit)
提交事务:commit()
回滚事务:rollback()
Statement 执行SQL的对象
- 用于执行不带输入参数的简单的SQL语句;
- 用于执行静态SQL语句并返回它所生成结果的对象;
①boolean execute(String sql)
:可以执行任意的SQL语句;
②int executeUpdate(String sql)
:用于执行DDL和DML语句,返回对数据库影响的行数;
③ResultSet executeQuery(String sql)
:用于执行DQL语句,返回值查询的结果集;
ResultSet 结果集对象
- 封装数据库查询的结果集,对结果集进行遍历,取出每一条记录;
① 游标向下移动一行boolean next()
,判断当前指向的记录是否还有下一条记录
② 取出每一条记录getXxx(参数)
,Xxx:代表数据类型,String getString()
通过列号
取记录,参数为int类型,从1开始,getInt(1)
通过字段名
取记录,参数为String类型,getString(“id”)
PreparedStatement 执行SQL的对象
- 用于执行带或不带输入参数的预编译SQL语句;
- 用于执行预编译的SQL语句,防止SQL注入问题;
定义预编译的SQL语句,SQL的参数使用?
作为占位符
select * from user where username = ? and password = ?;
获取执行预编译的SQL语句的对象
PreparedStatement prepareStatement(String sql)
设置实际参数给?
赋值setXxx(参数1,参数2)
参数1为?的位置编号从1开始,参数2为?的值
执行参数化的SQL语句,接收返回结果,不需要再传递SQL语句
SQL注入问题
package com.jdbc.demo;
import com.utils.JDBCUtils;
import java.sql.*;
import java.util.Scanner;
public class JDBCDemo {
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 JDBCDemo().login(username, password);
// 判断用户是否登录成功
if(flag){
System.out.println("登录成功!");
}else{
System.out.println("用户名或密码错误!");
}
}
// 登录方法,使用PreparedStatement实现
public boolean login(String username ,String password){
if(username == null || password == null){
return false;
}
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
// 获取数据库连接对象
conn = JDBCUtils.getConnection();
// 定义预编译的SQL语句
String sql = "select * from user where username = ? and password = ?";
// 获取执行预编译的SQL语句的对象
pstmt = conn.prepareStatement(sql);
// 设置实际参数给`?`赋值
pstmt.setString(1, username);
pstmt.setString(2, password);
// 执行参数化的SQL语句,接收返回结果,不需要再传递SQL语句
rs = pstmt.executeQuery();
return rs.next();
} catch (SQLException e) {
e.printStackTrace();
}finally {
// 释放资源,子接口直接给父接口
JDBCUtils.close(rs, pstmt, conn);
}
return false;
}
}
JDBC工具类
导入jar包
mysql-connector-java-5.1.37-bin.jar
定义配置文件
jdbc.properties
url=jdbc:mysql:///school
user=root
password=123456
driver=com.mysql.jdbc.Driver
JDBC工具类
JDBCUtils.java
package com.utils;
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.Properties;
// JDBC工具类
public class JDBCUtils {
// 定义成员变量
private static String url;
private static String user;
private static String password;
private static String driver;
static {
try {
// 加载配置文件
Properties pro = new Properties();
ClassLoader classLoader = JDBCUtils.class.getClassLoader();
URL res = classLoader.getResource("jdbc.properties");
String path = res.getPath();
pro.load(new FileReader(path));
// 获取数据赋值
url = pro.getProperty("url");
user = pro.getProperty("user");
password = pro.getProperty("password");
driver = pro.getProperty("driver");
// 注册驱动
Class.forName(driver);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
// 获取连接
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url, user, password);
}
// 释放资源
public static void close(Statement stmt, Connection conn) {
close(null,stmt,conn);
}
public static void close(ResultSet rs, Statement stmt, Connection conn) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}