前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【JDBC】入门增删改查

【JDBC】入门增删改查

作者头像
陶然同学
发布2023-02-24 15:29:36
3410
发布2023-02-24 15:29:36
举报
文章被收录于专栏:陶然同学博客
  1. JDBC
    1. 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

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

需求:

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

显示效果:

      1. 实现思路

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

      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

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

查询结果:

    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);//获取第一行第一列的数据

常用方法:

  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:

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

}

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-10-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档