JDBC(java操作数据库java database connectivity)
- 一套统一的java代码可以操作所有的关系型数据库。
- sun公司定义的接口,数据库厂商提供实现类(数据库驱动)。
DriverManager:驱动管理对象
-
注册驱动:mysql5以上会自动注册驱动,可省略,告诉程序该使用哪一个数据库驱动jar
-
Class.forName("com.mysql.cj.jdbc.Driver");
通过查看Driver发现在这个类里存在静态代码块
static { try { DriverManager.registerDriver(new Driver()); } catch (SQLException var1) { throw new RuntimeException("Can't register driver!"); } }
被try包住那一行注册驱动。
-
-
获取数据库连接
-
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db","root","root");
- url:指定连接的路径( jdbc:mysql://ip地址(域名):端口号/数据库名 ) name:用户名 password:密码 (如果连接本机url可以简写为jdbc:mysql:///数据库名)
Connection:数据库连接对象
- 获取执行sql的对象
- createStatement()
- preparedStatement(String url)
- 管理事务
- 开启事务:setAutoCommit(boolean autoCommit) :设置为false 则开启事务
- 提交事务:commit()
- 回滚事务:rollback()
Statement(静态sql):执行sql的对象
- boolean excute(String sql) :可以执行任意sql
- int executeUpdate(String sql) 执行DML语句(增(insert)删(delete)改(update)表中的数据),DDL语句,增(create)删(drop)改(alter)表。(返回值是影响的行数)
- 练习:增删该记录,查询
ResultSet executeQuery(String sql):执行DQL,返回结果集对象
-
next方法:游标向下移动一行(但是只能获取莫一列的数据)
-
gewXXX(参数),XXX是数据类型 如:int getInt(); String getString();
- int:从1开始
- String:列的名称
-
PreparedStatement(动态sql):执行sql,更加强大
- sql注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接,会造成安全问题。
- 1:输入用户随便,密码:a’ or ‘a’=‘a’;
- 2:sql : select * from user username=’"+username+"’ and password=’"+password+"’;
- 预编译的SQL:参数使用?作为占位符。
- 步骤:
- sql的参数使用?作为占位符,select * from username=? and password=?;
- 获取执行sql语句的对象:PreparedStatement—>Connection.prepareStatement(String sql);
- 给?赋值:setXXX(参数1,参数2);参数1:?的位置 参数2:?的值
- sql注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接,会造成安全问题。
-
抽取JDBC工具类
-
目的:简化书写
-
分析:
- 注册驱动也抽取
- 抽取一个方法获取连接对象/*
- 需求:不想传递参数(麻烦),还得保证工具类的通用性
- 解决:配置文件()
- */
- 抽取一个方法释放资源
-
事务转账案例
- 使用Connection对象管理事务
- setAutoCommit():开启事务
- commit():提交事务
- rollBack():回滚事务
- 使用Connection对象管理事务
-
数据库连接池
-
数据库连接池
-
存放数据库连接的容器(集合)
-
1.节约资源,用户访问高效
-
标准接口:DataSource javax.sql包下的
-
1.方法:
- 获取连接:getConnection()
- 归还连接:如果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法,则不会再关闭连接了,而是归还连接。
-
一般我们不去实现它,由数据库厂商实现
-
C3P0:数据库连接池技术
- 导入jar包( 俩个?三个? )
- 定义配置文件:
- 名称:c3p0.properties或者c3p0-config.xml
- 路径:直接将文件放在src目录下即可
- 创建数据库连接池对象:ComboPooledDataSource
- 获取连接:getConnection
-
Druid:数据库连接池技术,由阿里巴巴提供的
-
导入jar包:druid-1.0.9.jar
-
定义配置文件:
-
是properties形式的
-
driverClassName=com.mysql.cj.jdbc.Driver url=jdbc:mysql:///db username=root password=root #初始化连接数 initialSize=5 #最大连接数 maxActive=10 #最大等待时间 maxWait=3000
-
可以叫任意名称,可以放在任意目录下
-
-
加载配置文件。Properties
-
//加载配置文件 Properties pro = new Properties(); InputStream is = 类名.class.getClassLoader().getResourceAsStream("druid.properties"); pro.load(is);
-
获取数据库连接池对象:通过工厂来获取:DruidDataSourceFactory
-
DataSource ds = DruidDataSourceFactory.createDataSource(pro);
-
获取连接:getConnection
-
Connection conn = ds.getConnection();
-
-
-
-
定义工具类
- 使用静态代码块加载配置文件,初始化连接对象
- 提供方法
- 获取连接方法:通过数据库连接池获取连接
- 释放资源
- 获取连接池方法
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; /** * @author long * @date 19-4-19 - 下午5:13 * Druid工具类 */ public class DruidUtils { //1.定义成员变量 private static DataSource ds; static{ //加载配置文件 Properties pro = new Properties(); try { pro.load(DruidUtils.class.getResourceAsStream("druid.properties")); ds = DruidDataSourceFactory.createDataSource(pro); } catch (IOException e) { System.out.println("加载配置时出现错误"); } catch (Exception e) { System.out.println("获取连接池时出现错误"); } } /** * 获取连接 */ public static Connection getConnection() throws SQLException { return ds.getConnection(); } /** * 释放资源 */ public static void close(Statement stmt,Connection conn){ if(null!=stmt) { try { stmt.close(); } catch (SQLException e) { System.out.println("关闭执行SQL对象时出现问题"); } } if(null!=conn) { try { conn.close(); } catch (SQLException e) { System.out.println("关闭连接对象时出现问题"); } } } public static void close(ResultSet rs,Statement stmt, Connection conn){ if(null!=rs) { try { rs.close(); } catch (SQLException e) { System.out.println("关闭集合时出现问题"); } } if(null!=stmt) { try { stmt.close(); } catch (SQLException e) { System.out.println("关闭执行SQL对象时出现问题"); } } if(null!=conn) { try { conn.close(); } catch (SQLException e) { System.out.println("关闭连接对象时出现问题"); } } } /** * 获取连接池的方法 */ public static DataSource getDataSource(){ return ds; } }
-
-
-
Spring JDBC :JDBC Template
-
Spring框架对JDBC的简单封装,提供了一个JDBCTemplate带向简化JDBC的开发
-
步骤
-
1.导入jar包
-
2.创建JDBCTemple对象,依赖于数据源DataSource
-
JdbcTemplate template = new JdbcTemplate(ds);
-
-
3.调用JdbcTemplate的方法来完成CRUD(增删改查)
-
update() :执行DML语句。增删改语句
queryForMap() :查询结果将结果集封装为map集合
queryForList() :查询结果将结果集封装为list集合
query() :查询结果,将结果封装为JavaBean对象
queryForObject() :查询结果,将结果封装为对象
-
-
-