- JDBC

* 概念:定义了一套操作所有关系型数据库的规则,即接口;

* 快速入门:

  1. 导入驱动jar包
  2. 注册驱动
  3. 获取数据库连接对象
  4. 定义sql
  5. 获取执行sql语句的对象Statement
  6. 执行sq,接受返回结果
  7. 处理结果
  8. 释放资源
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//1.导入驱动jar包
//2.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//3.获取数据库连接对象
Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/day17","root","");
//4.定义sql语句
String sql="update user set username='张三' where id=1";
//5.获取执行sql对象Statement
Statement stmt=con.createStatement();
//6.执行sql
int count=stmt.executeUpdate(sql);
//7.处理结果
System.out.println(count);
//8.释放资源
stmt.close();
con.close();

- 详解对象

  1. DriverManager:驱动管理对象

    • 功能:
      1. 注册驱动:static void registerDriver(Driver driver):注册与给定的驱动程序DriverManager
      2. 获取数据库连接:static Connection getConnection(String url,String user,String password)
        • url:jdbc:mysql://ip地址(域名):端口号/数据库名称
        • user:登陆账户名,password:登陆密码
  2. Connection:数据库连接对象

    • 功能:
      1. 获取执行sql对象
        • Statement createStatement()
        • PreparedStatement prepareStatement(String sql);
      2. 管理事务:
        • 开启事务:setAutoCommit(boolean autoCommit):调用该方法设置参数为false,即开启事务
        • 提交事务:commit()
        • 回滚事务:rollback()
  3. Statement:执行SQL的对象

    • 功能:
      1. 执行sql
        • boolean execute(String sql):可以执行任意的sql;
        • int executeUpdate(String sql):执行DML(insert,update,delete)语句,DDL(create,alter,drop)语句;通过返回值返回的行数是否大于0,判断语句是否执行成功
        • ResultSet extcuteQuery():执行DQL(select)语句
    1
    2
    3
    4
    5
    6
    7
    8
    # 创建资源加载的配置文件jdbc.properties
    #驱动名
    driverClassName=com.mysql.jdbc.Driver
    #数据库地址
    url=jdbc:mysql:///day17
    #登录名和密码
    username=root
    password=123
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    //创建数据库工具类JDBCUtils
    import java.io.FileReader;
    import java.io.IOException;
    import java.sql.*;
    import java.util.Properties;

    public class jdbcutils {
    private static String url;
    private static String user;
    private static String password;
    private static String driver;
    /*
    * 通过静态代码块加载配置文件
    */
    static {
    try {
    //1.读取资源文件
    Properties pro=new Properties();
    //2.加载文件
    pro.load(new FileReader("./jdbc.properties"));
    //3.获取数据,赋值
    url=pro.getProperty("url");
    user=pro.getProperty("user");
    password=pro.getProperty("password");
    driver=pro.getProperty("driver");
    //4.注册驱动
    Class.forName(driver);
    } catch (IOException | ClassNotFoundException e) {
    e.printStackTrace();
    }

    }
    public static Connection getConnection() throws SQLException {
    return DriverManager.getConnection(url,user,password);
    }

    /**
    *释放资源
    */
    public static void close(Statement stmt,Connection conn){
    if(stmt!=null){
    try{
    stmt.close();
    }catch (SQLException e){
    e.printStackTrace();
    }
    }
    if(conn!=null){
    try{
    conn.close();
    }catch (SQLException e){
    e.printStackTrace();
    }
    }
    }
    /**
    *释放资源
    */
    public static void close(Statement stmt, Connection conn, ResultSet rs){
    if(stmt!=null){
    try{
    stmt.close();
    }catch (SQLException e){
    e.printStackTrace();
    }
    }
    if(conn!=null){
    try{
    conn.close();
    }catch (SQLException e){
    e.printStackTrace();
    }
    }
    if(rs!=null){
    try{
    rs.close();
    }catch (SQLException e){
    e.printStackTrace();
    }
    }

    }
    }
  4. ResultSet:结果集对象

    • 功能:
      1. next():游标向下移动一行
      2. getInt/getString(参数):获取数据
        • int 代表编号,从1开始。如:getInt(1);获取当前行的第一列数据;
        • String:代表列名称。如:getString(“id”);获取当前行的指定键值对应的数据;
  5. PreparedStatement:执行sql的对象(解决sql注入问题)

    1. SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接,会造成安全性问题

      • 如:用户随便输入账号,密码使用‘a’ or ‘a’=‘a’
      • select * from user where username=‘sdsds’ and password=‘a’ or ‘a’=‘a’;
    2. 解决sql注入问题:使用PreparedStatement对象来解决

    3. 预编译的SQL:参数使用?作为占位符。如select * from username=? and password=?;

    4. 步骤:

      • 导入驱动jar包

      • 注册驱动

      • 获取数据库连接对象Connection

      • 定义sql:参数使用?作为占位符。如select * from username=? and password=?;

      • 获取执行sql语句对象PreparedStatement Connection.prepareStatement(String sql)

      • 给?赋值:setxxx(参数1,参数2)

      • 执行sql,接受返回结果

      • 处理结果

      • 释放资源

- JDBC控制事务

* 事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这个步骤要么同时成功,要不同时失败。

* 操作:

  1. 开启事务:setAutoCommit(boolean autoCommit):调用该方法设置参数为flase,即开启事务
    • 在执行sql之前开启事务
  2. 提交事务:commit()
    • 当所有sql都执行完提交事务
  3. 回滚操作:rollback()
    • 在catch中回滚事务

- 数据库连接池

* 概念:其实就是一个容器(集合),存放数据库连接的容器;当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器,达到对象复用的目的。

* 实现:

  1. 标准接口:DataSource javax.sql包下的
    • 获取连接:getConnection()
    • 归还连接:close()方法;
  2. 一般不自己去实现它,由数据库厂商实现
    • C3P0:数据库连接池技术
    • Druid:数据库连接池实现技术,由阿里巴巴提供(最常用)

- C3P0实现数据库连接池

* 步骤:

  1. 导入jar包(两个)c3p0-0.9.5.0.jar machange-commons-java-0.2.12.jar
  2. 定义配置文件
    • 名称:c3p0.properties或者c3p0-config.xml
    • 路径:直接将文件放在src目录下即可
  3. 创建核心对象:数据库连接池对象 ComboPooledDataSource
  4. 获取连接:getConnection

- druid实现数据库连接池

* 步骤:

  1. 导入jar包 druid-1.0.9.jar

  2. 定义配置文件:

    • 是properties形式的

      1
      2
      3
      4
      5
      6
      7
      8
      9
      driverClassName=com.mysql.jdbc.Driver
      url=jdbc:mysql:///day17
      username=root
      #连接池初始化连接数
      initialSize=5
      #最大连接数
      maxActive=10
      #等待时间
      maxWait=3000
    • 可以叫任意名称,可以放在任意目录下

  3. 加载配置文件。Properties

  4. 获取数据库连接池对象:通过工厂来获取 DruidDataSourceFactory

  5. 获取连接:getConnection

* 定义工具类

  1. 定义一个类JDBCUtils
  2. 提供静态代码块加载配置文件,初始化连接池对象
  3. 提供方法
    • 获取连接方法:通过数据库连接池对象获取
    • 释放资源
    • 获取连接池的方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
package util;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/**
* JDBC工具类 使用Durid连接池
*/
public class JDBCUtils {

private static DataSource ds ;

static {

try {
//1.加载配置文件
Properties pro = new Properties();
//使用ClassLoader加载配置文件,获取字节输入流
InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
pro.load(is);

//2.初始化连接池对象
ds = DruidDataSourceFactory.createDataSource(pro);

} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}

/**
* 获取连接池对象
*/
public static DataSource getDataSource(){
return ds;
}


/**
* 获取连接Connection对象
*/
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}

/**
* 释放资源
*/
public static void close(Statement stmt,Connection conn){
close(null,stmt,conn);
}

public static void close(ResultSet rs,Statement stmt, Connection conn){
if(stmt!=null) {
try {
stmt.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(conn!=null) {
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(rs!=null) {
try {
rs.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}

- Spring JDBC:JDBC Template

* 概念:Spring 框架对JDBC的简单封装

* 步骤:

  1. 导入jar包:

    • commons-logging-1.1.1.jar
    • spring-beans-4.2.4.RELEASE.jar
    • spring-core-4.2.4.RELEASE.jar
    • spring-jdbc-4.2.4.RELEASE.jar
    • spring-tx-4.2.4.RELEASE.jar
  2. 创建JdbcTemplate对象,依赖于数据源DataSource

    • JdbcTemplate template=new JdbcTemplate(ds)
  3. 调用JdbcTemplate的方法来完成CRUD的操作

    • updata():执行DML语句。增,删,改语句
    • queryForMap():查询结果集封装到map集合中,将列名作为key,将值作为value,将这条记录封装为一个map集合,这个方法查询到的结果集长度只能是1
    • querForList():查询结果集封装到list集合中,将每一条记录封装为一个集合,再将Map集合装载到List集合中
    • query():查询结果,将结果封装到JavaBean对象,
      • 一般我们使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装
      • new BeanPropertyRowMapper<类型>(Emp.class)
    • queryForObject:查询结果,将结果封装成对象
      • 一般用于聚合函数的查询