1-1.JDBC的概念
JDBC:
*概念:lava DataBase Connectivity Java数据库连接,Java语言操作数据库
JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类
1-2.JDBC快速入门
*步骤∶
1.导入驱动jar包
1.复制mysql-connector-java-5.1.37-bin.jar到项目的libs目录下
2.右键-->Add As Library
2.注册驱动
3,获取数据库连接对象Connection
4、定义sql
5.获取执行sql语句的对象Statement
6,执行sql,接受返回结果
7.处理结果
8,释放资源
1-3.JDBC中各个类的详解
*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包可以省咯注册驱动的步骤。
2.获取数据库连接∶
*方法:static Connection getConnection(string url,string user,String password)
*参数∶
*url:指定连接的路径
*语法:jdbc :mysql://ip地址(域名):端口号/数据库名称
*例如∶jdbc :mysql://localhost:3306/db3
*小细节﹔如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql://数据库名称
*user:用户名
*password:密码
*Connection :数据库连接对象
*功能:
*获取执行sql 的对象
*Statement createStatement(
*Preparedstatement preparestatement(string sql)
*管理事务∶
*开启事务;setAutoCommit(boolean autoCommit):调用该方法设置参数为false,即开启事务
*提交事务: commit()
*回滚事务:rollback()
Statement:执行sql的对象
*执行sql
*boolean execute(String sql)∶可以执行任意的sql了解
*int executeUpdate(string sql):执行owL(insert、update、delete)语句、DDL(create,alter、drop)语句
返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功返回值>0的则执行成功,反之,则失败。
*Resultset executeQuery(string sql)∶执行DQL(select)语句
Resultset :结果集对象,封装查询结果
*boolean next():游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据),如果是,则返回false,如果不是则返回true
*getXxx(参数):获取数据
* Xxx:代表数据类型如: int getInt() , String getString()
*参数:
*int : i代表列的编号,从1开始如: getString(1)
*String:代表列名称。加: getDouble( "balance")
*注意∶
使用步骤:
1.游标向下移动一行
2.判断是否有数据
3.获取数据
PreparedStatement:执行sql的对象
1.SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性问题
2.解决sql注入问题:使用PreparedStatement对象来解决
3.预编译的SQL :参数使用?作为占位符
4.步骤:
*导人驱动jar包mysql-connector-java-5.1.37-bin.jar
*注册驱动
*获取数据库连接对象connection
*定义sql
注意:sql的参数使用?作为占位符。如:select * from user where username = ? and password = ?;
*获取执行sql语句的对象Preparedstatement Connection.prepareStatement(String sql)
*给?赋值:
*方法:setXxx(参数1,参数2,
*参数1:?的位置,编号从1开始
*参数2∶?的值
*执行sql,接受返回结果,不需要传递sql语句
*处理结果
*释放资源
5.注意∶后期都会使用preparedStatement来完成增删改查的所有操作
*可以防止SQL注入
*效率更高
1-4.JDBC控制事务
1.事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败。
2.操作:
*开启事务
*提交事务
*回滚事务
3.使用connection对象来管理事务
*开启事务:setAutocommit(boolean autocommit)︰调用该方法设置参数数为false,即开启事务
在执行sql之前开启事务
*提交事务: commit()
*当所有sql都执行完提交事务
*回滚事务:rollback()
*在catch中回滚事务
抽取JDBC工具类:JDBCutils
*目的:简化书写
*分析∶
1,注册驱动也抽取
2.抽取一个方法获取连接对象
*需求:不想传递参数〔麻烦),还得保证工具类的通用性。
*解决∶配置文件
jdbc.properties
url=
user=
password=
1-5.数据库连接池
*概念∶其实就是一个容器(集合),存放数据库连接的容器。
当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。
*好处:
*节约资源
*用户访问高效
实现∶
*标准接口: Datasource javax.sql包下的
*方法:
*获取连接∶getConnection()
*归还连接:connection.close()。如果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法,则不会再关闭连接了,而是归还连接。
*—般我们不去实现它,有数据库厂商来实现,如下列两个数据库连接池技术
*C3pO:数据库连接池技术
* Druid:数据库连接池实现技术,由阿里巴巴提供的
* C3P0:数据库连接池技术
*步骤∶
1.导入jar包(两个)c3po-2.9.5.2.jar mchange-commons-java-8.2.12.jar,
不要忘记导人数据库驱动jar包
2.定义配置文件:
名称: C3po.properties或者c3pe-config.xml
*路径∶直接将文件放在src目录下即可。
3.创建核心对象 数据库连接池对象ComboPooledDataSource
4.获取连接: getConnection
Druid :数据库连接池实现技术,由阿里巴巴提供的
*步骤∶
1.导人jar包druid-1.0.9.jar
2.定义配置文件:
*是properties形式的
*可以叫任意名称,可以放在任意目录下
3.加载配置文件。Properties
4.获取数据库连接池对象∶通过工厂来来获取DruidDataSourceFactory
5. 获取连接:getConnection
*定义工具类
1.定义一个类JDBCUtils
2.提供静态代码块加载配置文件,初始化连接池对象
3.提供方法
获取连接方法∶通过数据库连接池获取连接
释放资源
获取连接池的方法
1-6.JDBCTemplate
*Spring框架对JDBC的简单封装。提供了一个JDBCTemplate对象简化JDBC的开发
*步骤∶
1.导入jar包
2.创建JDBCTemplate对象。依赖于数据源DataSource
*JDBCTemplate template = new JDBCTemplate(ds);
3.调用JDBCTemplate的方法来完成CRUD的操作
*update():执行DML语句。增、删、改语句
*queryForMap():查询结果将结果集封装为map集合,将列名作为key,将值作为value将这条记录封装为一个map集合
*注意∶这个方法查询的结果集长度只能是1
*queryForList():查询结果将结果集封装为list集合
*注意:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中
*query():查询结果,将结果封装为JavaBean对象
*new BeanPropertyRowMapper<类型>(类型.class)
*—般我们使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装
*queryForObject:查询结果,将结果封装为对象
*—般用于聚合函数的查询