JDBC

总结一下JDBC

1. 简介

JDBC 规范定义接口,具体的实现由各大数据库厂商来做

JDBC 是 Java 访问数据库的标准规范,真正怎么操作数据库还需要具体的实现类,也就是数据库驱动。每个 数据库厂商根据自家数据库的通信格式编写好自己数据库的驱动。所以我们只需要会调用 JDBC 接口中的方法即 可,数据库驱动由数据库厂商提供。

好处:

  1. 如果要开发访问数据库的程序,只需要调用 JDBC 接口中的方法即可,不用关注类是如何实现的。
  2. 使用同一套 Java 代码,进行少量的修改就可以访问其他 JDBC 支持的数据库

1.1 使用 JDBC 开发使用到的包:

说明
java.sql所有与JDBC访问数据库相关的接口和类
javax.sql数据库扩展包,提供数据库额外的功能。eg:连接池
数据库的驱动由各大数据库厂商提供,需要额外去下载,是对 JDBC 接口实现的类

1.2 JDBC 的核心 API

接口或类作用
DriverManager1) 管理和注册数据库驱动 2) 得到数据库连接对象
Connection 接口一个连接对象,可用于创建 Statement 和 PreparedStatement 对象
Statement 接口一个 SQL 语句对象,用于将 SQL 语句发送给数据库服务器。
PreparedStatemen 接口一个 SQL 语句对象,是 Statement 的子接口
ResultSet 接口用于封装数据库查询的结果集,返回给客户端 Java 程序

1.3 加载和注册驱动

加载和注册驱动的方法描述
Class.forName(数据库驱动的实现类)加载和注册数据库驱动,数据库驱动由 mysql 厂商 “com.mysql.jdbc.Driver”

com.mysql.jdbc.Driver 源代码:

public class Driver implements java.sql.Driver { 
  				public Driver() throws SQLException {
}
  
static { 
  try {
		DriverManager.registerDriver(new Driver()); //注册数据库驱动 } 
    catch (SQLException var1) {
throw new RuntimeException("Can't register driver!"); 
    }
} 
}

Tips: 注:从 JDBC3 开始,目前已经普遍使用的版本。可以不用注册驱动而直接使用。Class.forName 这句话可以省略。

2. DriverManager 类

  1. DriverManager:驱动管理对象
    * 功能:
    1. 注册驱动:告诉程序该使用哪一个数据库驱动jar
    static void registerDriver(Driver driver) :注册与给定的驱动程序 DriverManager 。
    写代码使用: Class.forName("com.mysql.jdbc.Driver");
    通过查看源码发现:在com.mysql.jdbc.Driver类中存在静态代码块
 static {
        try {
            java.sql.DriverManager.registerDriver(new Driver());
        } catch (SQLException E) {
            throw new RuntimeException("Can't register driver!");
        }
	}

注意:mysql5之后的驱动jar包可以省略注册驱动的步骤。

  1. 获取数据库连接:

    • 方法:
      static Connection getConnection(String url, String user, String password)
      * 参数:
      * url:指定连接的路径
      * 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
      * 例子:jdbc:mysql://localhost:3306/db
      * 细节:如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称
      * user:用户名
      * password:密码

2.1 DriverManager 作用:

  • 管理和注册驱动
  • 创建数据库的连接

2.2 类中 的方法

DriverManager 类中的静态方法描述
Connection getConnection (String url, String user, String password)通过连接字符串,用户名,密码来得到数据 库的连接对象
Connection getConnection (String url, Properties info)通过连接字符串,属性对象来得到连接对象

2.3 使用JDBC连接数据库的参数

使用 JDBC 连接数据库的四个参数说明
用户名登录的用户名
密码登录的密码
连接字符串URL不同的数据库 URL 是不同的,mysql 的写法 jdbc:mysql://localhost:3306/数据库[?参数名=参数值]
驱动类的字符串名com.mysql.jdbc.Driver

2.4 连接数据库的URL地址格式

协议名**:子协议😕/服务器名或IP地址:端口号/数据库名?参数=**参数值

MySQL 中可以简写:

jdbc:mysql:///数据库名

前提:必须是本地服务器,端口号是 3306

2.5 得到 MySQL 的数据库连接对象

2.5.1 使用用户名、密码、URL得到连接对象
package cn.learn.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

/**
 * @program: xu_jdbc
 * @description: JDBC快速入门
 * @author: Mr.Luo
 * @create: 2020-02-01 10:39
 */
public class JdbcDemo1 {
    public static void main(String[] args) throws Exception {
        //1. 导入驱动jar包
        //2. 注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //3.获取数据库连接对象
        Connection conn = DriverManager.getConnection("jdbc:mysql://IP:3306/test?useUnicode=true&characterEncoding=utf8", "jdbc", "jdbc");
        //4.定义sql语句
        String sql = "update jdbct set name='Kity2' where id=2";
        String sql2 = "insert jdbct values (1,'张三'),(2,'李四')";
        //5.获取执行sql语句的对象
        Statement stmt = conn.createStatement();
        //6.执行sql
        int count = stmt.executeUpdate(sql2);
        //7.处理结果
        System.out.println(count);
        //8.释放资源
        stmt.close();
        conn.close();

    }
}

2.5.2 使用属性文件和url得到连接对象
package cn.learn.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

/**
 * @program: xu_jdbc
 * @description: 使用属性文件和url得到连接对象
 * @author: Mr.Luo
 * @create: 2020-02-01 15:24
 */
public class Demo2 {
    public static void main(String[] args) throws Exception {
        //URL连接字符串
        String url = "jdbc:mysql://IP:3306/test?useUnicode=true&characterEncoding=utf8";
        //属性对象
        Properties info = new Properties();
        //把用户名和密码放在info对象中
        info.setProperty("user","jdbc");
        info.setProperty("password","jdbc");

        Connection conn = DriverManager.getConnection(url, info);
        //com.mysql.jdbc.JDBC4Connection@6ad5c04e
        System.out.println(conn);

    }
}

3. Connection接口

作用:Connection 接口,具体的实现类由数据库的厂商实现,代表一个连接对象。

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

3.1 Connection方法

Connection接口中的方法描述
Statement createStatement()创建一条SQL语句对象

4. Statement接口

Statement:执行sql的对象

  1. 执行sql
  • boolean execute(String sql) :可以执行任意的sql 了解
  • int executeUpdate(String sql) :执行DML(insert、update、delete)语句、DDL(create,alter、drop)语句
  • 返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功 返回值>0,则执行成功,反之,则失败。
  1. ResultSet executeQuery(String sql) :执行DQL(select)语句

4.1 JDBC访问数据库的步骤

  • 注册和加载驱动(可以省略)
  • 获取连接
  • Connection 获取 Statement 对象
  • 使用 Statement 对象执行 SQL 语句
  • 返回结果集
  • 释放资源

4.2 Statement作用

代表一条语句对象,用于发送 SQL 语句给服务器,用于执行静态 SQL 语句并返回它所生成结果的对象。

4.3 Statement中的方法

Statement 接口中的方法描述
int executeUpdate(String sql)用于发送 DML 语句,增删改的操作,insert、update、delete
参数:SQL 语句
返回值:返回对数据库影响的行数
ResultSet executeQuery(String sql)用于发送 DQL 语句,执行查询的操作。
select 参数:SQL 语句
返回值:查询的结果集

4.4 释放资源

  • 需要释放的对象:ResultSet 结果集,Statement 语句,Connection 连接
  • 释放原则:先开的后关,后开的先关。ResultSet -> Statement -> Connection
  • 放在哪个代码块中:finally 块

4.5 执行DDL操作

package cn.learn.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * @program: xu_jdbc
 * @description: 使用JDBC在MySQL中创建一张学生表
 * @author: Mr.Luo
 * @create: 2020-02-01 16:19
 */
public class Demo3DDL {
    public static void main(String[] args) {
        //1.创建连接
        Connection conn = null;
        Statement statement = null;
        try {
            conn = DriverManager.getConnection("jdbc:mysql://IP:3306/test?useUnicode=true&characterEncoding=utf8","jdbc","jdbc");
            //2.通过连接对象得到语句对象
            statement = conn.createStatement();
            //3.通过语句对象发送SQL语句给服务器
            //4.执行SQL
            statement.executeUpdate("create table student (id int primary key auto_increment," +
                    "name varchar(20) not null , gender char(2))");
            //5.返回影响行数(DDL没有哦返回值)
            System.out.println("创建学生表成功!");
        } catch (Exception e){
            e.printStackTrace();
        }
        //6.释放资源
        finally {
            //关闭之前要先判断
          //避免空指针异常
            if (statement != null){
                try {
                    statement.close();
                } catch (SQLException e){
                    e.printStackTrace();
                }
            }
            if (conn != null){
                try {
                    conn.close();
                } catch (SQLException e){
                    e.printStackTrace();
                }
            }

        }
    }
}

4.6 执行DML操作

向student表中添加两条记录,主键是自动增长

package cn.learn.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * @program: xu_jdbc
 * @description: 执行DML操作,向学生表中插入数据
 * @author: Mr.Luo
 * @create: 2020-02-01 16:49
 */
public class Demo4DML {
    public static void main(String[] args) throws SQLException {
        //1.创建连接对象
        Connection conn = DriverManager.getConnection("jdbc:mysql://IP:3306/test?useUnicode=true&characterEncoding=utf8","jdbc","jdbc");
        //2.创建Statement语句对象
        Statement statement = conn.createStatement();
        //3.执行SQL语句
        String sql = "insert into student values (null,'赵丽颖','女'), (null,'冯绍峰', '男')";
        int count = statement.executeUpdate(sql);
        System.out.println(count);
        //4.释放资源
        statement.close();
        conn.close();
    }
}

4,7 执行DQL操作

4.7.1 ResultSet 接口:

作用:封装数据库查询的结果集,对结果集进行遍历,取出每一条记录。

接口中的方法:

ResultSet 接口中的方法描述
boolean next()1) 游标向下移动 1 行
2) 返回 boolean 类型,如果还有下一条记录,返回 true,否则返回 false
数据类型 getXxx()1) 通过字段名,参数是 String 类型。返回不同的类型
2) 通过列号,参数是整数,从 1 开始。返回不同的类型
4.7.2 常用数据类型转换表
SQL 类型Jdbc 对应方法返回类型
BIT(1) bit(n)getBoolean()boolean
TINYINTgetByte()byte
SMALLINTgetShort()short
INTgetInt()int
BIGINTgetLong()long
CHAR,VARCHARgetString()String
Text(Clob) BlobgetClob getBlob()Clob Blob
DATEgetDate()java.sql.Date 只代表日期
TIMEgetTime()java.sql.Time 只表示时间
TIMESTAMPgetTimestamp()java.sql.Timestamp 同时有日期和时间

java.sql.Date、Time、Timestamp(时间戳),三个共同父类是:java.util.Date

package cn.learn.jdbc;

import java.sql.*;

/**
 * @program: xu_jdbc
 * @description: 执行DQL操作,查询所有学生的信息
 * @author: Mr.Luo
 * @create: 2020-02-01 16:58
 */
public class Demo5DQL {
    public static void main(String[] args) throws SQLException {
        //1.得到连接对象
        Connection conn = DriverManager.getConnection("jdbc:mysql://IP:3306/test?useUnicode=true&characterEncoding=utf8","jdbc","jdbc");
        //2.得到语句对象
        Statement statement = conn.createStatement();
        //3.执行SQL语句得到结果集ResultSet对象
        ResultSet rs = statement.executeQuery("select * from student");
        //4.循环遍历取出每一条记录
        while (rs.next()){
            int id = rs.getInt("id");
            String name = rs.getString("name");
            String gender = rs.getString("gender");
            //5.输出到控制台上
            System.out.println("编号:"+id + ", 姓名:" +name + ", 性别:"+gender);
        }
        //5.关闭资源
        rs.close();
        statement.close();
        conn.close();

    }
}

关于 ResultSet 接口中的注意事项:

  1. 如果光标在第一行之前,使用 rs.getXX()获取列值,报错:Before start of result set
  2. 如果光标在最后一行之后,使用 rs.getXX()获取列值,报错:After end of result set
  3. 使用完毕以后要关闭结果集 ResultSet,再关闭 Statement,再关闭 Connection

5.PreparedStatement:执行sql的对象

预先编译sql,用户输入的内容,只是参数的一部分,而不作为sql语句进行编译

  1. SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性问题
    1. 输入用户随便,输入密码:a’ or ‘a’ = 'a
    2. sql:select * from user where username = ‘fhdsjkf’ and password = ‘a’ or ‘a’ = ‘a’

     2. 解决sql注入问题:使用PreparedStatement对象来解决
     3. 预编译的SQL:参数使用?作为占位符
     4. 步骤:
     	1. 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar
     	2. 注册驱动
     	3. 获取数据库连接对象 Connection
     	4. 定义sql
     		* 注意:sql的参数使用?作为占位符。 如:select * from user where username = ? and password = ?;
     	5. 获取执行sql语句的对象 PreparedStatement  Connection.prepareStatement(String sql) 
     	6. 给?赋值:
     		* 方法: setXxx(参数1,参数2)    SetString(1,"Kitty")
     			* 参数1:?的位置编号 从1 开始
     			* 参数2:?的值
     	7. 执行sql,接受返回结果,不需要传递sql语句
     	8. 处理结果
     	9. 释放资源
    
     5. 注意:后期都会使用PreparedStatement来完成增删改查的所有操作
     	1. 可以防止SQL注入
     	2. 效率更高
    

性能优势: 使用PreparedStatement,SQL语句会预编译在数据库系统中。执行计划会被缓存起来,它允许数据库做参数化查询。

使用预处理语句比普通的查询更快,因为它做的工作更少(数据库对SQL语句的分析,编译,优化已经在第一次查询前完成了)。为了减少数据库的负载,JDBC代码应使用PreparedStatement 。

值得注意的一点是:为了获得性能上的优势,应该使用参数化sql查询而不是字符串追加的方式。

eg:

# 并没有性能上的优势
PreparedStatement ps = conn.prepareStatement("select * from student where id="+text);
# 有性能上的优势
PreparedStatement ps = conn.prepareStatement("select * from student where id=?");
ps.SetString(1,text);

6. 数据库工具类JdbcUtils

如果一个功能经常要用到,我们建议把这个功能做成一个工具类,可以在不同的地方重用。

package cn.learn.jdbc;

import java.sql.*;

/**
 * @program: xu_jdbc
 * @description: 工具类
 * @author: Mr.Luo
 * @create: 2020-02-01 21:07
 */
public class JdbcUtil {
    //可以把几个字符串定义成常量:用户名,密码,URL,驱动类
    private static final String USER = "jdbc";
    private static final String PWD = "jdbc";
    private static final String URL = "jdbc:mysql://IP:3306/test?useUnicode=true&characterEncoding=utf8";
    private static final String DRIVER = "com.mysql.jdbc.Driver";

    //注册驱动
    static {
        try {
            Class.forName(DRIVER);
        } catch (ClassNotFoundException e){
            e.printStackTrace();
        }
    }

    //得到数据库的连接
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(URL,USER,PWD);
    }
    //关闭所有打开的资源
    public static void close(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();
                }
            }
    }
    //关闭所有打开的资源
    public static void close(Connection conn, Statement stmt, ResultSet rs){
        if (rs != null){
            try {
                rs.close();
            }catch (SQLException e){
                e.printStackTrace();
            }
        }
        close(conn, stmt);
    }


}

7. JDBC事务的处理

银行转账事务

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

API:

Connection 接口中与事务有关的方法说明
void setAutoCommit(boolean autoCommit)参数是 true 或 false
如果设置为 false,表示关闭自动提交,相当于开启事务
void commit()提交事务
void rollback()回滚事务

步骤:

    1. 获取连接
    1. 开启事务
    1. 获取到 PreparedStatement
    1. 使用 PreparedStatement 执行两次更新操作
    1. 正常情况下提交事务
    1. 出现异常回滚事务
    1. 最后关闭资源
package cn.learn.jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
 * @program: xu_jdbc
 * @description: 事务-银行转账
 * @author: Mr.Luo
 * @create: 2020-02-01 21:05
 */
public class Demo6Transaction {
    public static void main(String[] args) throws SQLException {
        没有异常,提交事务,出现异常回滚事务
        //1) 注册驱动
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            //2)获取练级诶
            conn = JdbcUtil.getConnection();
            //3)开启事务
            conn.setAutoCommit(false);
            //4)获取PreparedStatement对象
            ps = conn.prepareStatement("update account set balance = balance - ? where name=?");
            ps.setInt(1,100);
            ps.setString(2,"Bob");
            ps.executeUpdate();

            //出现异常
//            System.out.println(1/0);

            //给Kitty加钱
            ps = conn.prepareStatement("update account set balance = balance + ? where name=?");
            ps.setInt(1,100);
            ps.setString(2,"Kitty");
            ps.executeUpdate();

            //提交事务
            conn.commit();
            System.out.println("转账成功!");
        }catch (Exception e){
            e.printStackTrace();
            try{
                //事务的回滚
                conn.rollback();
            }catch (Exception e2){
                e2.printStackTrace();
            System.out.println("转账失败!");
        }finally {
            JdbcUtil.close(conn,ps);
        }

    }
}

8.数据库连接池

  • 其实就是一个容器(集合),存放数据库连接的容器。
  • 当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。
  • 好处:
    1. 节约资源
    2. 用户访问高效
  • 实现:
    1. 标准接口:DataSource javax.sql包下的
    2. 方法:
      • 获取连接:getConnection()
      • 归还连接:Connection.close()。如果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法,则不会再关闭连接了。而是归还连接
    3. 一般我们不去实现它,有数据库厂商来实现
      1. C3P0:数据库连接池技术
      2. Druid:数据库连接池实现技术,由阿里巴巴提供的
  • C3P0:数据库连接池技术
    • 步骤:
    1. 导入jar包 (两个) c3p0-0.9.5.2.jar 和 mchange-commons-java-0.2.12.jar ,
      不要忘记导入数据库驱动jar包
    2. 定义配置文件:
      • 名称: c3p0.properties 或者 c3p0-config.xml
      • 路径:直接将文件放在src目录下即可。
    3. 创建核心对象 数据库连接池对象 ComboPooledDataSource
    4. 获取连接: getConnection
package datasource.c3p0;
 
import com.mchange.v2.c3p0.ComboPooledDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;> 
/**
 * @program: xu_jdbc
 * @description: c3p0演示
 * @author: Mr.Luo
 * @create: 2020-02-01 22:30
 */
public class C3P0Demo1 {
    public static void main(String[] args) throws SQLException {
       //不要忘记导入数据库的驱动jar包
        //1.创建数据库连接池对象
        DataSource ds = new ComboPooledDataSource();
        //2.获取连接对象
        Connection conn = ds.getConnection();

        //3.打印连接对象
        System.out.println(conn);
    }
}

  • Druid:数据库连接池实现技术,由阿里提供
    1. 步骤:
      1. 导入jar包 druid-1.0.9.jar
      2. 定义配置文件:
        • 是properties形式的
        • 可以叫任意名称,可以放在任意目录下
      3. 加载配置文件。Properties
      4. 获取数据库连接池对象:通过工厂来来获取 DruidDataSourceFactory
      5. 获取连接:getConnection
package datasource.druid;

import com.alibaba.druid.pool.DruidDataSourceFactory;

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

/**
 * @program: xu_jdbc
 * @description: Droid演示
 * @author: Mr.Luo
 * @create: 2020-02-01 22:44
 */
public class DruidDemo {
    public static void main(String[] args) throws Exception {
        //1.导入jar包
        //2.定义配置文件
        //3.加载配置文件
        Properties pro = new Properties();
        InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
        pro.load(is);

        //4.获取连接池对象
        DataSource ds = DruidDataSourceFactory.createDataSource(pro);

        //5.获取连接
        Connection conn = ds.getConnection();
        System.out.println(conn);
    }
}

  • 定义工具类
  1. 定义一个类 JDBCUtils
  2. 提供静态代码块加载配置文件,初始化连接池对象
  3. 提供方法
    1. 获取连接方法:通过数据库连接池获取连接
    2. 释放资源
    3. 获取连接池的方法
package datasource.utils;

import com.alibaba.druid.pool.DruidDataSourceFactory;

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

/**
 * @program: xu_jdbc
 * @description: Druid连接池的工具类
 * @author: Mr.Luo
 * @create: 2020-02-01 23:09
 */
public class JDBCUtils {
    //1.定义成员变量DataSource
    private static DataSource ds;

    static {
        try {
            //1.加载配置文件
            Properties pro = new Properties();
            pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
            //2.获取DataSource
            ds = DruidDataSourceFactory.createDataSource(pro);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

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

    //释放资源
    public static void close(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();
            }
        }
    }

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

        close(conn,stmt);
    }

    //获取连接池的方法
    public static DataSource getDataSource(){
        return ds;
    }
}

package datasource.utils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
 * @program: xu_jdbc
 * @description: 使用工具类
 * @author: Mr.Luo
 * @create: 2020-02-01 23:22
 */
public class DruidDemo {
    public static void main(String[] args) {
        //给account表增加一条记录
        Connection conn = null;
        PreparedStatement ps = null;
        try{
            //1.获取连接
            conn = JDBCUtils.getConnection();
            //2.定义sql
            String sql = "insert into account values(null,?,?)";
            //3.ps
            ps = conn.prepareStatement(sql);
            //4.给问号赋值
            ps.setString(1,"杨幂");
            ps.setInt(2, 1000);
            //5.执行sql
            int count = ps.executeUpdate();
            System.out.println(count);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtils.close(conn,ps);
        }
    }

}

9. Spring JDBC

  • Spring框架对JDBC的简单封装。提供了一个JDBCTemplate对象简化JDBC的开发

  • 步骤:

    1. 导入jar包
    2. 创建JdbcTemplate对象。依赖于数据源DataSource
  • JdbcTemplate template = new JdbcTemplate(ds);

    1. 调用JdbcTemplate的方法来完成CRUD的操作
      • update():执行DML语句。增、删、改语句

      • queryForMap():查询结果将结果集封装为map集合,将列名作为key,将值作为value 将这条记录封装为一个map集合

        注意:这个方法查询的结果集长度只能是1

      • queryForList():查询结果将结果集封装为list集合

        • 注意:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中
      • query():查询结果,将结果封装为JavaBean对象

        • query的参数:RowMapper
          • 一般我们使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装
          • new BeanPropertyRowMapper<类型>(类型.class)
      • queryForObject:查询结果,将结果封装为对象

        • 一般用于聚合函数的查询

        • template.queryForObject(sql,返回值类型.class)

        • String sql = "select count(id) from student";
          Long total = template.queryForObject(sql,Long.class);
          System.out.println(total);
          
package jdbctemplate;

import datasource.utils.JDBCUtils;
import org.springframework.jdbc.core.JdbcTemplate;

/**
 * @program: xu_jdbc
 * @description: JDBC Template 1
 * @author: Mr.Luo
 * @create: 2020-02-01 23:46
 */
public class JdbcTemplateDemo1 {
    public static void main(String[] args) {
        //1.导入jar包,依赖于连接池,数据库驱动的包
        //2.创建JDBCTemplate对象
        JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
        //3.调用方法
        String sql = "update account set balance = 10000 where id=?";
        int count = template.update(sql, 1);
        System.out.println(count);

    }

}
//剩下的归还连接等操作,已经自动完成
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值