1. JDBC
  1. JDBC概述

JDBC(Java DataBase Connectivity,    java数据库连接)是一种用于执行SQL语句的Java API。JDBC是Java访问数据库的标准规范,可以为不同的关系型数据库提供统一访问,它由一组用Java语言编写的接口和类组成。

XML方式:

【JDBC】入门增删改查_数据库

 

JDBC方式:

【JDBC】入门增删改查_jdbc_02

 

JDBC规范(掌握四个核心对象):

类:

DriverManager:用于注册驱动

接口:

Connection: 表示与数据库创建的连接

PreparedStatement : sql语句发射器

ResultSet: 结果集或一张虚拟表

今天我们使用的是mysql的驱动mysql-connector-java-5.1.47.jar

  1. JDBC入门案例
  1. 需求描述

需求:

使用java代码 链接到数据库  查询category表下的所有数据  将查询到的结果 显示到控制台

显示效果:

【JDBC】入门增删改查_sql_03

 

  1. 实现思路

项目中添加驱动包链接数据库. 发射语句得到结果,对结果进行遍历

【JDBC】入门增删改查_java_04

 

  1. 准备工作

#创建数据库

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

【JDBC】入门增删改查_数据库_05

 

  1. 书写方法完成查询

方法内部按照如下步骤书写:

//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();


    }

}

查询结果:

【JDBC】入门增删改查_java_06

 

  1. API详解
  1. 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

  1. 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

  1. API详解:java.sql.PreparedStatement接口: 操作sql语句,并返回相应结果

String sql = "某SQL语句";

PreparedStatement pst = conn.prepareStatement(sql);

对象pst就是SQL语句的发射器,可以发射SQL语句,并获取执行结果

常用方法:

  1. int executeUpdate(); --执行insert update delete语句.
  2. ResultSet executeQuery(); --执行select语句.
  3. boolean execute(String sql); --仅当执行select并且有结果时才返回true,执行其他的语句返回false.
  1. API详解:处理结果集(注:执行insert、update、delete无需处理)

ResultSet实际上就是一张二维的表格,我们可以调用其boolean next()方法指向某行记录,当第一次调用next()方法时,便指向第一行记录的位置,这时就可以使用ResultSet提供的getXXX(int col)方法(与索引从0开始不同个,列从1开始)来获取指定列的数据:

rs.next();//判断下一行有没有数据,如果有返回true否则返回false

rs.getInt(1);//获取第一行第一列的数据

【JDBC】入门增删改查_java_07

 

常用方法:

  1. Object getObject(int index) // Object getObject(String name) 获得任意对象
  2. String getString(int index)// String getString(String name) 获得字符串
  3. int getInt(int index)//int getInt(String name) 获得整型
  4. double getDouble(int index)// double getDouble(String name) 获得双精度浮点型

Eg:

【JDBC】入门增删改查_sql_08

 

  1. API详解:释放资源

与IO流一样,使用后的东西都需要关闭!关闭的顺序是先得到的后关闭,后得到的先关闭。

rs.close();

Pps.close();

con.close();

  1. 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) {

}

}

}

}

  1. 使用工具类完成入门案例

/*

 * 使用工具类 完成 入门案例: 查询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);

}

  1. JDBC增删改查操作
  1. API详解:预处理对象

preparedStatement:预编译对象,是Statement对象的子类。是SQL语句的发射器可以把SQL语句发送给数据库,并获取执行的结果。

特点:

性能高

会把sql语句先编译

能过滤掉用户输入的关键字。

PreparedStatement预处理对象,处理的每条sql语句中所有的活动数据,把活动数据使占位符?替换。格式类似如下格式

String sql = "select * from user where username = ? and password = ?";

有了这样的SQL语句之后 按照如下方式使用

PreparedStatement使用,需要通过以下3步骤完成:

  1. 通过链接拿到发射器对应:

#获得预处理对象,需要提供已经使用占位符处理后的SQL语句

PreparedStatement psmt = conn.prepareStatement(sql)

  1. 设置实际参数

void setXxx(int index, 数据类型xx) 将指定参数设置指定类型的值

参数1:index 要替换哪个占位符?,通过这个序号指定,从1开始。

参数2:xxx 活动数据的值,用这个值替换占位符?

例如:

setString(2, "1234") 把SQL语句中第2个位置的占位符?替换成实际参数 "1234"

  1. 执行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,'男')

  1. 查询详情

/**

 * 根据 性别 查询 学生信息

 * @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);

}

  1. 插入

/*

 *  插入一条数据:

 *   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);

}

  1. 更新

/*

 *  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);

}

  1. 删除

/*

 *  删除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);

}

  1. 查询所有

/*

 * 查询所有

 *

 * */

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);

}