##  详解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、抽取方法释放资源

最新文章

  1. nodejs net模块
  2. c++顺序表基本功能
  3. div垂直居中
  4. PeopleSoft Rich Text Boxes上定制Tool Bars
  5. Elasticsearch 管理文档
  6. ART、JIT、AOT、Dalvik之间的关系
  7. EmguCV+Win7+Visual C# 2012 配置
  8. 原生JavaScript实现mouseenter
  9. lshw 命令(查看硬件信息)
  10. 【elasticsearch】(1)centos7 使用yum安装elasticsearch 2.X
  11. Android内的生命周期整理
  12. Linux 安装java
  13. android ids.xml资源的使用
  14. 不用派生CTreeCtrl不用繁琐的过程 教你如何让CTreeCtrl的每一项有ToolTip提示
  15. JavaScript实现div宽、高自动缓慢拉伸
  16. 走进javascript——解开switch之谜
  17. spring quartz开发中使用demo
  18. Vue阻止冒泡
  19. Python_替换当前目录下文件类型
  20. Education CodeForces Round 63 Div.2

热门文章

  1. Allenmind's Blog
  2. Python知识点汇总
  3. C++走向远洋——61(项目一、排序函数模板)
  4. python2.7.6安装easy_install (windows 64 环境)
  5. py基础之无序列表
  6. Error : Failed to get convolution algorithm. This is probably because cuDNN failed to initialize
  7. 读《Java并发编程的艺术》学习笔记(二)
  8. 关于使用map存放数据乱序”问题“
  9. elasticjob学习二:封装elasticjob-spring-boot-starter
  10. 在Linux上查询物理机信息-不用去拆机器了