6 JDBC
JDBC
理解图

需要mysql包
下载官网:https://downloads.mysql.com/archives/c-j/
第一个JDBC项目
创建一个java项目,一路next
导入jar包
如果是Maven项目的话,在pom.xml文件输入
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
编写测试代码
步骤:
- 加载驱动 ——打开SQLyog
- 用户信息和url——输入用户账号密码和url (localhost)
- 连接成功,数据库对象——点击连接
- 获得执行SQL的对象
- 获得返回结果集合——执行语句,返回结果
- 释放连接
import java.sql.*;
public class jdbc_01 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1. 加载驱动 ——打开SQLyog
Class.forName("com.mysql.jdbc.Driver");//固定写法
//2. 用户信息和url
//useUnicode=true 支持中文编码 &characterEncoding=utf8 设置中文字符UTF8&useSSL=true 使用安全的连接
String url = "jdbc:mysql://localhost:3306/jdbcStudy?useUnicode=true&characterEncoding=utf8&useSSL=true";
String username="root";
String password="123456";
//3. 连接成功,数据库对象
Connection connection = DriverManager.getConnection(url, username, password);
//4. 获得执行SQL的对象
Statement statement = connection.createStatement();
//5. 获得返回结果集合
String sql = "SELECT * FROM users";
ResultSet resultSet = statement.executeQuery(sql); while(resultSet.next()){
System.out.println(resultSet.getObject("id"));
System.out.println(resultSet.getObject("name"));
}
//6.释放连接
resultSet.close();
statement.close();
connection.close();
}
}
DriverManager
//加载驱动,不返回对象的原因(即不new的原因)
Class.forName("com.mysql.jdbc.Driver");
//com.mysql.jdbc.Driver类中存在了DriverManager.registerDriver(new Driver());
URL
String url = "jdbc:mysql://localhost:3306/jdbcStudy?useUnicode=true&characterEncoding=utf8&useSSL=true";
//mysql 默认3306端口
//jdbc:mysql 理解成https 就是连接Mysql
//localhost 理解成www.baidu.com
//jdbcStudy 数据库名
Connection
Connection connection = DriverManager.getConnection(url, username, password);
//connection 代表数据库
//数据库设置自动提交connection.getAutoCommit();
//事务提交connection.commit();
//事务回滚connection.rollback();
statement 执行SQL 的对象 prepareStatement
statement用于向是数据库发送sql
statement.executeQuery();//查询 返回ResultSet
statement.executeUpdate();//更新 插入 删除 返回受影响的行数
statement.execute();//SQL语句
Resultset 查询的结果集
resultSet.getString();
resultSet.getFloat();
resultSet.getInt();
resultSet.getObject();//知道类的类型就使用指定类型
resultSet.next();
释放资源 不关耗资源
resultSet.close();
statement.close();
connection.close();
封装
编写配置
编写工具类
编写测试类
文件结构

db.properties(字符串不用加引号)
driver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/jdbcStudy?useUnicode=true&characterEncoding=utf8&useSSL=true
username = root
password = 123456
工具类
package cn.dj.www.lesson01;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
public class JdbcUtil {
private static String driver=null;
private static String url=null;
private static String username=null;
private static String password=null;
static{
try{
//./ 表示上一级目录
InputStream inputStream = JdbcUtil.class.getClassLoader().getResourceAsStream("db.properties");
Properties properties = new Properties();
properties.load(inputStream);
driver=properties.getProperty("driver");
url=properties.getProperty("url");
username=properties.getProperty("username");
password=properties.getProperty("password");
//驱动只要加载一次
Class.forName(driver);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//获取连接
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url, username, password);
}
//释放连接
public static void release(Connection connection, Statement statement, ResultSet resultSet) {
if(resultSet!=null){
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(statement!=null){
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
测试类
package cn.dj.www.lesson01;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Test {
public static void main(String[] args) throws SQLException {
Connection connection = JdbcUtil.getConnection();
Statement statement = connection.createStatement();
String name = "li%";//注意有''
String sql = "SELECT * FROM users " +
"where name like '"+name+"'";
ResultSet rs = statement.executeQuery(sql);
while(rs.next()){
System.out.println(rs.getString("name"));
System.out.println(rs.getInt("id"));
}
JdbcUtil.release(connection,statement,rs);
}
}
statement对象导致SQL注入
典型例子
String id = "1 or 1=1";
String sql = "SELECT * FROM users " +"where id = "+id;
prepareStatement
更安全,效率更高
package cn.dj.www.lesson01;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Date;
public class PTest {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement pst =null;
try {
conn = JdbcUtil.getConnection();
String sql = "insert into users(id,`name`,`password`,`email`,`birthday`)"+
"values(?,?,?,?,?)";
pst = conn.prepareStatement(sql);//预编译
//传递参数
pst.setInt(1,4);
pst.setString(2,"DJ");
pst.setString(3,"123456");
pst.setString(4,"123@163.com");
// java Date().getTime() 获得时间戳
pst.setDate(5, new java.sql.Date(new Date().getTime()));
int i = pst.executeUpdate();
if(i>0){
System.out.println("插入成功!");
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
JdbcUtil.release(conn,pst,null);
}
}
}
解决1=1注入的例子
//防止SQL注入的本质:把传递进来的参数当做字符就是外面再包了'',假设其中存在转移字符如(‘)就直接忽略了
String name =" '' or 1=1";
String sql = "SELECT * FROM users " +"where name = ?";
pst.setString(1,name);
6 JDBC的更多相关文章
- Java数据库连接技术——JDBC
大家好,今天我们学习了Java如何连接数据库.之前学过.net语言的数据库操作,感觉就是一通百通,大同小异. JDBC是Java数据库连接技术的简称,提供连接各种常用数据库的能力. JDBC API ...
- 玩转spring boot——结合AngularJs和JDBC
参考官方例子:http://spring.io/guides/gs/relational-data-access/ 一.项目准备 在建立mysql数据库后新建表“t_order” ; -- ----- ...
- [原创]java使用JDBC向MySQL数据库批次插入10W条数据测试效率
使用JDBC连接MySQL数据库进行数据插入的时候,特别是大批量数据连续插入(100000),如何提高效率呢?在JDBC编程接口中Statement 有两个方法特别值得注意:通过使用addBatch( ...
- JDBC MySQL 多表关联查询查询
public static void main(String[] args) throws Exception{ Class.forName("com.mysql.jdbc.Driver&q ...
- JDBC增加删除修改
一.配置程序--让我们程序能找到数据库的驱动jar包 1.把.jar文件复制到项目中去,整合的时候方便. 2.在eclipse项目右击"构建路径"--"配置构建路径&qu ...
- JDBC简介
jdbc连接数据库的四个对象 DriverManager 驱动类 DriverManager.registerDriver(new com.mysql.jdbc.Driver());不建议使用 ...
- JDBC Tutorials: Commit or Rollback transaction in finally block
http://skeletoncoder.blogspot.com/2006/10/jdbc-tutorials-commit-or-rollback.html JDBC Tutorials: Com ...
- FineReport如何用JDBC连接阿里云ADS数据库
在使用FineReport连接阿里云的ADS(AnalyticDB)数据库,很多时候在测试连接时就失败了.此时,该如何连接ADS数据库呢? 我们只需要手动将连接ads数据库需要使用到的jar放置到%F ...
- JDBC基础
今天看了看JDBC(Java DataBase Connectivity)总结一下 关于JDBC 加载JDBC驱动 建立数据库连接 创建一个Statement或者PreparedStatement 获 ...
- Spring学习记录(十四)---JDBC基本操作
先看一些定义: 在Spring JDBC模块中,所有的类可以被分到四个单独的包:1.core即核心包,它包含了JDBC的核心功能.此包内有很多重要的类,包括:JdbcTemplate类.SimpleJ ...
随机推荐
- Memory Networks01 记忆网络经典论文
目录 1.Memory Networks 框架 流程 损失函数 QA 问题 一些扩展 小结 2.End-To-End Memory Networks Single Layer 输入模块 算法流程 Mu ...
- python基础学习之类的继承、魔法方法
什么是继承 即类A可以使用类B的方法,即B是A的父类,A是B的子类,AB之间是继承关系 class Father(): # 父类 def __init__(self,name,age): self. ...
- ES6学习笔记(3)- 对象的功能性扩展
一.什么是对象字面量 对象字面量就是创建对象(Object)的一种简单容易理解的方式,再通俗点就是所谓的键值对的集合.举个简单的例子: let book = { name: 'JavaScript', ...
- 简单ping确定网络故障
1.ping localhost (127.0.0.1) 目的:确定TCP/IP有无问题 2.ping本机地址 用来检测网卡驱动有无问题 如何获取本机地址? win+r cmd 输入ipconfig/ ...
- PTA 冒泡排序
6-4 冒泡排序 (10 分) 编程实现冒泡排序函数.void bubbleSort(int arr[], int n);.其中arr存放待排序的数据,n为数组长度(1≤n≤1000). 函数接口 ...
- x64 下记事本WriteFile() API钩取
<逆向工程核心原理>第30章 记事本WriteFile() API钩取 原文是在x86下,而在x64下函数调用方式为fastcall,前4个参数保存在寄存器中.在原代码基础上进行修改: 1 ...
- Java中BO、DAO、DO、DTO、PO、POJO、VO的概念
在程序开发中,经常会碰到各种专业术语,这里统一做一下解释,有遗漏或理解错误的恳请指正. BO(Business Object)业务对象 主要作用是把业务逻辑封装为一个对象,这个对象可以包括一个或多个其 ...
- Java中的集合Set - 入门篇
前言 大家好啊,我是汤圆,今天给大家带来的是<Java中的集合Set - 入门篇>,希望对大家有帮助,谢谢 简介 前面介绍了集合List,映射Map,最后再简单介绍下集合Set,相关类如下 ...
- Azure App Service(一)利用Azure DevOps Pipeline 构建镜像,部署应用程序
一,引言 起因是前两天项目上做测试,需要我把写好的基于.NET 5 的 Web 测试程序作成 Docker 镜像.当我在本地验证完功能后,准备利用 Docker 构建应用程序镜像的时候,发现系统不支持 ...
- [矩阵乘法] PKU3233 Matrix Power Series
[ 矩 阵 乘 法 ] M a t r i x P o w e r S e r i e s [矩阵乘法]Matrix Power Series [矩阵乘法]MatrixPowerSeries Desc ...

