JDBC
Posted 第七天堂
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDBC相关的知识,希望对你有一定的参考价值。
JDBC 就是用 JAVA 语言操作关系型数据库的一套 API
全称:(Java DataBase Connectivity) Java 数据库连接
快速入门
写 JDBC 前需导入驱动 jar 包(以 mysql 数据库为例)
//注册驱动(mysql5 之后的版本此步可省略)
Class.forName("com.mysq.jdbc.Driver");
//获取连接,Java代码需要发送SQL给MySQL服务端,就需要先建立连接
Connection conn = DriverManager.getConnection(url, username, password);
//定义SQL语句
String sql = “update…” ;
//获取执行SQL对象,执行SQL语句需要SQL执行对象,而这个执行对象就是Statement对象
Statement stmt = conn.createStatement();
//执行SQL
stmt.executeUpdate(sql);
//处理结果
...;
//释放资源
stmt.close();
conn.close();
API 详解
1.DriverManager
-
注册驱动
DriverManager.registerDrever();
Class.forName() 底层便是通过调用该方法来实现驱动的注册
-
获取数据库连接
static Connection getConnection(String url, String user, String password) 尝试建立与给定数据库URL的连接 参数说明:
-
url : 连接路径
语法:jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2…
示例:jdbc:mysql://127.0.0.1:3306/db1
细节:
-
如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称?参数键值对
-
配置 useSSL=false 参数,禁用安全连接方式,解决警告提示
-
-
user :用户名
-
poassword :密码
-
2.Connection
作用:获取执行 SQL 的对象,管理事务
-
获取执行对象
-
普通执行SQL对象
Statement createStatement()
快速入门中就是通过该方法获取的执行对象
-
预编译SQL的执行SQL对象:防止SQL注入
PreparedStatement prepareStatement(sql)
通过这种方式获取的
PreparedStatement
SQL语句执行对象可以防止SQL注入 -
执行存储过程的对象
CallableStatement prepareCall(sql)
通过这种方式获取的
CallableStatement
执行对象是用来执行存储过程的
-
-
事务管理
-
开启事务
void setAutoCommit(boolean autoCommit) 将此连接的自动提交模式设置为给定状态 参与autoCommit 表示是否自动提交事务,true表示自动提交事务,false表示手动提交事务。而开启事务需要将该参数设为为false。
-
提交事务
void commit() 提交事务,并释放此 Connection对象当前持有的所有数据库锁 -
回滚事务
void rollback() 回滚事务,并释放此 Connection对象当前持有的所有数据库锁 -
例:
try // ============开启事务========== conn.setAutoCommit(false); //5. 执行sql int count1 = stmt.executeUpdate(sql1);//受影响的行数 //6. 处理结果 System.out.println(count1); int i = 3/0; //5. 执行sql int count2 = stmt.executeUpdate(sql2);//受影响的行数 //6. 处理结果 System.out.println(count2); // ============提交事务========== //程序运行到此处,说明没有出现任何问题,则需求提交事务 conn.commit(); catch (Exception e) // ============回滚事务========== //程序在出现异常时会执行到这个地方,此时就需要回滚事务 conn.rollback(); e.printStackTrace();
-
3.Statement
Statement对象的作用就是用来执行SQL语句。而针对不同类型的SQL语句使用的方法也不一样
-
执行DDL、DML语句
int executeUpdate(String sql) 执行给定的SQL语句 -
执行DQL语句
ResultSet executeQuery(String sql) 执行给定的SQL语句,返回单个ResultSet对象
4.ResultSet
作用:封装了SQL查询语句的结果
注意:使用后需释放资源
而执行了DQL语句后就会返回该对象,对应执行DQL语句的方法如下:
ResultSet executeQuery(sql);
要从 ResultSet
对象中获取我们想要的数据。ResultSet
对象提供了操作查询结果数据的方法
boolean next()
- 将光标从当前位置向前移动一行
- 判断当前行是否为有效行
xxx getXxx(参数)
xxx : 数据类型;如: int getInt(列的编号) ;String getString(列的名称)
5.PreparedStatement
作用:通过将敏感字符进行转义预防SQL注入问题
-
获取 PreparedStatement 对象
// SQL语句中的参数值,使用?占位符替代 String sql = "select * from user where username = ? and password = ?"; // 通过Connection对象获取,并传入对应的sql语句 PreparedStatement pstmt = conn.prepareStatement(sql);
-
为设置为 ? 参数赋值
PreparedStatement对象:setXxx(?的位置编号<从1 开始>,?的值);
-
执行SQL语句
executeUpdate(); 执行DDL语句和DML语句 executeQuery(); 执行DQL语句 注意:调用这两个方法时不需要传递SQL语句,因为获取SQL语句执行对象时已经对SQL语句进行预编译了。
数据库连接池
负责分配、管理数据库连接(Connection),它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
-
标准接口:DataSource
官方(SUN) 提供的数据库连接池标准接口,由第三方组织实现此接口。该接口提供了获取连接的功能:
Connection getConnection()
那么以后就不需要通过
DriverManager
对象获取Connection
对象,而是通过连接池(DataSource)获取Connection
对象。常用的数据库连接池:Druid(德鲁伊)
-
Druid连接池是阿里巴巴开源的数据库连接池项目
-
功能强大,性能优秀,是Java语言最好的数据库连接池之一
-
-
Driud使用
public static void main(String[] args) throws Exception //1.导入jar包 //2.定义配置文件 //3. 加载配置文件 Properties prop = new Properties(); prop.load(new FileInputStream("配置文件路径")); //4. 获取连接池对象 DataSource dataSource = DruidDataSourceFactory.createDataSource(prop); //5. 获取数据库连接 Connection Connection connection = dataSource.getConnection(); //获取到了连接后就可以继续做其他操作了
JDBC详解
内容:
1、JDBC介绍
2、JDBC入门
3、JDBC工具类
4、JDBC增删改查实例
5、预处理对象
6、JDBC连接池
7、DBUtils使用
8、JDBC事务
1、JDBC介绍
(1)基本概念介绍
什么是JDBC:
JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API。
JDBC是Java访问数据库的标准规范,可以为不同的关系型数据库提供统一访问,由一组用Java语言编写的接口(大部分)和类组成
什么是数据库驱动:
JDBC需要连接驱动,驱动是两个设备要进行通信,满足一定通信数据格式,数据格式由设备提供商规定,
设备提供商为设备提供驱动软件,通过软件可以与该设备进行通信。eg:mysql的驱动为mysql-connector-java-5.1.37-bin.jar
(2)JDBC与数据库驱动
JDBC与数据库驱动的关系:接口与实现的关系
Java提供访问数据库规范称为JDBC,而生产厂商提供规范的实现类称为驱动
JDBC是接口,驱动是接口的实现,没有驱动将无法完成数据库连接,从而不能操作数据库!
每个数据库厂商都需要提供自己的驱动,用来连接自己公司的数据库,也就是说驱动一般都由数据库生成厂商提供。
JDBC规范(掌握四个核心对象):
- DriverManager:用于注册驱动
- Connection: 表示与数据库创建的连接
- Statement: 操作数据库sql语句的对象
- ResultSet: 结果集或一张虚拟表
2、JDBC入门
(1)导入驱动jar包
创建lib目录,用于存放当前项目需要的所有jar包
选择jar包,右键执行build path / Add to Build Path
(2)JDBC开发步骤
- 注册驱动
- 获得连接
- 获得执行sql语句的对象
- 执行sql语句,并返回结果
- 处理结果
- 释放资源
(3)案例实现
1 @Test 2 // 查询所有的分类信息 3 public void JDBCdemo() throws Exception{ 4 // 注意:使用JDBC规范,采用都是 java.sql包下的内容 5 //1 注册驱动 6 Class.forName("com.mysql.jdbc.Driver"); 7 //2 获得连接 8 String url = "jdbc:mysql://localhost:3306/mydb"; 9 Connection conn = DriverManager.getConnection(url, "root", "root"); 10 //3获得执行sql语句的对象 11 Statement stmt = conn.createStatement(); 12 //4执行SQL语句 13 ResultSet rs = stmt.executeQuery("select * from category"); 14 //5处理结果集 15 while(rs.next()){ 16 // 获得一行数据 17 Integer cid = rs.getInt("cid"); 18 String cname = rs.getString("cname"); 19 System.out.println(cid + " , " + cname); 20 } 21 //6释放资源 22 rs.close(); 23 stmt.close(); 24 conn.close(); 25 }
(4)API详解
注册驱动:
DriverManager.registerDriver(new com.mysql.jdbc.Driver()); 注:不建议使用这个来注册驱动
原因有2个:
- >导致驱动被注册2次。
- >强烈依赖数据库的驱动jar
解决办法:
Class.forName("com.mysql.jdbc.Driver"); =》推荐使用这个来注册驱动
获得链接:
public static Connection getConnection(String url, String user, String password) =》试图建立到给定数据库URL的连接
参数说明:url 需要连接数据库的位置(网址) user用户名 password 密码
例如:getConnection("jdbc:mysql://localhost:3306/day06", "root", "root");
URL:SUN公司与数据库厂商之间的一种协议,eg:jdbc:mysql://localhost:3306/day06 (协议 子协议 IP : 端口号 数据库)
java.sql.Connection接口:
接口的实现在数据库驱动中。所有与数据库交互都是基于连接对象的。
Statement createStatement(); //创建操作sql语句的对象
java.sql.Statement接口:操作sql语句,返回相应结果
String sql = "某SQL语句";
获取Statement语句执行平台:Statement stmt = con.createStatement();
常用方法:
- int executeUpdate(String sql); --执行insert update delete语句.
- ResultSet executeQuery(String sql); --执行select语句.
- boolean execute(String sql); --仅当执行select并且有结果时才返回true,执行其他的语句返回false.
处理结果集(注:执行insert、update、delete无需处理):
ResultSet实际上就是一张二维的表格,我们可以调用其boolean next()方法指向某行记录,当第一次调用next()方法时,
便指向第一行,这时就可以使用ResultSet提供的getXXX(int col)方法来获取指定列的数据:
- rs.next();//指向第一行
- rs.getInt(1);//获取第一行第一列的数据
常用方法:
- Object getObject(int index) / Object getObject(String name) 获得任意对象
- String getString(int index)/ String getString(String name) 获得字符串
- int getInt(int index)/int getInt(String name) 获得整形
- double getDouble(int index)/ double getDouble(String name) 获得双精度浮点型
释放资源:
与IO流一样,使用后的东西都需要关闭!关闭的顺序是先得到的后关闭,后得到的先关闭。
3、JDBC工具类
“获得数据库连接”操作,将在以后的增删改查所有功能中都存在,可以封装工具类JDBCUtils。提供获取连接对象的
方法,从而达到代码的重复利用。该工具类提供方法:public static Connection getConn ()。代码如下:
1 public class JdbcUtils { 2 3 private static String driver = "com.mysql.jdbc.Driver"; 4 private static String url = "jdbc:mysql://localhost:3306/test"; 5 private static String user = "root"; 6 private static String password = "root"; 7 8 static{ 9 try { 10 //注册驱动 11 Class.forName(driver); 12 } catch (Exception e) { 13 throw new RuntimeException(e); 14 } 15 16 } 17 18 /** 19 * 获得连接 20 * @return 21 * @throws SQLException 22 */ 23 public static Connection getConnection() throws SQLException{ 24 //获得连接 25 Connection conn = DriverManager.getConnection(url, user, password); 26 return conn; 27 } 28 29 /** 30 * 释放资源 31 * @param conn 32 * @param st 33 * @param rs 34 */ 35 public static void closeResource(Connection conn , Statement st , ResultSet rs){ 36 37 if(rs != null){ 38 try { 39 rs.close(); 40 } catch (SQLException e) { 41 } 42 } 43 44 if(st != null){ 45 try { 46 st.close(); 47 } catch (SQLException e) { 48 } 49 } 50 51 if(conn != null){ 52 try { 53 conn.close(); 54 } catch (SQLException e) { 55 } 56 } 57 58 }
4、JDBC增删改查实例
以上是关于JDBC的主要内容,如果未能解决你的问题,请参考以下文章