当前位置: 首页 > news >正文

【JDBC】入门增删改查

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

}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 螺旋探索与自适应混合变异的麻雀搜索-附代码
  • 精品基于PHP实现的好物优购商城|电商小程序
  • 求解大规模优化问题的改进正弦余弦算法
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • [系统安全] 逆向工程进阶篇之对抗逆向分析
  • 二十三、Hive本地模式安装
  • Spring Cloud Alibaba — 0、服务架构演变
  • 实战 - AES对称加密算法加密和解密设备联动码
  • IDEA统计项目代码量
  • 图像处理:推导五种滤波算法(均值、中值、高斯、双边、引导)
  • 【光学】基于matlab GUI双缝干涉和牛顿环【含Matlab源码 2165期】
  • 合宙AIR32F103CBT6刷回CMSIS-DAP固件以及刷ST-LINK V2-1固件方法
  • 【操作系统】volatile、wait和notify以及“单例模式”基础知识
  • java自定义注解防重提交
  • 4-Arm PEG-Aldehyde,4ARM-PEG-CHO,四臂-聚乙二醇-醛基修饰蛋白质用试剂
  • JavaScript-如何实现克隆(clone)函数
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • 2017年终总结、随想
  • Angular 2 DI - IoC DI - 1
  • co.js - 让异步代码同步化
  • css属性的继承、初识值、计算值、当前值、应用值
  • FastReport在线报表设计器工作原理
  • JAVA_NIO系列——Channel和Buffer详解
  • JavaScript学习总结——原型
  • mysql innodb 索引使用指南
  • MySQL-事务管理(基础)
  • October CMS - 快速入门 9 Images And Galleries
  • PaddlePaddle-GitHub的正确打开姿势
  • Shell编程
  • V4L2视频输入框架概述
  • 阿里云应用高可用服务公测发布
  • 从重复到重用
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • ------- 计算机网络基础
  • 马上搞懂 GeoJSON
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 配置 PM2 实现代码自动发布
  • 前端_面试
  • 收藏好这篇,别再只说“数据劫持”了
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • 回归生活:清理微信公众号
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (MTK)java文件添加简单接口并配置相应的SELinux avc 权限笔记2
  • (二开)Flink 修改源码拓展 SQL 语法
  • (附源码)c#+winform实现远程开机(广域网可用)
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (转)JAVA中的堆栈
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (转载)虚函数剖析
  • ***测试-HTTP方法
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .htaccess配置重写url引擎