总结一下JDBC
1. 简介
JDBC 规范定义接口,具体的实现由各大数据库厂商来做
JDBC 是 Java 访问数据库的标准规范,真正怎么操作数据库还需要具体的实现类,也就是数据库驱动。每个 数据库厂商根据自家数据库的通信格式编写好自己数据库的驱动。所以我们只需要会调用 JDBC 接口中的方法即 可,数据库驱动由数据库厂商提供。
好处:
- 如果要开发访问数据库的程序,只需要调用 JDBC 接口中的方法即可,不用关注类是如何实现的。
- 使用同一套 Java 代码,进行少量的修改就可以访问其他 JDBC 支持的数据库
1.1 使用 JDBC 开发使用到的包:
包 | 说明 |
---|---|
java.sql | 所有与JDBC访问数据库相关的接口和类 |
javax.sql | 数据库扩展包,提供数据库额外的功能。eg:连接池 |
数据库的驱动 | 由各大数据库厂商提供,需要额外去下载,是对 JDBC 接口实现的类 |
1.2 JDBC 的核心 API
接口或类 | 作用 |
---|---|
DriverManager 类 | 1) 管理和注册数据库驱动 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 类
- 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包可以省略注册驱动的步骤。
-
获取数据库连接:
- 方法:
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 接口,具体的实现类由数据库的厂商实现,代表一个连接对象。
- 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的对象
- 执行sql
- boolean execute(String sql) :可以执行任意的sql 了解
- int executeUpdate(String sql) :执行DML(insert、update、delete)语句、DDL(create,alter、drop)语句
- 返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功 返回值>0,则执行成功,反之,则失败。
- 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 |
TINYINT | getByte() | byte |
SMALLINT | getShort() | short |
INT | getInt() | int |
BIGINT | getLong() | long |
CHAR,VARCHAR | getString() | String |
Text(Clob) Blob | getClob getBlob() | Clob Blob |
DATE | getDate() | java.sql.Date 只代表日期 |
TIME | getTime() | java.sql.Time 只表示时间 |
TIMESTAMP | getTimestamp() | 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 接口中的注意事项:
- 如果光标在第一行之前,使用 rs.getXX()获取列值,报错:Before start of result set
- 如果光标在最后一行之后,使用 rs.getXX()获取列值,报错:After end of result set
- 使用完毕以后要关闭结果集 ResultSet,再关闭 Statement,再关闭 Connection
5.PreparedStatement:执行sql的对象
预先编译sql,用户输入的内容,只是参数的一部分,而不作为sql语句进行编译
-
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() | 回滚事务 |
步骤:
- 获取连接
- 开启事务
- 获取到 PreparedStatement
- 使用 PreparedStatement 执行两次更新操作
- 正常情况下提交事务
- 出现异常回滚事务
- 最后关闭资源
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.数据库连接池
- 其实就是一个容器(集合),存放数据库连接的容器。
- 当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。
- 好处:
- 节约资源
- 用户访问高效
- 实现:
- 标准接口:DataSource javax.sql包下的
- 方法:
- 获取连接:getConnection()
- 归还连接:Connection.close()。如果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法,则不会再关闭连接了。而是归还连接
- 一般我们不去实现它,有数据库厂商来实现
1. C3P0:数据库连接池技术
2. Druid:数据库连接池实现技术,由阿里巴巴提供的
- C3P0:数据库连接池技术
- 步骤:
- 导入jar包 (两个) c3p0-0.9.5.2.jar 和 mchange-commons-java-0.2.12.jar ,
不要忘记导入数据库驱动jar包 - 定义配置文件:
- 名称: c3p0.properties 或者 c3p0-config.xml
- 路径:直接将文件放在src目录下即可。
- 创建核心对象 数据库连接池对象 ComboPooledDataSource
- 获取连接: 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:数据库连接池实现技术,由阿里提供
- 步骤:
- 导入jar包 druid-1.0.9.jar
- 定义配置文件:
- 是properties形式的
- 可以叫任意名称,可以放在任意目录下
- 加载配置文件。Properties
- 获取数据库连接池对象:通过工厂来来获取 DruidDataSourceFactory
- 获取连接: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);
}
}
- 定义工具类
- 定义一个类 JDBCUtils
- 提供静态代码块加载配置文件,初始化连接池对象
- 提供方法
- 获取连接方法:通过数据库连接池获取连接
- 释放资源
- 获取连接池的方法
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的开发
-
步骤:
- 导入jar包
- 创建JdbcTemplate对象。依赖于数据源DataSource
-
JdbcTemplate template = new JdbcTemplate(ds);
- 调用JdbcTemplate的方法来完成CRUD的操作
-
update():执行DML语句。增、删、改语句
-
queryForMap():查询结果将结果集封装为map集合,将列名作为key,将值作为value 将这条记录封装为一个map集合
注意:这个方法查询的结果集长度只能是1
-
queryForList():查询结果将结果集封装为list集合
- 注意:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中
-
query():查询结果,将结果封装为JavaBean对象
- query的参数:RowMapper
- 一般我们使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装
- new BeanPropertyRowMapper<类型>(类型.class)
- query的参数:RowMapper
-
queryForObject:查询结果,将结果封装为对象
-
一般用于聚合函数的查询
-
template.queryForObject(sql,返回值类型.class)
-
String sql = "select count(id) from student"; Long total = template.queryForObject(sql,Long.class); System.out.println(total);
-
-
- 调用JdbcTemplate的方法来完成CRUD的操作
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);
}
}
//剩下的归还连接等操作,已经自动完成