JDBC(二)
## 详解JDBC各个对象
1、DriverManager对象:驱动管理对象
* 功能:
1、注册驱动:告诉程序该使用哪个数据jar包
static void registerDriver(Driver driver):之策给懂得驱动程序:DriverManager
而真正写代码使用:Driver.forName("com.mysql.jdbc.Driver");
通过查看源码发现:在com.mysql.jdbc.Driver类中存在静态代码块
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}
注意:mysql5之后的驱动jar包可以省略注册驱动的步骤。
2、获取数据库连接:
* 方法:static Connection getConnection(String url, String user, String password)
* 参数:
* url:指定连接的路径
* 语法:jdbc:mysql://ip地址(域名):端口号/数据库
* 例子:jdbc:mysql://localhost:3306/db
* 细节:如果连接的是本机的mysql服务器,并且Mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库
2、Connection对象:数据库连接对象
* 功能:
1、获取执行sql对象:
* Statement createStatement();
* PreparedStatement prepareStatement(String sql)
2、管理事务:
* 开启事务:setAutoCommit(boolean autoCommit) 调用该方法,设置参数为false,即开启事务
* 提交事务:commit()
* 回滚事务:rollback()
3、Statement对象:执行sql的对象
1、执行sql
1、boolean execute(String sql):可以执行任意的sql(了解)
2、int executeUpdate(String sql):执行DML(增删改)语句,DDL(create,alter,drop)语句
* 返回值:影响的行数,可以通过影响的行数来判断DML语句是否执行成功,返回值>0,执行成功;反之则失败。
3、ResultSet executeQuery(String sql); 执行DQL(select语句)语句
4、ResultSet对象:结果集对象,封装查询结果
* next():游标向下移动一行。判断当前行是否是最后一行末尾(是否有数据);如果是,返回true,否则false。
* getXxx():获取数据
* Xxx:代表数据类型 如:int getInt() String getString()
* 参数:
1、Int:代表列的编号。从1开始 如:getString(1)
2、String:代表列名称 如:getString("name")
* 注意:
* 使用步骤:
1、游标向下移动一行
2、判断是否有数据
3、获取数据
package JDBC.demo02; import java.sql.*; /**
* 查询数据
*/
public class JDBCDemo03 {
private static final String url = "jdbc:mysql:///ftj";
private static final String username = "root";
private static final String password = "password";
private static Connection conn;
private static Statement stmt;
private static ResultSet rs; public static void main(String[] args) {
//获取数据库驱动,5版本之后可以不写
try {
Class.forName("com.mysql.cj.jdbc.Driver");
//获取连接参数
conn = DriverManager.getConnection(url, username, password);
//sql语句
String sql = "select * from account where id = 1";
//获取执行sql语句的对象
stmt = conn.createStatement();
//执行sql
rs = stmt.executeQuery(sql);
//处理结果集
//让游标向下移动一行
/*rs.next();
//获取数据
int id = rs.getInt(1);
String name = rs.getString("name");
int count = rs.getInt("count");
System.out.println(id+"---"+name+"---"+count);*/
while (rs.next()) {
int id = rs.getInt(1);
String name = rs.getString("name");
int count = rs.getInt("count");
System.out.println(id+"---"+name+"---"+count);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
5、PreparedStatement对象:
1、SQL注入问题:在拼接SQL时,有一些SQL的特殊关键字参与字符串的拼接。会造成安全性问题
1、随意输入用户名,随意输入密码 select * from user where username = 'fdsafdsd' and password = 'a' or 'a' = 'a';
2、解决SQL注入问题:使用PreparedStatement对象来解决
3、预编译SQL:参数使用?作为占位符
4、步骤:
1、导入驱动jar包
2、注册驱动
3、获取数据库连接对象 Connection
4、定义sql
* 注意:sql的参数使用?作为占位符。 如:select * from user where username = ? and password = ?;
5、获取执行sql语句的对象 PreparedStatement Connerction.prepareStatement(String sql);
6、给?赋值:
* 方法:setXxx(参数1,参数2) 参数1:?的位置 参数2:?的值
7、执行sql,接收返回结果,不需要传递sql语句了
8、处理结果
9、释放资源
5、后期都会使用PreparedStatement对象来完成所有增删改查操作
1、可以防止sql注入
2、效率更高
## 抽取JDBC工具类:JDBCUtils
* 目的:简化书写
* 分析:
1、注册驱动也抽取
2、抽取一个方法获取连接对象
* 需求:不想传递参数(麻烦),还得保证工具类的通用性、
* 解决方案:配置文件
* jdbc.properties
url=
user=
password=
package JDBC.demo03; import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.Properties; /**
* JDBC工具类
*/
public class JDBCUtils { private static String url;
private static String user;
private static String password;
private static String driver; /**
* 文件的读取,只需要读取一次即可,拿到这些值,使用静态代码块(随着类的加载而加载,只会加载一次)
*/
static { try {
//读取资源文件,获取值
//1、创建Properties集合类对象
Properties properties = new Properties();
//2、加载文件
ClassLoader classLoader = JDBCUtils.class.getClassLoader();
URL res = classLoader.getResource("jdbc.properties");
String path = res.getPath();
System.out.println(path);
//String path = "jdbc.properties";
//静态代码块只能处理异常,因为不是方法,所以不能抛异常
properties.load(new FileReader(path));
//3、获取数据,传值
url = properties.getProperty("url");
user = properties.getProperty("user");
password = properties.getProperty("password");
driver = properties.getProperty("driver");
//4、注册驱动
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 获取连接
*
* @return 连接对象
*/
public static Connection getConnection() throws SQLException { return DriverManager.getConnection(url, user, password);
} /**
* 关闭连接
*
* @param conn
* @param stmt
*/
public static void colseConntection(Connection conn, Statement stmt) {
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
} /**
* 关闭连接
*
* @param conn
* @param stmt
* @param rs
*/
public static void colseConntection(Connection conn, Statement stmt, ResultSet rs) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
3、抽取方法释放资源
JDBC(二)的更多相关文章
- JAVA基础-JDBC二(常用的开源工具)
一.连接池 在实际的开发应用中,我们常常会对数据库进行大量的高并发的访问,而最原始的连接和操作方式并不能满足这种大量的访问,程序员为了追求更方便.更快捷.更科学安全的开发.第三方的工具类和Dao层的框 ...
- JDBC二查询(web基础学习笔记八)
一.建立数据库 --创建news表空间 CREATE TABLESPACE tbs_news DATAFILE 'F:\ORACLE\news.dbf' SIZE 10M AUTOEXTEND ON; ...
- JDBC二部曲之_入门
JDBC 1 什么是JDBC? JDBC(Java DataBase Connectivity),即Java数据库连接!也就是说,Java程序员可以使用JDBC API来操作数据库. 最早JDBC是J ...
- java JDBC (二) 防止注入/参数化
package cn.sasa.demo2; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Pr ...
- java基础之JDBC二:原生代码基础应用
JDBC的基础应用CURD: 增删改 public void noQuery() { Connection conn = null; Statement stat = null; try { //注册 ...
- JDBC二部曲之_事物、连接池
事务 事务概述 事务的四大特性(ACID) 事务的四大特性是: l 原子性(Atomicity):事务中所有操作是不可再分割的原子单位.事务中所有操作要么全部执行成功,要么全部执行失败. l 一致 ...
- mysql的jdbc入门学习小结
转自:专注JavaWeb开发 http://www.javaweb1024.com/data/MySQL/2015/04/25/618.html 一.jdbc基本概念jdbc : Java Datab ...
- Java基础 JDBC
一,前言 数据库是开发中必不可少的一个工具,那么java如何操作数据库呢,那就是我们的JDBC了,接下来我们将会好好聊一下这个JDBC. 二,JDBC 2.1 JDBC概述 JDBC(Java Dat ...
- JDBC(3):PreparedStatement对象介绍
一,PreparedStatement介绍 PreperedStatement是Statement的子类,它的实例对象可以通过Connection.preparedStatement()方法获得,相对 ...
随机推荐
- 改变生活的移动计算——感受 MobiSys 2015
MobiSys 2015" title="改变生活的移动计算--感受 MobiSys 2015"> 作者:微软亚洲研究院研究员 张健松 今年的MobiSys会议地点 ...
- jsde与gulp使用说明
jade是一款基于haml的html模板引擎,已改为pug 1.全局安装 npm install jade -g 新建一个jade文件夹,再建一个后缀名为.jade的文件编辑.jade文件 jade ...
- GDB调试指南-单步调试
前言 前面通过<启动调试>,<断点设置>,<变量查看>,我们已经了解了GDB基本的启动,设置断点,查看变量等,如果这些内容你还不知道,建议先回顾一下前面的内容.在启 ...
- -scp Linux之间复制文件和目录
scp 简介 scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的.可能会稍微影响一下速 ...
- HTML5全屏背景视频与 CSS 和 JS(插件或库)
译文原链接:http://codetheory.in/html5-fullscreen-background-video/ 前言: 当网页载入时,自动播放的全屏背景视频已经成为当前颇受欢迎的趋势. 就 ...
- 《前端面试加分项目》系列 企业级Vue瀑布流
本文 GitHub github.com/ponkans/F2E 已收录,有一线大厂面试点思维导图,也整理了很多我的文档,欢迎Star和完善,大家面试可以参照考点复习.文末有福利~~ 前言 接水怪又来 ...
- python大佬养成计划----HTML网页设计(序列)
序列化标签 1.有序标签--ol和li 有序列表标签是<ol>,是一个双标签.在每一个列表项目前要使用<li>标签.<ol>标签的形式是带有前后顺序之分的编号.如果 ...
- 通读Python官方文档之cgitb
cgitb CGI脚本异常管理 源代码:Lib/cgitb.py cgitb模块为Python脚本提供了一个特殊的异常管理器.名字有点误导人,它最初设计是为了以HTML格式展示cgi脚本的大量异常信息 ...
- 对于页面适配,你应该使用px还是rem
css中的单位很多,%.px.em.rem,以及比较新的vw.vh等.每个单位都有特定的用途,比如当需要设置一个矩形的宽高比为16:9,并且随屏幕宽度自适应时,除了用%,其他单位是很难做到的.所以不存 ...
- Python正则表达式语法
单个字符匹配 字符 匹配 . 匹配任意字符(除了\n) [...] 匹配字符集 \d/\D 匹配数字/非数字 \s/\S 匹配空白/非空白字符 \w/\W 匹配单词字符[a-zA-A0-9] In [ ...