JDBC

JDBC介绍

▪ JDBC(Java Database Connectivity)是基于JAVA语言访问数据库的一种技术。

▪ JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序,同时,JDBC也是个商标名。

▪ JDBC的设计思想:由SUN公司(JCP)提供访问数据库的接口,由数据库厂商提供对这些接口的实现,程序员编程时都是针对接口进行编程的。

▪ JDBC包括一套JDBC的API和一套程序员和数据库厂商都必须去遵守的规范。
– java.sql包:提供访问数据库基本的功能
– javax.sql包:提供扩展的功能

▪ 数据库中间件

▪ JDBC可以做些什么?
– 连接到数据库
– 在Java app中执行SQL命令
– 处理结果。

面向接口编程 java.sql.*

1、java.sql.Driver : -->驱动
2、java.sql.Connection -->连接
3、java.sql.Statement -->静态处理块
java.sql.PreparedStatement -->预处理块
4、java.sql.ResultSet -->结果集
5、java.sql.ResultSetMetaData -->结果集元数据

搭建JDBC

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;/*1.倒入mysql驱动包2.注册驱动3.建立与mysql的连接通道4.向mysql发送sql语句5.接收返回结果6.关闭连接通道*/
public class JDBCTest {public static void main(String[] args) {try {//以java反射机制来创建此对象Class.forName("com.mysql.cj.jdbc.Driver");} catch (ClassNotFoundException e) {e.printStackTrace();}//characterEncoding=utf8  编码设置//连接mysql8必须要设置时区 serverTimezone=Asia/ShanghaiString url = "jdbc:mysql://127.0.0.1:3306/student?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai";try {//Connection是接口,实际返回的是mysql的实现类对象(多态)Connection connection = DriverManager.getConnection(url,"root","111111");//发送sql  由Statement发送对象Statement st = connection.createStatement();st.executeUpdate("insert into major(mname) values ('信管')");//关闭相关链接st.close();connection.close();} catch (SQLException throwables) {throwables.printStackTrace();}}
}

插入删除

Statement

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;/*不建议使用*/
public class JDBCTest2 {public static void main(String[] args){try {save();} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException throwables) {throwables.printStackTrace();}}public static void save() throws ClassNotFoundException, SQLException {int num = 107;String name = "tom";String gender = "男";String birthday = "2001-9-1";float height = 1.78f;Connection connection = null;Statement st = null;try{Class.forName("com.mysql.cj.jdbc.Driver");String url = "jdbc:mysql://127.0.0.1:3306/student?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai";connection = DriverManager.getConnection(url, "root", "111111");st = connection.createStatement();st.executeUpdate("insert into student(num,sanme,gender,birthday,height) values("+num+",'"+name+"','"+gender+"','"+birthday+"',"+height+") ");}finally {if(st!=null){st.close();}if(connection!=null){connection.close();}}}
}

PrepareStatement

插入

import java.sql.*;public class JDBCTest3 {public static void main(String[] args){try {save();} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException throwables) {throwables.printStackTrace();}}public static void save() throws ClassNotFoundException, SQLException {int num = 107;String name = "tom";String gender = "男";String birthday = "2001-9-1";float height = 1.78f;Connection connection = null;PreparedStatement ps = null;try{Class.forName("com.mysql.cj.jdbc.Driver");String url = "jdbc:mysql://127.0.0.1:3306/student?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai";connection = DriverManager.getConnection(url, "root", "111111");//使用PrepareStatement发送sql,建议使用!!!//预编译sql//?是占位符,表示此处需要传入一个值,只是将sql编译到ps中ps = connection.prepareStatement("insert into student(num,sname,gender,birthday,height)"+"values(?,?,?,?,?)");//向sql中的占位符赋值   赋值时可以对值进行检测ps.setObject(1, num);ps.setObject(2, name);ps.setObject(3, gender);ps.setObject(4, birthday);ps.setObject(5, height);//执行sqlps.executeUpdate();}finally {if(ps!=null){ps.close();}if(connection!=null){connection.close();}}}
}

删除

import java.sql.*;public class JDBCTest3 {public static void main(String[] args){try {//save();delete();} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException throwables) {throwables.printStackTrace();}}public static void delete() throws ClassNotFoundException, SQLException {String id = "7";Connection connection = null;PreparedStatement ps = null;try{Class.forName("com.mysql.cj.jdbc.Driver");String url = "jdbc:mysql://127.0.0.1:3306/student?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai";connection = DriverManager.getConnection(url, "root", "111111");//使用PrepareStatement发送sql,建议使用!!!//预编译sql//?是占位符,表示此处需要传入一个值,只是将sql编译到ps中ps = connection.prepareStatement("delete from student where id = ?");//向sql中的占位符赋值   赋值时可以对值进行检测ps.setObject(1, id);//执行sqlps.executeUpdate();}finally {if(ps!=null){ps.close();}if(connection!=null){connection.close();}}}
}

Statement和PrepareStatement的区别

Statement 传参时是直接将变量拼接到字符中,不能防止sql注入

 st.executeUpdate("insert into student(num,sanme,gender,birthday,height) values("+num+",'"+name+"','"+gender+"','"+birthday+"',"+height+") ");

PrepareStatement输入方式优雅,重点是可以防止sql注入

ps = connection.prepareStatement("insert into student(num,sname,gender,birthday,height)"+"values(?,?,?,?,?)");
//一个问号只能传入一个关键字,防止恶意攻击
//向sql中的占位符赋值   赋值时可以对值进行检测ps.setObject(1, num);ps.setObject(2, name);ps.setObject(3, gender);ps.setObject(4, birthday);ps.setObject(5, height);//执行sqlps.executeUpdate();

查询

import java.sql.*;public class JDBCTest4 {public static void main(String[] args){try {Student student = query1("李四");System.out.println(student);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException throwables) {throwables.printStackTrace();}}public static Student query1(String name) throws ClassNotFoundException, SQLException {Connection connection = null;PreparedStatement ps = null;ResultSet rs = null;try{Class.forName("com.mysql.cj.jdbc.Driver");String url = "jdbc:mysql://127.0.0.1:3306/student?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai";connection = DriverManager.getConnection(url, "root", "111111");//查询语句是由返回结果的,如何接收?//通过学号查询,只返回一条记录  向sql中传入参数并返回ps = connection.prepareStatement("select id,num,sname,gender,birthday,height,register_time from student where sname=?");ps.setObject(1, name);rs = ps.executeQuery();//执行查询语句,接收返回结果  在java中存储结果Student student = new Student();//循环ResultSet   next() 将光标移到下一行,如果有数据返回true,反之falsewhile (rs.next()){student.setId(rs.getInt("id"));student.setNum(rs.getInt("num"));student.setName(rs.getString("sname"));student.setGender(rs.getString("gender"));student.setBirthday(rs.getDate("birthday"));student.setHeight(rs.getFloat("height"));student.setRegisterTime(rs.getTimestamp("register_time"));}return student;}finally {if(rs!=null){rs.close();}if(ps!=null){ps.close();}if(connection!=null){connection.close();}}}}

【java学习之路】数据库连接JDBC相关推荐

  1. java学习之路目录(已完结)

    java学习之路目录(持续更新中-) 第一阶段 javaSE(完结) 序号 标题 内容 001 java初识 java语言特点.体系结构.运行机制 002 java SE基础语法 注释.关键字.变量. ...

  2. 我的Java学习之路2009-11-17

    -------------------------------2009年3月19日开始----------------------------- 下载JDK Myeclipse Netbeans JB ...

  3. java学习之路之javaSE基础1

    <h2>java学习之路之javaSE基础1</h2> <div> ###01.01_计算机基础知识(计算机概述)(了解) * A:什么是计算机?计算机在生活中的应 ...

  4. 个人开发经历--我的java学习之路(学校篇)

    个人开发经历--我的java学习之路(学校篇) 个人介绍: 姓名: 不在这里说明 联系信息: 个人历程 jdbc阶段 sql生成器 一代代码生成器 servlet阶段 servlet项目中,sql生成 ...

  5. java学习之路2--简单工厂模式实现饮料自动贩卖机

    java学习之路2 用简单工厂模式实现饮料自动贩卖机 功能简介 具体实现 1.简单工厂模式 2.代码 总结 用简单工厂模式实现饮料自动贩卖机) 功能简介 接收用户输入的信息,选择购买的饮料. 可供选择 ...

  6. Java学习之路——接口

    Java学习之路--接口 概述 总所周知,我们是父母的孩子.我们的身上既继承了爸爸的基因也继承了妈妈的基因.这就是多继承. 然而在 Java 程序中,是不支持多继承的.Java 仅仅支持单继承.但是接 ...

  7. JAVA学习之路:不走弯路,就是捷径(一)

      0.引言 在ChinaITLAB导师制辅导中,笔者发现问得最多的问题莫过于"如何学习编程?JAVA该如何学习?".类似的问题回答多了,难免会感觉厌烦,就萌生了写下本文的想法.到 ...

  8. Java学习之路1——安装JDK1.8||安装idea2022||Java项目创建【重拾Java】

    Java学习之路1--安装JDK1.8||安装idea2022[重拾Java] 前言 安装 安装JDK1.8 安装idea2022(JetBrains Toolbox) Java项目创建 创建 项目结 ...

  9. 菜鸟haqima的Java学习之路第一天

    菜鸟haqima的Java学习之路第一天 导读:DOS命令 常用快捷键 Java的简单概述 (第一章 Java开发环境的搭建) 1.常用的DOS命令 1.1.怎么打开DOS命令窗口 win键+r(组合 ...

  10. Java学习之路3——方法定义、调用【重拾Java】

    Java学习之路3--方法定义.调用[重拾Java] 方法定义 为什么要写方法 方法完整的定义形式.调用 方法定义的格式 修饰符 返回值类型 返回值 调用格式 方法重载 方法定义 为什么要写方法 对于 ...

最新文章

  1. springboot视图解析器
  2. 机械师怎么打开计算机管理,机械师创物者-R笔记本智能控制中心使用教程
  3. 每个前端开发者必会的二十个JavaScript面试题
  4. 成功解决TypeError: a bytes-like object is required, not 'str'
  5. Spark On K8S与Spark On YARN方案相比之劣势
  6. 算法导论笔记:06堆排序
  7. python学习笔记列表和元组(三)
  8. .Net Core in Docker极简入门(下篇)
  9. javascript 点点滴滴01章 javascript的认知
  10. C# 参考之方法参数关键字:params、ref及out
  11. 继承中的构造函数问题
  12. stm8s电机库vtimer_SetTimer()函数的使用
  13. java求第n项斐波那契_【剑指offer】数列——求斐波那契第n项
  14. 洛谷P1357 花园(状态压缩+矩阵快速幂)
  15. 知乎视频下载(爬虫)
  16. Java面向对象【集合】
  17. seo人员的每日工作内容应该都有什么?
  18. Kinect_0:项目背景
  19. 背景图片定位,水平居中和垂直居中
  20. 图片怎么做雕刻路径_迷你字雕刻路径怎么做

热门文章

  1. 全志 A64 开发板移植SQLite3
  2. @PathVariable、@RequestHeader与@CookieValue注解的使用案例
  3. Android进程框架:线程通信的桥梁Handler
  4. 【职场生活】跳槽离职要注意的那些坑?
  5. 数据库SQL语句解析
  6. 《Python数据可视化编程实战》—— 1.2 安装matplotlib、Numpy和Scipy库
  7. 《SAP入门经典(第4版•修订版)》——3.2 SAP硬件基础知识
  8. 「CSDN年度征文」微软学生大使、VSC中文社区、KDD CUP...2020年,我与技术社区
  9. C#------如何获取本机IP地址
  10. ECshop sina