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 ...
随机推荐
- 第三方API接口测试问题反馈文档
大家在给甲方做大型项目的时候,有时候参与的厂商比较多,而公司负责的部分又需要第三方厂商提供接口支持. 例如我们做医疗行业的,给医院提供医保控费系统服务的,就需要HIS厂商提供接口给我们采集数据.有时候 ...
- java中if语句的应用
1. 注释怎么写: 1.1 //单行注释 1.2 /*多行注释*/ 2. If语句的用法 2.1. if(条件语句){ ( ps:只有一行代码时可以不加{} ) } 2.2. if(条件语句) ...
- Androidd Studio 之多行文字跑马灯特效
•效果展示图 •参考资料 两种方法实现TextView跑马灯效果(字体横向滚动) •出现的问题 新建 Java 文件继承 TextView 时出现问题: •解决方法 不应该继承 $TextView$ ...
- irace package -- 参数调优神器
目录 1. irace 是什么 2. 安装 irace 3. irace 的运行机制 4. irace 的配置环境 4.1. parameters 4.2. target algorithm runn ...
- 前端vue使用高德地图
首先,注册Key 1.注册开发者账号,成为高德开放平台开发者 2.登陆之后,在进入「应用管理」 页面「创建新应用」 3.为应用添加 Key,「服务平台」一项请选择「 Web 端 ( JSAPI ) 」 ...
- 爬虫入门到放弃系列07:js混淆、eval加密、字体加密三大反爬技术
前言 如果再说IP请求次数检测.验证码这种最常见的反爬虫技术,可能大家听得耳朵都出茧子了.当然,也有的同学写了了几天的爬虫,觉得爬虫太简单.没有啥挑战性.所以特地找了三个有一定难度的网站,希望可以有兴 ...
- 亲测有效,解决80端口被svchost.exe进程占用的问题,网上的方法不行,可以试试这个
先说网上无效的方法(个人尝试无效,不具有代表性): 网上第一个说法:把IIS给关了,Windows10系统本身IIS是处于禁用状态的,并且没有额外安装IIS和启动IIS. 网上第二个说法:和SQL S ...
- Dcoker-搭建日志监控系统
项目中常用集中日志收集工具 Logstash Logstash是一个开源数据收集引擎,具有实时管道功能.Logstash可以动态地将来自不同数据源的数据统一起来,并将数据标准化到你所选择的目的地. 优 ...
- Elasticsearch 主节点和暖热节点解析
Elasticsearch 主节点和暖热节点解析 主节点 控制整个集群,进行一些轻量级操作,列如:跟踪哪些节点是集群中的一部分,决定节点分片分配,负责集群健康, 不包含数据,也不参与搜索和索引操作,对 ...
- [Fundamental of Power Electronics]-PART I-4.开关实现-0 序
4 开关实现 在前面的章节中我们已经看到,可以使用晶体管,二极管来作为Buck,Boost和其他一些DC-DC变换器的开关元件.也许有人会想为什么会这样,以及通常如何实现半导体的开关.这些都是值得被提 ...