1.JDBC介绍

jdbc(java database connectivity)为java开发者使用数据库提供了统一的编程接口,它由一组java类和接口组成。

JDBC需要用到的类和接口有:

DriverManager、Connection、Statement、ResultSet

2. mysql-connector-java下载

本机的mysql版本是5.7.26 win32的,所以本章访问mysql都以该版本为例:

然后进入https://dev.mysql.com/downloads/connector/j/下载mysql-connector-java.jar包,用于连接mysql

如下图所示,只有8.0.19版本,那我们下载它就好了,反正不管64位还是32位都能访问:

下载解压后,就有个mysql-connector-java-8.0.19.jar:

接下来就来测试,能不能访问

3.JDBC使用过程

3.1 通过DriverManager. registerDriver(Driver driver)来注册驱动程序

需要注意,new Driver的时候,需要选择com.mysql.cj.jdbc.Driver:

因为com.mysql.jdbc.Driver已经被弃用了.

PS:也可以直接将DriverManager. registerDriver(Driver driver)改为:

Class.forName("com.mysql.cj.jdbc.Driver");
//加载一下这个类就可以注册驱动,因为mysql Driver类的静态代码块中已经调用了registerDriver()来注册驱动程序.

3.2 然后通过 Connection DriverManager.getConnection(String url, String user, String password)来连接数据库,并获取Connection对象

url: 填入“jdbc:子协议://ip地址:端口号/数据库名” ,如果是mysql则填入“jdbc:mysql://localhost:3306/数据库名”

针对mysql-connector-java-8.0以上的版本,则还要追加"?characterEcoding=utf-8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true"

username:mysql用户名

password:mysql密码

3.3 通过Connection对象获取statement对象

Statement statement = connection.createStatement();

3.4 通过statement对象的executeQuery(String)来执行查询sql语句,并返回ResultSet数据库结果集

比如:

ResultSet  resultSet = statement. executeQuery("select * from student");       //获取student表里的数据

除此之外还有int executeUpdate(String sql)方法.用来实现INSERT、UPDATE 或 DELETE 语句,返回值表示执行sql语句之后影响到的数据行数 (后面示例有讲)

3.5 然后通过ResultSet来读出query内容

ResultSet常用方法如下:

boolean first();             //移到内容第一行数据处

boolean  last();             //移到内容最后一行数据处

int getRow() ;             //获取当前光标处于的行号

boolean isLast()           //获取光标是否位于此 ResultSet 对象的最后一行。

boolean   next();          //移到下一行数据处,然后就可以通过getXXX()获取完当前一行数据后,则通过next()来移动到下行继续getXXX(),直到next()返回为false为止

boolean   previous();     //移到上一行数据处

String getString(String columnLabel);  //获取当前一行的columnLabel列名的内容                             

String  getString(int columnIndex);   //获取当前一行的第columnIndex列的内容,第一列是从1开始的.

         String getInt (String columnLabel);  //获取当前一行的columnLabel列名的内容                     

String  getInt(int columnIndex);  //获取当前一行的第columnIndex列的内容,第一列是从1开始的.

//...除此之外,还有getFloat(),getLong(),getShort(),getURL(),getBoolean(),getRowId()

 PS:获取到ResultSet后,必须先next()一次才能getXXX(),来获取内容

3.6 访问结束后,释放Mysql资源(毕竟mysql连入个数是有限的) 

    try {
if(resultSet!=null){
resultSet.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(statement!=null){
statement.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(connection!=null){
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}

4.本章要访问的数据库以students为例:

5.首先来写JdbcUtils工具类

JdbcUtils工具类里主要写getConnection(),releaseResc()这两个类,这样避免后续的重复代码产生.

JdbcUtils.java代码如下所示:

public class JdbcUtils {

    private static String driver;
private static String url;
private static String user;
private static String pwd; static{ driver = "com.mysql.cj.jdbc.Driver";
url = "jdbc:mysql://localhost:3306/students?characterEcoding=utf-8&"
+ "useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true"; user = "root";
pwd = "sql"; } //获取一个链接mysql的Connection对象
static public Connection getConnection(){ try {
Class.forName(driver);
Connection connection = DriverManager.getConnection(url,user,pwd);
return connection;
} catch (Exception e) {
e.printStackTrace();
return null;
} } /**
* 释放Mysql资源(毕竟mysql连入个数是有限的)
* @param resultSet 结果集
* @param statement
* @param connection 链接
*/
public static void releaseResc(ResultSet resultSet, Statement statement, Connection connection) { try {
if(resultSet!=null){
resultSet.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(statement!=null){
statement.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(connection!=null){
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}

6.数据库查询示例

查询所有学生的信息:

@Test
public void jdbcQuery(){ ResultSet resultSet = null;
Statement statement = null;
Connection connection = null;
try {
connection = JdbcUtils.getConnection(); //通过JdbcUtils获取connection
statement = connection.createStatement(); String sql = "select * from student"; resultSet = statement.executeQuery(sql); while(resultSet.next()){ String name = resultSet.getString("name");
String score = resultSet.getString("score");
String classs = resultSet.getString("class"); System.out.println("姓名:"+name+" 成绩:"+score+" 班级:"+classs);
} } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally { JdbcUtils.releaseResc(resultSet, statement, connection); //释放资源
}
}

打印如下所示:

7.数据库插入示例

@Test
public void jdbcInser(){ ResultSet resultSet = null;
Statement statement = null;
Connection connection = null; try {
connection = JdbcUtils.getConnection();
statement = connection.createStatement(); String name = "小f";
int score = 99;
String classs = "初2-4班"; String sql = "INSERT INTO student(name,score,class) "
+" values('"+name+"','"+String.valueOf(score)+"','"+classs+"')"; int result = statement.executeUpdate(sql);
//executeUpdate:用来实现INSERT、UPDATE 或 DELETE 语句,返回值表示执行sql语句之后影响到的数据行数 System.out.println("插入了"+result+"条数据"); } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally { JdbcUtils.releaseResc(resultSet, statement, connection); //释放资源
}
}

运行打印:

查看数据库:

8.数据库更新示例

将所有低于60分的同学的成绩改为0:

@Test
public void jdbcUpdate(){ ResultSet resultSet = null;
Statement statement = null;
Connection connection = null; try {
connection = JdbcUtils.getConnection();
statement = connection.createStatement(); String sql = "update student SET score='0' WHERE score<60"; int result = statement.executeUpdate(sql);
//executeUpdate:用来实现INSERT、UPDATE 或 DELETE 语句,返回值表示执行sql语句之后影响到的数据行数 System.out.println("更新了"+result+"条数据"); } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally { JdbcUtils.releaseResc(resultSet, statement, connection); //释放资源
} }

查看数据库:

9.SQL 注入攻击

Statement采取直接编译 SQL 语句的方式,扔给数据库去执行,所以很容易进行被SQL注入攻击.

比如:

我们登陆执行时需要执行:

statement.executeQuery("select id from users where name ='"+username+"' and password = '"+password+"'");

而黑客则将字符串直接改为:

statement.executeQuery("select id from users where name ='"+username+"' or '1==1' and password = '"+password+"'");

就可以直接乱输入密码也能实现登录了,所以java中提供了另一个类PreparedStatement, 采用"?"占位符预编译,再填充参数,用来避免SQL注入攻击.

PreparedStatement类介绍

采用"?"占位符预编译,再填充参数,然后通过setXXX()来填充参数.比如setString():

setString(int parameterIndex, String x);       //向第parameterIndex个占位符填入x内容
// parameterIndex:第一个?占位符是1,第二个是2.... //...除了该方法之外,还有setFloat(),setLong(),setBoolean()....等等

修改登录界面之PreparedStatement使用如下所示:

public static boolean login(String username,String password){
          Connection connection = JdbcUtils.getConnection(); //获取
try { String sql = "select id from users where username =? and password = ?"; //要运行的sql语句,通过?来替换登录账号和密码 PreparedStatement preparedStatement = connection.prepareStatement(sql); //第一个? 用username字符串去替换
preparedStatement.setString(1, username); //第二个? 用password字符串去替换
preparedStatement.setString(2, password); ResultSet resultSet = preparedStatement.executeQuery(); return resultSet.next(); //有值则返回true,否则返回false; } catch (SQLException e) {
e.printStackTrace();
return false;
}
}

20.java-JDBC连接mysql数据库详解的更多相关文章

  1. JAVA通过JDBC连接Oracle数据库详解【转载】

    JAVA通过JDBC连接Oracle数据库详解 (2011-03-15 00:10:03) 转载▼http://blog.sina.com.cn/s/blog_61da86dd0100q27w.htm ...

  2. java jdbc 连接mysql数据库 实现增删改查

    好久没有写博文了,写个简单的东西热热身,分享给大家. jdbc相信大家都不陌生,只要是个搞java的,最初接触j2ee的时候都是要学习这么个东西的,谁叫程序得和数据库打交道呢!而jdbc就是和数据库打 ...

  3. java jdbc 连接mysql 数据库

    JDBC连接MySQL 加载及注册JDBC驱动程序 Class.forName("com.mysql.jdbc.Driver"); Class.forName("com. ...

  4. JAVA采用JDBC连接操作数据库详解

    JDBC连接数据库概述 一.JDBC基础知识 JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供 ...

  5. 原生jdbc操作mysql数据库详解

    首先给大家说一下使用JDBC链接数据库的步骤 1.加载链接数据库驱动 2.建立数据库链接 3.创建数据库操作对象 4.编写sql语句,执行sql语句 5.获取结果集 6.释放资源 我这边采用的是mav ...

  6. ava基础MySQL存储过程 Java基础 JDBC连接MySQL数据库

    1.MySQL存储过程   1.1.什么是存储过程 带有逻辑的sql语句:带有流程控制语句(if  while)等等 的sql语句   1.2.存储过程的特点 1)执行效率非常快,存储过程是数据库的服 ...

  7. java用JDBC连接MySQL数据库的详细知识点

    想实现java用JDBC连接MySQL数据库.需要有几个准备工作: 1.下载Connector/J的库文件,下载Connector/J的官网地址:http://www.mysql.com/downlo ...

  8. JDBC 连接mysql数据库

    JDBC 连接mysql数据库jar包:mysql-connector-java-5.1.47.jar 下载:mysql-connector-java-5.1.47.jar jdbc:java dat ...

  9. Java中连接MySql数据库的例子

    Java中连接MySql数据库的例子: package com.joinmysql.demo; import java.sql.DriverManager; import java.sql.Resul ...

随机推荐

  1. Bi-LSTM-CRF for Sequence Labeling

    做了一段时间的Sequence Labeling的工作,发现在NER任务上面,很多论文都采用LSTM-CRFs的结构.CRF在最后一层应用进来可以考虑到概率最大的最优label路径,可以提高指标. 一 ...

  2. java 基本数据类型的自动拆箱与装箱

    ——>  -128~127之间的特殊性.为什么要这样设计,好处? ——>  享元模式(Flyweight Pattern):享元模式的特点是,复用我们内存中已存在的对象,降低系统创建对象实 ...

  3. CF526F Pudding Monsters

    CF526F Pudding Monsters 题目大意:给出一个\(n* n\)的棋盘,其中有\(n\)个格子包含棋子. 每行每列恰有一个棋子. 求\(k*k\)的恰好包含\(k\)枚棋子的子矩形个 ...

  4. LuoguP3521 [POI2011]ROT-Tree Rotations

    P3521 [POI2011]ROT-Tree Rotations 题目大意: 给一棵\((1≤n≤200000)\)个叶子的二叉树,可以交换每个点的左右子树,要求前序遍历叶子的逆序对最少. 我们发现 ...

  5. MFC下获取系统内存和当前进程的内存使用情况

    GlobalMemoryStatusEx来获取系统的内存使用情况 GetProcessMemoryInfo获取某个进程的内存使用情况.和任务管理器看到的是一样的. 具体代码如下: void GetSy ...

  6. 【36.11%】【codeforces 725C】Hidden Word

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  7. sklearn各种分类器简单使用

    sklearn中有很多经典分类器,使用非常简单:1.导入数据 2.导入模型 3.fit--->predict 下面的示例为在iris数据集上用各种分类器进行分类: #用各种方式在iris数据集上 ...

  8. 非GUI-Qt程序运行后显示Console(简单好用:在pro文件中加入: CONFIG += console)

    ----我的生活,我的点点滴滴!! 有很多时候,我们在程序中添加了好Debug信息,方便程序在运行期间打印出一些我们需要的信息或者,想用他来显示一些必要信息时, 那么console就太重要了,曾几何时 ...

  9. 五分钟学Java:可变参数究竟是怎么一回事?

    在逛 programcreek 的时候,我发现了一些专注基础但不容忽视的主题.比如说:Java 的可变参数究竟是怎么一回事?像这类灵魂拷问的主题,非常值得深入地研究一下. 我以前很不重视基础,觉得不就 ...

  10. 什么?我往Redis写的数据怎么没了?

    大概是因为int没有因为change方法而改变原值,所以就说它传过去的是自身的值,因而叫值传递:User对象经过change方法后,对象的数据变了,就认为是因为实参和形参指向的是同一片内存空间,内存空 ...