JDBC简介

1、JDBC定义Java数据库连接(Java Database Connectivity,简称JDBC):是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsystems的商标。我们通常说的JDBC是面向关系型数据库的。JDBC原理:由sun提供的一套访问数据库的规范(一组接口)。各个数据库厂商就会遵守这一套规范,提供一套访问自己公司数据库的程序,这套程序就叫数据库驱动。2、主要用途与数据库建立连接发送 SQL 语句处理结果3、JDBC常用接口和类DriverManager类:驱动管理类,主要作用,注册JDBC驱动从而获取连接Connection接口:连接对象,主要作用,建立与数据库的连接Statement接口:SQL编译器,主要作用,向数据库发送SQL语句,返回执行结果ResultSet接口:结果集对象,主要作用,执行查询操作时,接受结果4、mysql驱动下载地址:https://dev.mysql.com/downloads/connector/j/

JDBC的开发步骤

1、导入驱动jar包,用于连接数据库
2、书写jdbc代码:(1)、注册驱动 (2)、获取访问数据库的连接 (3)、获取执行sql的语句平台(Statement PreparedStatement)即创建SQL编译器 (4)、编写SQL语句(5)、执行sql语句 executeQuery()-->只执行查询操作-->返回结果是结果集ResultSetexecuteUpdate()-->只执行增删改操作-->返回结果是受影响的行数int(6)、处理sql语句执行的结果(7)、释放资源

完整代码

package com.offcn.demo;
import java sql.Connection;
import java. sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCDetail {public static void main(String[] args) {Connnection conn = null;Statement stmt = null;ResultSet rs = null;try {//加载驱动Class.forName("com.mysql.cj.jdbc.Driver");//创建连接String url = "jdbc:mysql://localhost:3306/db01?serverTimezone=GMT%2B8&characterEncoding=UTF-8";String username = "root";String passward = "000";conn = DriverManager.getConnection(url,username,passward);//创建SQL编译器stmt = conn.createStatement();//编写SQL语句String sql = "select sname,sage from student";//执行SQL语句并返回结果rs = stmt.executeQuery(sql);//解析结果集while(rs.next()){//读取当前数据//方式一:通过查询到的数据的列名及其数据类型来获取System.out.println(rs.getString("sname")+rs.getInt("sage"));//方式二;通过查询到的数据的列的顺序及其数据类型来获取System.out.println(rs.getString(1)+rs.getInt(2));}}catch(Evception e) {e.printStaclTrace();}finally {try {//释放资源,先开后关if(rs!=null) {rs.close();}if(stmt!=null) {stmt.close();}if(conn!=null) {conn.close();}} catch(SQLException e) {e.printStackTrace();}}}
}

单元测试

导入单元测试的jar包
右键项目-->Build Path-->Configure Build Path-->Libraries-->Add Libraries-->JUnit-->Next-->Apply and Close

SQL注入问题

如出现如下情形:
public void select(String sname) {...String sql = "select * from student where saname = '" + sname + "'";
}
当传入的参数:String sname = "999' or '1'='1";
实际拼接成的SQL语句是:select * from student where sname='999' or '1'='1'
where后的筛选条件恒成立,结果会查询出所有数据,数据安全有隐患
这种SQL注入攻击值对Statement有效,所以改换用PreparedStatement

JDBC封装工具类

在src目录中创建jdbc.properties文件:
后缀properties是一种属性文件。这种文件以key=value格式存储内容。Java中可以使用Properties类来读取这个文件  String value=p.getProperty(key);文件内容如下:
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/school?serverTimezone=GMT%2B8&characterEncoding=UTF-8
user=root
pwd=000
创建JDBCUtil.java文件:
package com.offcn.demo;
import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
public class JDBCUtil {static String driver = "";static String url = "";static String user = "";static String pwd = "";static {try {InputStream in = new FileInputStream("src/jdbc.properties");Properties prop = new Properties();//将流中的数据加载成键值对的类型prop.load(in);//根据key获取valuedriver = prop.getProperty("driver");url = prop.getProperty("url");user = prop.getProperty("user");pwd = prop.getProperty("pwd");} catch (Exception e) {e.printStackTrace();}}//封装获取连接的方法public static Connection getConn() {Connection conn = null;try {Class.forName(driver);conn = DriverManager.getConnection(url, user, pwd);} catch (Exception e) {e.printStackTrace();}return conn;}//封装释放资源的方法public static void closeResources(ResultSet rs,PreparedStatement pstmt,Connection conn) {try {if(rs!=null) {rs.close();}if(pstmt!=null) {pstmt.close();}if(conn!=null) {conn.close();}} catch (SQLException e) {e.printStackTrace();}}
}

PreparedStatement实现CRUD操作

先在SQLyog中创建school数据库,库中建表student
CREATE DATABASE school;
USE school;
CREATE TABLE student(
sid INT(6) PRIMARY KEY  AUTO_INCREMENT,
sname VARCHAR(20) NOT NULL,
sage INT(3),
ssex CHAR(1)  DEFAULT  '男',
semail VARCHAR(20) UNIQUE
);
package com.ujiuye;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;import org.junit.jupiter.api.Test;public class CRUD {//给数据中的表格插入数据的测试方法@Testpublic void makeTable() {insert("大力娃",23,"男","dlw@qq.com");insert("千里眼",22,"男","qly@qq.com");insert("顺风耳",21,"男","sfe@qq.com");insert("喷火娃",20,"男","phw@qq.com");insert("吐水娃",19,"男","tsw@qq.com");insert("隐身娃",18,"男","ysw@qq.com");insert("宝葫芦娃",17,"男","bhlw@qq.com");insert("蛇精",30,"女","sj@qq.com");insert("蝎子精",25,"女","xzj@qq.com");insert("琵琶精",18,"女","ppj@qq.com");}//删除表格中指定学号的学生的信息的测试方法@Testpublic void remove() {int sid = 2;delete(sid);}//对某同学的信息进行修改的测试方法@Testpublic void change() {update(10,"琵琶精",28,"女","11111@qq.com");}//给表格插入数据的方法public void insert(String sname,int sage,String ssex,String semail) {Connection conn = JDBCUtil.getConn();PreparedStatement pstmt = null;String sql = "insert into student(sname,sage,ssex,semail) values(?,?,?,?) ";try {pstmt = conn.prepareStatement(sql);pstmt.setString(1, sname);pstmt.setInt(2, sage);pstmt.setString(3, ssex);pstmt.setString(4, semail);int rows = pstmt.executeUpdate();System.out.println(rows);} catch (SQLException e) {e.printStackTrace();} finally {JDBCUtil.closeResources(null, pstmt, conn);}}//删除表格中指定学号的学生的信息的方法public void delete(int sid) {Connection conn = JDBCUtil.getConn();PreparedStatement pstmt = null;String sql = "delete from student where sid=? ";try {pstmt = conn.prepareStatement(sql);pstmt.setInt(1, sid);int rows = pstmt.executeUpdate();System.out.println(rows);} catch (SQLException e) {e.printStackTrace();} finally {JDBCUtil.closeResources(null, pstmt, conn);}}//对某同学的信息进行修改的方法public void update(int sid,String sname,int sage,String ssex,String semail) {Connection conn = JDBCUtil.getConn();PreparedStatement pstmt = null;String sql = "update student set sname=?,sage=?,ssex=?,semail=? where sid=?";try {pstmt = conn.prepareStatement(sql);pstmt.setString(1, sname);pstmt.setInt(2, sage);pstmt.setString(3, ssex);pstmt.setString(4, semail);pstmt.setInt(5, sid);int rows = pstmt.executeUpdate();System.out.println(rows);} catch (SQLException e) {e.printStackTrace();} finally {JDBCUtil.closeResources(null, pstmt, conn);}}//查询出班上所有的女生的信息,并打印到控制台@Testpublic void select1() {Connection conn = JDBCUtil.getConn();PreparedStatement pstmt = null;ResultSet rs = null;String sql = "select * from student where ssex='女'";try {pstmt = conn.prepareStatement(sql);rs = pstmt.executeQuery();while(rs.next()) {System.out.println("学号:"+rs.getInt("sid")+"  姓名:"+rs.getString("sname")+"  年龄:"+rs.getInt("sage")+"  性别:"+rs.getString("ssex")+"  邮箱:"+rs.getString("semail"));}} catch (SQLException e) {e.printStackTrace();} finally {JDBCUtil.closeResources(rs, pstmt, conn);}}//查询出班上年龄大于21岁的男同学的姓名,并打印到控制台@Testpublic void select2() {Connection conn = JDBCUtil.getConn();PreparedStatement pstmt = null;ResultSet rs = null;String sql = "select * from student where ssex='男' and sage>21";try {pstmt = conn.prepareStatement(sql);rs = pstmt.executeQuery();while(rs.next()) {System.out.println("学号:"+rs.getInt("sid")+"  姓名:"+rs.getString("sname")+"  年龄:"+rs.getInt("sage")+"  性别:"+rs.getString("ssex")+"  邮箱:"+rs.getString("semail"));}} catch (SQLException e) {e.printStackTrace();} finally {JDBCUtil.closeResources(rs, pstmt, conn);}}
}

数据库MySQL基础---JDBC开发步骤--JDBC封装工具类--PreparedStatement实现CRUD操作相关推荐

  1. MySQL JDBC常用知识,封装工具类,时区问题配置,SQL注入问题

    JDBC JDBC介绍 Sun公司为了简化开发人员的(对数据库的统一)操作,提供了(Java操作数据库的)规范,俗称JDBC,这些规范的由具体由具体的厂商去做 对于开发人员来说,我们只需要掌握JDBC ...

  2. 麦子mysql_[数据库]MySQL基础 (麦子学员 php 第二阶段)

    [数据库]MySQL基础 (麦子学员 php 第二阶段) 0 2018-08-13 03:00:11 通过my.ini配置文件修改字符集:客户端字符集设置:[mysql]default-charact ...

  3. mysql以下日期函数正确的_[数据库]MYSQL基础03(日期函数)

    [数据库]MYSQL基础03(日期函数) 0 2015-10-29 01:00:09 工作中对日期的处理是经常遇到的,需求可能多种多样,因此重点介绍. 1.获取当前日期select NOW()-- 结 ...

  4. 【MySQL】黑马教程MySQL数据库 MySQL基础(一)

    文章目录 [MySQL]黑马教程MySQL数据库 | MySQL基础(一) MySQL启动 MySQL客户端连接 MySQL数据模型 SQL SQL分类 DDL 表操作-查询 表操作-创建 表操作-数 ...

  5. android dialog 隐藏状态栏_Android开发不得不收集的工具类集合

    嗨,你终于来啦 ~ 等你好久啦~ 喜欢的小伙伴欢迎关注,我会定期分享Android知识点及解析,还会不断更新的BATJ面试专题,欢迎大家前来探讨交流,如有好的文章也欢迎投稿.更新了几天Android基 ...

  6. 四、EasyExcel实现Excel读写,封装工具类

    在项目中,我们经常用到EasyExcel框架实现:对Excel文件的读写操作.为了方便后续其他项目中的使用,将对Excel文件的读写操作,封装成工具类. 一.EasyExcel实现Excel读写,封装 ...

  7. Spring Boot 整合 SpringDataNeo4j 并封装工具类解析PathValue

    Spring Boot 整合 SpringDataNeo4j 并封装工具类解析PathValue 一.Neo4j 二.Neo4j客户端浏览器 三.maven依赖 四.节点/关系映射 1.NodePer ...

  8. JAVA——Okhttp封装工具类

    基本概念 OKhttp:一个处理网络请求的开源项目,是安卓端最火热的轻量级框架. Maven <!--OK HTTP Client--><dependency><grou ...

  9. android文件读取工具类,Android 下读取Assets Properties操作封装工具类

    Android 下读取Assets Properties操作封装工具类 发布时间:2018-06-03作者:laosun阅读(2081) 为了方便使用,首先创建BaseApplication类,如下所 ...

最新文章

  1. 素数、最大公约数、最下公倍数、质因数分解
  2. oracle asm 日志,Oracle+RAC+ASM数据库ora-00257日志归档器错误解决方法
  3. 解决IE中img.onload失效的方法
  4. python怎样安装词云库_python词云库wordcloud的使用方法与实例详解
  5. java 缓冲流 刷新_java – 缓冲和刷新Apache Beam流数据
  6. 卡巴斯基正版下载及授权激活(4.8号更新)
  7. SQL语法用like %或in时Parameters要怎么用才能避免SQL Injection的问题
  8. ab753变频器参数怎么拷贝到面板_20款常用变频器密码,想成为电工老师傅你一定需要,纯干货分享!...
  9. MyBatis动态代理执行原理
  10. H.266代码学习:xCheckRDCostMerge2Nx2N函数
  11. iOS导入自定义字体
  12. Linux 端口扫描
  13. 串口协议和RS-232标准,以及RS232电平与TTL电平的区别,“USB/TTL转232“模块(以CH340芯片模块为例)的工作原理。
  14. 别看 DNS 污染闹得欢,现在我用 CoreDNS 将它拉清单
  15. 根据图片颜色显示背景色
  16. linux网卡驱动rtl8188cu,linux下编译基于rtl8188cu控制芯片的USB无线网卡驱动 -电脑资料...
  17. 物联网安全技术——思维导图
  18. 苹果加入造车潮,自动驾驶离我们还远吗?
  19. 802.11协议WIFI扫描
  20. Linux 下安装 wowza 服务器

热门文章

  1. linux上创建RAID(磁盘阵列)与LVM(逻辑盘)
  2. web前端最全各类资源
  3. 「BZOJ1095」[ZJOI2007] Hide 捉迷藏
  4. jsp 9对象4作用域
  5. 在C#中,不安装Oracle客户端如何连接Oracle数据库
  6. MongoDB数据库CXX Driver编译
  7. 抓住人工智能红利,百度AI达人养成营带你速成深度学习
  8. 中国人民大学金琴老师组,AI·M^3实验室招募视觉与语言方向硕博
  9. CV领域,Transformer在未来有可能替代CNN吗?
  10. 医学影像 | 谷歌算法提升结肠镜检查的覆盖率, 大幅降低患癌风险