##  详解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(二)的更多相关文章

  1. JAVA基础-JDBC二(常用的开源工具)

    一.连接池 在实际的开发应用中,我们常常会对数据库进行大量的高并发的访问,而最原始的连接和操作方式并不能满足这种大量的访问,程序员为了追求更方便.更快捷.更科学安全的开发.第三方的工具类和Dao层的框 ...

  2. JDBC二查询(web基础学习笔记八)

    一.建立数据库 --创建news表空间 CREATE TABLESPACE tbs_news DATAFILE 'F:\ORACLE\news.dbf' SIZE 10M AUTOEXTEND ON; ...

  3. JDBC二部曲之_入门

    JDBC 1 什么是JDBC? JDBC(Java DataBase Connectivity),即Java数据库连接!也就是说,Java程序员可以使用JDBC API来操作数据库. 最早JDBC是J ...

  4. java JDBC (二) 防止注入/参数化

    package cn.sasa.demo2; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Pr ...

  5. java基础之JDBC二:原生代码基础应用

    JDBC的基础应用CURD: 增删改 public void noQuery() { Connection conn = null; Statement stat = null; try { //注册 ...

  6. JDBC二部曲之_事物、连接池

    事务 事务概述 事务的四大特性(ACID) 事务的四大特性是: l  原子性(Atomicity):事务中所有操作是不可再分割的原子单位.事务中所有操作要么全部执行成功,要么全部执行失败. l  一致 ...

  7. mysql的jdbc入门学习小结

    转自:专注JavaWeb开发 http://www.javaweb1024.com/data/MySQL/2015/04/25/618.html 一.jdbc基本概念jdbc : Java Datab ...

  8. Java基础 JDBC

    一,前言 数据库是开发中必不可少的一个工具,那么java如何操作数据库呢,那就是我们的JDBC了,接下来我们将会好好聊一下这个JDBC. 二,JDBC 2.1 JDBC概述 JDBC(Java Dat ...

  9. JDBC(3):PreparedStatement对象介绍

    一,PreparedStatement介绍 PreperedStatement是Statement的子类,它的实例对象可以通过Connection.preparedStatement()方法获得,相对 ...

随机推荐

  1. 日志框架之2 slf4j+logback实现日志架构 · 远观钱途

    如何从缤纷复杂的日志系统世界筛选出适合自己的日志框架以及slf4j+logback的组合美妙之处?此文可能有帮助 logback介绍 Logback是由log4j创始人设计的另一个开源日志组件,官方网 ...

  2. 千亿VR市场 将被国内厂商玩坏多少?

    将被国内厂商玩坏多少?" title="千亿VR市场 将被国内厂商玩坏多少?"> 智能硬件行业在不断寻求新的突破口,当智能手机.平板.电视.家电等都司空见惯之后,能 ...

  3. Swift 进阶 第 4 课 集合类型协议

    • Read 序列 一个序列 (sequence) 代表的是一系列具有相同类型 的值,你可以对这些值进行迭代.遍历一个序列最简单的方式是使用 for 循环: 123 for element in so ...

  4. 《和莎莫的 500 天》中为什么 Summer 最终没有和 Tom 在一起?

    好的电影总是需要仔细赏味几次,每次也都会有不同的收获.就像我钟爱的[500 days of summer]. 彪悍的大胡子导演MarcWebb实在是太有趣,把自己的亲身经历搬上大荧幕,因为" ...

  5. 推荐系统--隐语义模型LFM

    主要介绍 隐语义模型 LFM(latent factor model). 隐语义模型最早在文本挖掘领域被提出,用于找到文本的隐含语义,相关名词有 LSI.pLSA.LDA 等.在推荐领域,隐语义模型也 ...

  6. 记php封装app 广告植入问题

    <meta http-equiv="X-Frame-Options" content="DENY"> <script type="t ...

  7. 一个简单的爬取b站up下所有视频的所有评论信息的爬虫

    心血来潮搞了一个简单的爬虫,主要是想知道某个人的b站账号,但是你知道,b站在搜索一个用户时,如果这个用户没有投过稿,是搜不到的,,,这时就只能想方法搞到对方的mid,,就是 space.bilibil ...

  8. Murata村田研发向左,制造向右

    前言:Murata村田自1944 年在日本京都创立,是陶瓷无源电子元件.无线连接模块和电源转换技术产品设计和制造领域的全球领导者. Murata 一直在为社会的进步和电子行业的革命贡献自己的力量. 在 ...

  9. Python神经网络编程笔记

    神经元 想一想便知道,当一个人捏你一下以至于你会痛得叫起来的力度便是神经元的阈值,而我们构建的时候也是把这种现象抽象成一个函数,叫作激活函数. 而这里便是我们使用sigmoid函数的原因,它是一个很简 ...

  10. proxyTable的配置

    在dev环境下面: proxyTable: { '/api': { target: 'http://api.douban.com/v2', //主域名,以前我都写192.168.2.57:80,这里跨 ...