JavaSE第十二章.JDBC
目录
- 概述
- 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();}}
简化写法 , 不用拼接字符串
极大的提高了安全性 , 防止sql注入攻击
例如 : DELETE FROM grade WHERE g_num = 1 OR 1=1; 用拼接字符串就会把OR 1=1直接传进sql语句中 ,表就会被全部删除
而如果你使用预编译语句.你传入的任何内容就不会和原来的语句发生任何匹配的关系.
预编译模式中每个占位符处,只能插入一个值,而会过滤其他语句.
查询数据
- PreparedStatement和Statement中的executeQuery()方法中会返回一个ResultSet对象,查询结果就封装在此对象中.
- 使用ResultSet中的next()方法获得下一行数据
- 使用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相关推荐
- Shiro第十二章-与Spring集成、配置文件初解
简介 Shiro的组件都是Javabean/pojo式的组件,所以非常容易使用Spring进行组件管理,可以非常方便得从ini配置转为Spring配置(如xml配置文件). JavaSE 依赖 < ...
- 第十二章 使用嵌入式SQL(三)
文章目录 第十二章 使用嵌入式SQL(三) 主机变量 主机变量示例 用列号下标的主机变量 `NULL`和未定义的主机变量 主机变量的有效性 主机变量和程序块 第十二章 使用嵌入式SQL(三) 主机变量 ...
- 第十二章 图书管理系统开发
<Java程序设计实例与操作>(丁永卫)目录 第十二章 图书管理系统开发 12.1 系统详细设计 一.开发环境 二.数据库设计 三.系统模块设计 12.2 公共模块设计 一.DbOp.ja ...
- 第四十二章 使用多个 IRIS 实例(二)
文章目录 第四十二章 使用多个 IRIS 实例(二) 控制 `IRIS` 实例 `Unix®`.`Linux` 和 `macOS` 上的 iris 命令 第四十二章 使用多个 IRIS 实例(二) 控 ...
- stm32l0的停止模式怎么唤醒_探索者 STM32F407 开发板资料连载第二十二章 待机唤醒实验
1)实验平台:alientek 阿波罗 STM32F767 开发板 2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第二十二章 待机唤醒实 ...
- 构建之法第十,十一,十二章阅读
第十章经典用户和场景 虽说经典场景和经典用户很有必要去研究去效仿,但是随着时间发展,新的用户新的需求不断涌现,那该怎么平衡? 第十一章软件设计与实现 软件设计过程中,如何管理设计变更呢? 第十二章用户 ...
- 疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条
http://blog.csdn.net/terryzero/article/details/3797782 疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条 标签: swing编程 ...
- stm32 文件系统dma大小_「正点原子NANO STM32F103开发板资料连载」第二十二章 DMA 实验...
1)实验平台:[正点原子] NANO STM32F103 开发板 2)摘自<正点原子STM32 F1 开发指南(NANO 板-HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 ...
- 系统架构师学习笔记_第十二章_连载
第十二章 系统安全架构设计 12.1 信息系统安全架构的简单描述 信息安全的特征 是为了保证信息的 机密性.完整性.可用性.可控性.不可抵赖性. 以风险策略为基础. 12.1.1 信息安全的现状 ...
最新文章
- SWideRNet:全景分割新标杆!
- 限速会自动恢复吗_骨折会自己好吗?骨折后怎样做恢复快?
- whether logo retrieval will block the application
- 洛谷P1073 Tarjan + 拓扑排序 // 构造分层图
- linux终端背景透明度设置,Ubuntu Terminal标签背景颜色设置
- 前端学习(1767):前端调试值之内存监控的原理和方法二
- Div+CSS布局居中
- 深入理解 MapReduce
- 三菱gxworks3安装失败_GX Works3|GX Works3(三菱PLC编程软件)下载官方中文版 附序列号 - 欧普软件下载...
- 互联网日报 | 蚂蚁集团成立整改工作组;万达完成开业45座万达广场年度目标;T3出行日订单突破100万...
- 数独1--暴力回溯法(时间超)
- android usb触摸驱动,Linux/Android——usb触摸屏驱动 - usbtouchscreen
- 加密解密之 crypto-js 知识
- 云服务器如何链接本地打印机_如何在服务器上安装网络打印机
- linux设置合上电脑,CentOS7设置笔记本合盖不休眠
- Windows 中的 UAC 用户账户控制
- git-修改commit信息
- python提取XML信息保存为txt
- security+考试的一些整理
- 【参赛作品71】CentOS 7.9 安装 openGauss 2.1.0 之剥茧抽丝
热门文章
- 微信公众号h5实现高德/百度/腾讯地图导航
- C语言中的4种强制类型转换!
- iphone--关于iphone多国语言设置
- 前端js获取div的选择器方法
- 脉搏检测器脉冲检测算法
- 前端画圆弧html弧线的像素,[js高手之路] html5 canvas系列教程 - arc绘制曲线图形(曲线,弧线,圆形)...
- 《精通引动APP测试实战:技术、工具和案例》---Android 开发环境搭建
- (Java)String截取指定字符前面(后面)所有字符和String的常用方法
- xmind可以画流程图吗_用什么软件可以自由画个流程图,树状图,xmind可以吗?...
- 小学生计算机水平测试题,小学生计算机基础知识测试题