Skip to content

Latest commit

 

History

History
215 lines (185 loc) · 7.12 KB

学习 jdbc.md

File metadata and controls

215 lines (185 loc) · 7.12 KB

JDBC

Java DataBase Connectivity JDBC:官方定义了操作所有关系型数据库的规则——接口 JDBC实现类:数据库驱动 [执行代码的是驱动包(jar)中的实现类]

入门: 将jar包导入工程 复制jar包到目录下 右键add as library

注册驱动

步骤: 获取数据库连接对象Connection 定义sql 获取sql语句的对象Statement 执行sql,接收返回结果 处理数据 释放资源

Class.forName("com.mysql.cj.jdbc.Driver");
Connection root = DriverManager.getConnection("jdbc:mysql://localhost:3306/world", "root", "683512");
String sql = "update country set indepyear = -3000 where code = 'chn'";
Statement statement = root.createStatement();
int i = statement.executeUpdate(sql);
System.out.println(i);
statement.close();
root.close();

详解对象: DriverManager:驱动管理器对象 功能 注册驱动//可省略:Class.forName("com.mysql.cj.jdbc.Driver"); 告诉驱动使用哪个jar

static {
	try {
		DriverManager.registerDriver(new Driver());
	} catch (SQLException var1) {
		throw new RuntimeException("Can't register driver!");
	}
}

获取数据库连接: ​Connection root = DriverManager.getConnection("jdbc:mysql://localhost:3306/world", "root", "683512"); ​ url:指定连接的路径 ​ mysql调用:jdbc:mysql://ip(域名):端口号/数据库名称 ​ Connection:数据库连接对象 ​ 功能: ​ 获取statement ​ 获取preparedstatement

​ 管理事务: ​ 开启事务:setAutoCommit:调用该方法,设置参数为false即开启事务 ​ 提交事务:commit(); ​ 回滚事务:rollback();

​ Statement:执行sql对象

​ 执行sql:execute(String sql):执行任意sql ​ int executeUpdate(String sql):执行DML语句(insert/update/delete)、DDL语句(create/alter/drop)

​ 返回值为影响的行数 ​ ResultSet executeQuery(String sql):执行DDL语句

​ ResultSet:结果集对象,封装查询结果 ​ next();光标从当前位置向前移动一行 ​ getxxx();获取数据//xxx代表数据类型 ​ 参数: ​ int:代表列的编号(从1开始) ​ string:代表列的名称
​ 使用步骤 ​ 游标向下移动,判断是否是最后一行末尾,取出数据 ​ PreparedStatement:执行sql对象

​ SQL注入问题 ​ sql。。。。or 'a'='a'; · 在拼接sql时,有一些sql的特殊关键字参与字符串的拼接,会造成安全性问题 ​ ​ 解决办法:使用PreparedStatement:预编译sql语句对象 ​ 特点:参数使用?占位符替代 ​ 步骤: ​ 1获取数据库连接对象Connection ​ 2定义sql ​ zy:参数使用占位符‘?’ ​ 如select * from stu where id=? and name = ?; ​ 3获取sql语句的对象PreparedStatement,参数传递sql语句 ​ Connection.prepareStatement(String sql) ​ 4给?赋值 ​ setxxx(参数1,参数2) ​ 参数1-》?的位置,从1开始 ​ 参数2-》?的值 ​ 5执行sql,接收返回结果,不需要传递sql语句 ​ 6处理数据 ​ 7释放资源

	后续将会使用PreparedStatement来完成CRUD操作

抽取JDBC工具类:JDBCUtils 目的:简化书写 分析: 抽取一个方法注册驱动() 抽取一个方法获取连接对象 //不希望传参,需要保证工具类的通用性 //使用配置文件 抽取一个方法释放资源 //释放资源需要分别释放 详见\src\heima_06\day01\JDBCDemoUtils.java \src\jdbc.properties \src\heima_06\day01\util\JDBCUtils.java

JDBC控制事务 事务:一个包含多个步骤的业务操作 操作:开启事务,回滚事务,提交事务 开启事务:setAutoCommit:调用该方法,设置参数为false即开启事务 执行sql前开启事务 提交事务:commit(); sql执行完成后提交事务 回滚事务:rollback(); catch中回滚

当异常出现就rollback,那么catch设置为exception
connection可能为null,需要判断connection是否为null

详见\src\heima_06\day01\JDBCDemoTran.java

数据库连接池 概念:是一个容器:存放数据库连接的容器 当系统初始化好后,容器会申请一些连接对象,当用户访问数据库时,从容器中获取连接对象,用户访问完后,会将连接对象归还给容器 好处:节约资源、高效 实现:由数据库厂家实现: 基本实现:生成标准connection对象 获取连接:getconnection() 归还连接:调用connection.close()归还连接 c3p0:数据库连接池技术//比较老 Druid:数据库连接池技术,由阿里巴巴实现 连接池实现:申请自动参与连接池的connection对象

c3p0:实现 导入c3p0-0.9.5.2、mchange-commons-java-0.2.11 定义配置文件: c3p0.properties或c3p0-config.xml 路径:类路径(将文件放入src目录下) config可以配置多个,如果不设置,那么使用默认config 配置方法DataSource ds = new ComboPooledDataSource("otherc3p0"); 创建核心对象 ComboPooledDataSource 获取连接:getconnnection

Druid: 步骤: 导入jar包 定义配置文件: 特点: 是properties形式的 可以放在任意目录下 加载配置文件: Properties 获取数据库连接池: 通过工厂类DuridDataSourceFactory获取 获取连接: getconnection

//导包
//定义配置文件
//加载配置文件
Properties properties = new Properties();
InputStream resourceAsStream = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
properties.load(resourceAsStream);
//获取连接池
DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
//获取连接
Connection connection = dataSource.getConnection();
System.out.println(connection);

​ 简化操作: ​ 定义工具类: ​ 定义类:JDBCUTILS ​ 提供静态代码块加载配置文件,初始化连接池对象 ​ 提供方法 ​ 获取连接方法:通过数据库连接池获取连接 ​ 释放资源 ​ 获取连接池的方法

详见\src\datasource\utils\JDBCUtils.java

Spring JDBC:Spring框架提供的工具类,用于封装JDBC 提供了一个JDBCTemplate 对象简化JDBC的开发 步骤: 导入jar包 创建JdbcTemplate对象。依赖于数据源DtaSource JdbcTemplate template = new JdbcTemplate(ds); 调用JdbcTemplate的方法来完成CRUD的操作 update();执行DML语句 queryForMap();执行DQL语句,将结果集封装为map集合 //查询的结果集长度只能为1,列名为key,值作为value queryForList();执行DQL语句,将结果集封装为List集合 //将每一条记录封装为map集合,再将多个map集合装在到list集合中 query();,将结果封装为JavaBean对象 //query的参数RowMapper, 一般我们使用BeanPropertyRowMapper实现类,实现自动向JavaBean的自动封装 queryForObject:将结果封装为对象 //一般用于聚合函数 Long aLong = template.queryForObject(sql, long.class);