目录

  • 概述
  • JDBC搭建
    • 1.导入对应的数据库驱动包(jar)
    • 2.加载mysql驱动
    • 3.连接到数据库
    • 4.发送sql到数据库
    • 5.关闭数据库连接通道
  • 增,删,改数据
    • Statement
    • PreparedStatement
  • 查询数据

概述

JDBC(Java DataBase Connectivity)java数据库连接

应用程序与数据库之间的桥梁

  • 是一种用于执行SQL语句的Java API,可以为多种关系型数据库提供统一访问,它由一组用Java语言编写的类和接口组成。
  • 有了JDBC,java开发人员只需要编写一次程序,就可以访问不同的数据库

java语言开发者只是定义了许多关于java应用程序操作数据的接口(定义功能,没有实现)

​ java程序连接到 数据库

​ 发送sql:增改删 —>发送数据到数据库 insert()

​ 查询 —>返回结果 get()

java语言开发者为什么不实现?

​ 由于数据库类型众多,自己实现不了解,就让数据库开发商自己实现

​ 所以数据库开发商提供了jar包:里边有各种接口的实现类

JDBC API:

供程序员调用的接口与类,集成在java.sql包中

DriverManager类作用:管理各种不同的jDBC驱动

Connection 接口 与特定数据库的连接

Statement 接口 执行sql

PreparedStatement接口 执行sql

ResultSet接口 接收查询结果

JDBC搭建

1.导入对应的数据库驱动包(jar)

在工程目录下new Directory 新建 lib 目录,将需要的jar包复制到该目录下

我的jar包在F:\java program\JavaPackage

mysql-connector-java-8.0.16.jar

  • File —> Project Structure —> Libraries —> “+” —> java —> 在项目下找到lib选中jar包
2.加载mysql驱动
Class.forName("com.mysql.cj.jdbc.Driver"); //使用java反射机制实现的创建对象//或  DriverManager.registerDriver(new Driver());

Class.forName是把这个类加载到JVM中,加载的时候,就会执行其中的静态初始化块,完成驱动的初始化的相关工作。

3.连接到数据库
//连接到数据库-ip,端口号3306,数据库名,字符集,时区
String url ="jdbc:mysql://127.0.0.1:3306/school_massage?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai";
String root = "root";
String password = "100005";
//创建传输sql的管道
Connection conn = DriverManager.getConnection(url,root,password);/*返回conn:com.mysql.cj.jdbc.ConnectionImpl@1e67b872(返回的是mysql中的一个实现了connection接口的类的对象)*/
4.发送sql到数据库
//创建用来封装发送sql的Statement
Statement st = conn.createStatement();
//输入要操作的语句
st.executeUpdate("insert into course(c_name)value('php')");
5.关闭数据库连接通道
st.close();
conn.close(); //关闭通道

增,删,改数据

Statement

/*** 添加学生信息到school_massage数据库** @author 樊景泽*/
public class JDBCDemo2 {public static void main(String[] args) {JDBCDemo2 jd2 = new JDBCDemo2();try {jd2.saveStudent("tom", "男", "2000-1-1");} catch (ClassNotFoundException e) {e.printStackTrace();System.out.println("类找不到");} catch (SQLException throwables) {throwables.printStackTrace();System.out.println("数据链接失败");}}public void saveStudent(String name, String sex, String birthday) throws ClassNotFoundException, SQLException {//建立Statement和传输的管道ConnectionConnection conn = null;Statement st = null;try {//加载mysql驱动Class.forName("com.mysql.cj.jdbc.Driver");//连接到数据库String url = "jdbc:mysql://127.0.0.1:3306/school_massage?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai";conn = DriverManager.getConnection(url, "root", "152475");//发送sql到数据库st = conn.createStatement();//用row记录操作的行数int row = st.executeUpdate("INSERT INTO t_student(NAME,sex,birthday,registrationtime)" +" VALUES('" + name + "','" + sex + "','" + birthday + "',now())");System.out.println(row);} finally {//关闭管道if (st != null) {st.close();}if (conn != null) {conn.close();}}}
}

PreparedStatement

public void saveStudent(String name,String sex,String birthday) throws ClassNotFoundException, SQLException {Connection connection  = null;PreparedStatement ps = null;try {Class.forName("com.mysql.cj.jdbc.Driver");String url = "jdbc:mysql://127.0.0.1:3306/school_massage?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai";conn = DriverManager.getConnection(url,"root","root");// 预先将sql语句封装到PreparedStatement对象中 ?表示一个占位符,需要传入一个值ps =  connection.prepareStatement("insert into student(name,sex,birthday,reg_time)values(?,?,?,?)");//向预编译好的sql中传入数据ps.setString(1,name);ps.setString(2,sex);ps.setObject(3, birthday);ps.setObject(4, new Date());//或ps.setDate(4,new java.sql.Date(new java.util.Date().getTime()));ps.executeUpdate();//执行sql}finally {if(ps!=null){ps.close();}if(connection!=null){connection.close();}}
  1. 简化写法 , 不用拼接字符串

  2. 极大的提高了安全性 , 防止sql注入攻击

    ​ 例如 : DELETE FROM grade WHERE g_num = 1 OR 1=1; 用拼接字符串就会把OR 1=1直接传进sql语句中 ,表就会被全部删除

    ​ 而如果你使用预编译语句.你传入的任何内容就不会和原来的语句发生任何匹配的关系.

    ​ 预编译模式中每个占位符处,只能插入一个值,而会过滤其他语句.

查询数据

  1. PreparedStatement和Statement中的executeQuery()方法中会返回一个ResultSet对象,查询结果就封装在此对象中.
  2. 使用ResultSet中的next()方法获得下一行数据
  3. 使用getXXX(String name)方法获得值
//学生对象
public class Student {private int id;private String name;private String sex;private float weight;private Date regTime;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public float getWeight() {return weight;}public void setWeight(float weight) {this.weight = weight;}public Date getRegTime() {return regTime;}public void setRegTime(Date regTime) {this.regTime = regTime;}@Overridepublic String toString() {return "Student{" +"id=" + id +", name='" + name + '\'' +", sex='" + sex + '\'' +", weight=" + weight +", regTime=" + regTime +'}';}
}
/*** @author Deevan* 查询学号为1的学生信息*/
public class Demo2 {public static void main(String[] args) {// 数据库持久化的存储数据, 当在程序中使用时,需要把数据查询出来,封装在对象中Demo2 demo2 = new Demo2();try {Student student = demo2.findStdent(1);System.out.println(student);} catch (ClassNotFoundException | SQLException e) {e.printStackTrace();}}private Student findStdent(int num) throws ClassNotFoundException, SQLException {Connection conn = null;PreparedStatement ps = null;Student student = new Student();try {Class.forName("com.mysql.cj.jdbc.Driver");String url = "jdbc:mysql://127.0.0.1:3306/school_db?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai";conn = DriverManager.getConnection(url, "root", "152475");ps = conn.prepareStatement("SELECT\n" +"  id,\n" +"  NAME,\n" +"  sex,\n" +"  weight,\n" +"  reg_time\n" +"FROM\n" +"  student\n" +"WHERE id = ?");ps.setInt(1, num);ResultSet res = ps.executeQuery(); //执行查询操作//从ResultSet中取出我们需要的数据   next()-有内容返回true,否则返回falsewhile (res.next()) {student.setId(res.getInt("id"));student.setName(res.getString("name"));student.setSex(res.getString("sex"));student.setWeight(res.getFloat("weight"));student.setRegTime(res.getDate("reg_time"));}} finally {if (ps != null) {ps.close();}if (conn != null) {conn.close();}}return student;}
}------------------------------------------
Student{id=1, name='王艺', sex='女', weight=40.0, regTime=2021-08-13}

查询出多个结果

把对象封装到集合中

public class Demo3 {public static void main(String[] args) {Demo3 demo3 = new Demo3();try {ArrayList<Student> list = demo3.findStudentList("男");System.out.println(list);} catch (ClassNotFoundException | SQLException e) {e.printStackTrace();}}private ArrayList<Student> findStudentList(String sex) throws ClassNotFoundException, SQLException {Connection conn = null;PreparedStatement ps = null;ArrayList<Student> list = new ArrayList<>();try {Class.forName("com.mysql.cj.jdbc.Driver");String url = "jdbc:mysql://127.0.0.1:3306/school_db?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai";conn = DriverManager.getConnection(url, "root", "152475");ps = conn.prepareStatement("SELECT\n" +"  id,\n" +"  NAME,\n" +"  sex,\n" +"  weight,\n" +"  reg_time\n" +"FROM\n" +"  student\n" +"WHERE sex = ?");ps.setString(1, sex);ResultSet res = ps.executeQuery();while (res.next()) {Student student = new Student();student.setId(res.getInt("id"));student.setName(res.getString("name"));student.setSex(res.getString("sex"));student.setWeight(res.getFloat("weight"));student.setRegTime(res.getDate("reg_time"));list.add(student);}} finally {if (ps != null) {ps.close();}if (conn != null) {conn.close();}}return list;}
}

JavaSE第十二章.JDBC相关推荐

  1. Shiro第十二章-与Spring集成、配置文件初解

    简介 Shiro的组件都是Javabean/pojo式的组件,所以非常容易使用Spring进行组件管理,可以非常方便得从ini配置转为Spring配置(如xml配置文件). JavaSE 依赖 < ...

  2. 第十二章 使用嵌入式SQL(三)

    文章目录 第十二章 使用嵌入式SQL(三) 主机变量 主机变量示例 用列号下标的主机变量 `NULL`和未定义的主机变量 主机变量的有效性 主机变量和程序块 第十二章 使用嵌入式SQL(三) 主机变量 ...

  3. 第十二章 图书管理系统开发

    <Java程序设计实例与操作>(丁永卫)目录 第十二章 图书管理系统开发 12.1 系统详细设计 一.开发环境 二.数据库设计 三.系统模块设计 12.2 公共模块设计 一.DbOp.ja ...

  4. 第四十二章 使用多个 IRIS 实例(二)

    文章目录 第四十二章 使用多个 IRIS 实例(二) 控制 `IRIS` 实例 `Unix®`.`Linux` 和 `macOS` 上的 iris 命令 第四十二章 使用多个 IRIS 实例(二) 控 ...

  5. stm32l0的停止模式怎么唤醒_探索者 STM32F407 开发板资料连载第二十二章 待机唤醒实验

    1)实验平台:alientek 阿波罗 STM32F767 开发板 2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第二十二章 待机唤醒实 ...

  6. 构建之法第十,十一,十二章阅读

    第十章经典用户和场景 虽说经典场景和经典用户很有必要去研究去效仿,但是随着时间发展,新的用户新的需求不断涌现,那该怎么平衡? 第十一章软件设计与实现 软件设计过程中,如何管理设计变更呢? 第十二章用户 ...

  7. 疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条

    http://blog.csdn.net/terryzero/article/details/3797782 疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条 标签: swing编程 ...

  8. stm32 文件系统dma大小_「正点原子NANO STM32F103开发板资料连载」第二十二章 DMA 实验...

    1)实验平台:[正点原子] NANO STM32F103 开发板 2)摘自<正点原子STM32 F1 开发指南(NANO 板-HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 ...

  9. 系统架构师学习笔记_第十二章_连载

    第十二章  系统安全架构设计 12.1  信息系统安全架构的简单描述 信息安全的特征 是为了保证信息的 机密性.完整性.可用性.可控性.不可抵赖性. 以风险策略为基础. 12.1.1  信息安全的现状 ...

最新文章

  1. SWideRNet:全景分割新标杆!
  2. 限速会自动恢复吗_骨折会自己好吗?骨折后怎样做恢复快?
  3. whether logo retrieval will block the application
  4. 洛谷P1073 Tarjan + 拓扑排序 // 构造分层图
  5. linux终端背景透明度设置,Ubuntu Terminal标签背景颜色设置
  6. 前端学习(1767):前端调试值之内存监控的原理和方法二
  7. Div+CSS布局居中
  8. 深入理解 MapReduce
  9. 三菱gxworks3安装失败_GX Works3|GX Works3(三菱PLC编程软件)下载官方中文版 附序列号 - 欧普软件下载...
  10. 互联网日报 | 蚂蚁集团成立整改工作组;万达完成开业45座万达广场年度目标;T3出行日订单突破100万...
  11. 数独1--暴力回溯法(时间超)
  12. android usb触摸驱动,Linux/Android——usb触摸屏驱动 - usbtouchscreen
  13. 加密解密之 crypto-js 知识
  14. 云服务器如何链接本地打印机_如何在服务器上安装网络打印机
  15. linux设置合上电脑,CentOS7设置笔记本合盖不休眠
  16. Windows 中的 UAC 用户账户控制
  17. git-修改commit信息
  18. python提取XML信息保存为txt
  19. security+考试的一些整理
  20. 【参赛作品71】CentOS 7.9 安装 openGauss 2.1.0 之剥茧抽丝

热门文章

  1. 微信公众号h5实现高德/百度/腾讯地图导航
  2. C语言中的4种强制类型转换!
  3. iphone--关于iphone多国语言设置
  4. 前端js获取div的选择器方法
  5. 脉搏检测器脉冲检测算法
  6. 前端画圆弧html弧线的像素,[js高手之路] html5 canvas系列教程 - arc绘制曲线图形(曲线,弧线,圆形)...
  7. 《精通引动APP测试实战:技术、工具和案例》---Android 开发环境搭建
  8. (Java)String截取指定字符前面(后面)所有字符和String的常用方法
  9. xmind可以画流程图吗_用什么软件可以自由画个流程图,树状图,xmind可以吗?...
  10. 小学生计算机水平测试题,小学生计算机基础知识测试题