- JDBC
- JDBC概述
JDBC(Java DataBase Connectivity, java数据库连接)是一种用于执行SQL语句的Java API。JDBC是Java访问数据库的标准规范,可以为不同的关系型数据库提供统一访问,它由一组用Java语言编写的接口和类组成。
XML方式:
JDBC方式:
JDBC规范(掌握四个核心对象):
类:
DriverManager:用于注册驱动
接口:
Connection: 表示与数据库创建的连接
PreparedStatement : sql语句发射器
ResultSet: 结果集或一张虚拟表
今天我们使用的是mysql的驱动mysql-connector-java-5.1.47.jar
- JDBC入门案例
- 需求描述
需求:
使用java代码 链接到数据库 查询category表下的所有数据 将查询到的结果 显示到控制台
显示效果:
- 实现思路
项目中添加驱动包链接数据库. 发射语句得到结果,对结果进行遍历
- 准备工作
#创建数据库
create database day05pre;
#使用数据库
use day05pre;
###创建分类表
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('化妆品');
创建项目导入Jar包
创建lib目录,用于存放当前项目需要的所有jar包
选择jar包,右键执行build path / Add to Build Path
- 书写方法完成查询
方法内部按照如下步骤书写:
//1.注册驱动 获取连结
//2.发射语句 拿到结果进行处理
//3.关闭资源
以查询为例的代码实现
package com.czxy.demo01; import java.sql.*; public class Test01 { public static void main(String[] args) throws ClassNotFoundException, SQLException { //1.注册驱动 获取连结 Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day05pre", "root", "root"); //2.发射语句 拿到结果进行处理 PreparedStatement pps = conn.prepareStatement("select * from category"); ResultSet resultSet = pps.executeQuery(); //查看结果 while (resultSet.next()){ int cid = resultSet.getInt("cid"); String cname = resultSet.getString("cname"); System.out.println(cid+" : "+cname); } //3.关闭资源 resultSet.close(); pps.close(); conn.close(); } } |
查询结果:
- API详解
- API详解:注册驱动
语法: Class.forName("com.mysql.jdbc.Driver");
固定写法: com.mysql.jdbc.Driver 是MySQL数据库的驱动类
通过反射获取com.mysql.jdbc.Driver对象时底层会直接注册驱动
其他写法:
DriverManager.registerDriver(new com.mysql.jdbc.Driver());不建议使用
原因是:
>导致驱动被注册2次。
>强烈依赖数据库的驱动jar
- API详解:获得链接
接口的实现在数据库驱动中。所有与数据库交互都是基于连接对象的。
Connection conn = DriverManager.getConnection(url, user, password);
语法:static Connection getConnection(String url, String user, String password)
试图建立到给定数据库 URL 的连接。
参数说明:url 需要连接数据库的位置(网址) user用户名 password 密码
例如:getConnection("jdbc:mysql://localhost:3306/day06", "root", "root");
URL:SUN公司与数据库厂商之间的一种协议。
jdbc:mysql://localhost:3306/day06
协议:子协议:// IP :端口号/具体的数据库
mysql: jdbc:mysql://localhost:3306/day04或者jdbc:mysql:///day14(默认本机连接)
oracle数据库: jdbc:oracle:thin:@localhost:1521:sid
- API详解:java.sql.PreparedStatement接口: 操作sql语句,并返回相应结果
String sql = "某SQL语句";
PreparedStatement pst = conn.prepareStatement(sql);
对象pst就是SQL语句的发射器,可以发射SQL语句,并获取执行结果
常用方法:
- int executeUpdate(); --执行insert update delete语句.
- ResultSet executeQuery(); --执行select语句.
- boolean execute(String sql); --仅当执行select并且有结果时才返回true,执行其他的语句返回false.
- API详解:处理结果集(注:执行insert、update、delete无需处理)
ResultSet实际上就是一张二维的表格,我们可以调用其boolean next()方法指向某行记录,当第一次调用next()方法时,便指向第一行记录的位置,这时就可以使用ResultSet提供的getXXX(int col)方法(与索引从0开始不同个,列从1开始)来获取指定列的数据:
rs.next();//判断下一行有没有数据,如果有返回true否则返回false
rs.getInt(1);//获取第一行第一列的数据
常用方法:
- Object getObject(int index) // Object getObject(String name) 获得任意对象
- String getString(int index)// String getString(String name) 获得字符串
- int getInt(int index)//int getInt(String name) 获得整型
- double getDouble(int index)// double getDouble(String name) 获得双精度浮点型
Eg:
- API详解:释放资源
与IO流一样,使用后的东西都需要关闭!关闭的顺序是先得到的后关闭,后得到的先关闭。
rs.close();
Pps.close();
con.close();
- JDBC工具类
“获得数据库连接”操作,将在以后的增删改查所有功能中都存在,可以封装工具类JDBCUtils。提供获取连接对象的方法,从而达到代码的重复利用。
该工具类提供两个方法:
获取连接
public static Connection getConn ()
关闭资源
public static void closeResource(ResultSet rs, PreparedStatement pst, Connection conn)
代码如下:
import java.sql.*;
public class JdbcUtils {
private static String driver = "com.mysql.jdbc.Driver";
private static String url = "jdbc:mysql://localhost:3306/day05pre";
private static String user = "root";
private static String password = "root";
static{
try {
//注册驱动
Class.forName(driver);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 获得连接
* @return
* @throws SQLException
*/
public static Connection getConnection() throws SQLException{
//获得连接
Connection conn = DriverManager.getConnection(url, user, password);
return conn;
}
/**
* 释放资源
* @param conn
* @param st
* @param rs
*/
public static void closeResource(Connection conn , PreparedStatement pst , ResultSet rs){
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
}
}
if(pst != null){
try {
pst.close();
} catch (SQLException e) {
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
}
}
}
}
- 使用工具类完成入门案例
/*
* 使用工具类 完成 入门案例: 查询categroy所有数据
* */
public void show() throws Exception{
//1.获取连接
Connection conn = JDBCUtils.getConn();
//2.书写SQL语句
String sql = "select *from category";
//3.获取SQL语句发射器
PreparedStatement pst = conn.prepareStatement(sql);
//4.发射SQL语句得到结果集
ResultSet rs = pst.executeQuery();
//5.处理结果集
while(rs.next()){
int cid = rs.getInt("cid");
String cname = rs.getString("cname");
System.out.println(cid+" : "+cname);
}
//6.关闭资源
JDBCUtils.closeResource(rs, pst, conn);
}
- JDBC增删改查操作
- API详解:预处理对象
preparedStatement:预编译对象,是Statement对象的子类。是SQL语句的发射器可以把SQL语句发送给数据库,并获取执行的结果。
特点:
性能高
会把sql语句先编译
能过滤掉用户输入的关键字。
PreparedStatement预处理对象,处理的每条sql语句中所有的活动数据,把活动数据使占位符?替换。格式类似如下格式
String sql = "select * from user where username = ? and password = ?";
有了这样的SQL语句之后 按照如下方式使用
PreparedStatement使用,需要通过以下3步骤完成:
- 通过链接拿到发射器对应:
#获得预处理对象,需要提供已经使用占位符处理后的SQL语句
PreparedStatement psmt = conn.prepareStatement(sql)
- 设置实际参数
void setXxx(int index, 数据类型xx) 将指定参数设置指定类型的值
参数1:index 要替换哪个占位符?,通过这个序号指定,从1开始。
参数2:xxx 活动数据的值,用这个值替换占位符?
例如:
setString(2, "1234") 把SQL语句中第2个位置的占位符?替换成实际参数 "1234"
- 执行SQL语句:
int executeUpdate(); --执行insert update delete语句.
ResultSet executeQuery(); --执行select语句.
boolean execute(); --执行select返回true 执行其他的语句返回false.
数据准备:
创建一个student表,里面插入数据方便接下来的增删改查操作
#创建表
CREATE TABLE student(
sid INT,
NAME VARCHAR(100),
age INT,
sex VARCHAR(100)
)
#插入数据
INSERT INTO student VALUES(1,'张三',18,'女'),(2,'李四',19,'男'),(3,'王五',20,'女'),(4,'赵六',21,'男')
- 查询详情
/**
* 根据 性别 查询 学生信息
* @throws Exception
*/
@Test
public void findStudent() throws Exception{
// 1.获取链接
Connection conn = JDBCUtils.getConn();
// 2. 书写SQL语句 获取发射器
String sql = "select * from student where sex = ?";
PreparedStatement pst = conn.prepareStatement(sql);
//设置第1个 ?为男
pst.setString(1, "男");
// 3. 执行 并处理结果集
ResultSet rs = pst.executeQuery();
while(rs.next()){
//分别获取各个字段的值
int sid = rs.getInt("sid");
int age = rs.getInt("age");
String name = rs.getString("name");
String sex = rs.getString("sex");
//显示结果
System.out.println("sid="+sid+" name="+name+" age="+age+" sex="+sex);
}
// 4. 关闭资源
JDBCUtils.closeResource(rs, pst, conn);
}
- 插入
/*
* 插入一条数据:
* insert into student(sid,name,age,sex) values(5,'王大拿',18,'男')
* */
public void insertData() throws Exception{
//1.获取连接
Connection conn = JDBCUtils.getConn();
//2.书写语句并 获取发射器
String sql = "insert into student(sid,name,age,sex) values(5,'王大拿',18,'男')";
PreparedStatement pst = conn.prepareStatement(sql);
//3.发射
int num = pst.executeUpdate();
//看一下结果
System.out.println("影响的行: "+num);
//4.关闭资源
JDBCUtils.closeResource(null, pst, conn);
}
- 更新
/*
* update
* 把student表中的 张三性别改成男
* */
@Test
public void updateData() throws Exception{
//获取连接
Connection conn = JDBCUtils.getConn();
//书写SQL语句
String sql = "update student set sex= ? where name=? ";
//获取发射器
PreparedStatement pst = conn.prepareStatement(sql);
// 把第1个?设置成男
pst.setString(1, "男");
// 把第2个 ? 设置成 张三
pst.setString(2, "张三");
//执行 查看结果
int num = pst.executeUpdate();
System.out.println("影响的行 : "+num);
//关闭资源
JDBCUtils.closeResource(null, pst, conn);
}
- 删除
/*
* 删除sid是 2的用户
* */
public void deleteData() throws Exception{
//获取连接
Connection conn = JDBCUtils.getConn();
//书写sql语句
String sql = "delete from student where sid = ?";
//获取发射器
PreparedStatement pst = conn.prepareStatement(sql);
//设置数据 把 第1个?设置成2
pst.setInt(1, 2);
//发射
int num = pst.executeUpdate();
//查看影响的行
System.out.println("影响的行 : "+num);
//关闭资源
JDBCUtils.closeResource(null, pst, conn);
}
- 查询所有
/*
* 查询所有
*
* */
public void findAll() throws SQLException{
// 1.获取链接
Connection conn = JDBCUtils.getConn();
// 2.书写SQL语句 获取发射器
String sql = "select * from student";
PreparedStatement pst = conn.prepareStatement(sql);
// 3.执行并处理结果集
ResultSet rs= pst.executeQuery();
while(rs.next()){
//分别获取各个字段的值
int sid = rs.getInt("sid");
int age = rs.getInt("age");
String name = rs.getString("name");
String sex = rs.getString("sex");
//显示结果
System.out.println("sid="+sid+" name="+name+" age="+age+" sex="+sex);
}
// 4.关闭资源
JDBCUtils.closeResource(rs, pst, conn);
}