第一章.JDBC介绍
1.什么是JDBC
(1)Java DataBase Connectivity(Java数据库连接)(2)JDBC 可让Java通过程序操作关系型数据库(MySQL)(3)JDBC基于驱动程序实现与数据库的连接和操作
2.JDBC的优点
(1)统一的API,提供一致的开发过程(2)易于学习,容易上手,代码结构稳定(3)功能强大,执行效率高,可处理海量数据
第二章.JDBC开发流程
1.快速上手JDBC
public class StandardJDBCSample {public static void main(String[] args) {Connection coon = null;try {//1.加载并注册JDBC驱动Class.forName("com.mysql.cj.jdbc.Driver");//2.创建数据库连接coon = DriverManager.getConnection("jdbc:mysql://localhost:3306/imooc?useSSL=false&useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8","root", "321074");//3.创建Statemen对象Statement stmt = coon.createStatement();ResultSet rs = stmt.executeQuery("Select * from employee");//4.遍历查询结果while (rs.next()) {Integer eno = rs.getInt(1);String ename = rs.getString("ename");float salary = rs.getFloat("salary");String dname = rs.getString("dname");System.out.println(dname + "-" + eno + "-" + ename + "-" + salary);}}catch(Exception e){e.printStackTrace();}finally{//5.关闭连接,释放资源try {if (coon != null && coon.isClosed() == false) {coon.close();}}catch(Exception e){e.printStackTrace();}}}}
2.SQL注入攻击
- SQL注入攻击是指利用SQL漏洞越权获取数据的黑客行为
- SQL注入攻击的根源是未对原始SQL中的敏感字符做特殊处理
- 解决方法:放弃Statement改用PreparedStatement处理SQL
select * from employee where dname =' ' or 1=1 or 1 = ''
3. PreparedStatement介绍
(1)PreparedStatement(预编译Statement)是Statement的子接口(2)PreparedStatement对SQL进行参数化,预防SQL注入攻击(3)PreparedStatement比Statement的执行效率更高
public class StandardJDBCSample {public static void main(String[] args) {Connection coon = null;try {//1.加载并注册JDBC驱动Class.forName("com.mysql.cj.jdbc.Driver");//2.创建数据库连接coon = DriverManager.getConnection("jdbc:mysql://localhost:3306/imooc?useSSL=false&useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8","root", "321074");String sql = "Select * from employee where id = ?";//3.创建PreparedStatemen对象PreparedStatement pstmt = coon.PreparedStatement(sql);pstmt.setInt(1,1);ResultSet rs = pstmt.executeQuery();//4.遍历查询结果while (rs.next()) {Integer eno = rs.getInt(1);String ename = rs.getString("ename");float salary = rs.getFloat("salary");String dname = rs.getString("dname");System.out.println(dname + "-" + eno + "-" + ename + "-" + salary);}}catch(Exception e){e.printStackTrace();}finally{//5.关闭连接,释放资源try {if (coon != null && coon.isClosed() == false) {coon.close();}}catch(Exception e){e.printStackTrace();}}}}
注意:
- 执行查询操作时调用的是executeQuery()方法,返回的是ResultSet对象
- 执行增删改操作时调用的是executeUpdate()方法,返回的是有几条数据受到影响(Int类型)
第三章.通过Druid创建数据库连接池
1.Druid介绍
- Druid是阿里巴巴开源连接池组件,是最好的连接池之一
- Druid对数据库连接进行有效管理和重用,最大化程序执行效率
- 连接池负责创建和管理连接,程序只负责取用和归还
2.方式一.通过代码进行设置
@Testpublic void test() throws SQLException {//第一步:建立一个数据库连接池DruidDataSource dataSource = new DruidDataSource();//第二步:设置连接池的参数dataSource.setUrl("jdbc:mysql://localhost:3306/myemployees");dataSource.setDriverClassName("com.mysql.jdbc.Driver");dataSource.setUsername("root");dataSource.setPassword("123321");// 第三步:获取连接Connection connection = dataSource.getConnection();System.out.println(connection);}
3.方式二.通过配置文件方式创建数据库连接池对象
配置文件 druid-config.properties
driverClassName=com.mysql.cj.jdbc.Driverurl=jdbc:mysql://localhost:3306/imooc?useSSL=false&useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8username=rootpassword=321074initialSize=10maxActive=20
代码:
@Testpublic void test2() throws Exception {Properties p = new Properties();FileInputStream fis = new FileInputStream("druid.properties");p.load(fis);//通过druid的工厂类创建DataSource对象DataSource dataSource = DruidDataSourceFactory.createDataSource(p);//获取数据库连接对象Connection connection = dataSource.getConnection();System.out.println(connection);}
第四章.DBUtils工具类
1.介绍
- DBUtils是Apache提供的开源JDBC 工具类
- 它是对JDBC的简单封装,学习成本极低
- 使用DBUtils可以极大简化JDBC编码工作量
2.Druid + DBUtils联合使用
public class DbUtilsSample {public static void query(){Properties properties = new Properties();String propertyFile = DbUtilsSample.class.getResource("/druid-config.properties").getPath();try {propertyFile = new URLDecoder().decode(propertyFile, "UTF-8");properties.load(new FileInputStream(propertyFile)) ;DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);//利用Apache Dbutils大幅简化了数据的提取过程QueryRunner qr = new QueryRunner(dataSource);/*query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params)conn : 数据库连接对象sql : sql语句ResultSetHandler :此接口用于处理数据库查询操作得到的结果集。不同的结果集的情形,由其不同的子类来实现BeanHandler : 返回一条数据BeanListHandler : 返回多条数据params :给占位符赋值的内容*/List<Employee> list = qr.query("select * from employee limit ?,10",new BeanListHandler<>(Employee.class),new Object[]{10});for(Employee emp : list){System.out.println(emp.getEname());}} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) {query();}}
第五章.事务
1.什么是事务
- 事务是一种可靠的,一致的方式,访问和操作数据库的程序单元
- 通俗来讲,要么把事情做完,要么什么都不做,不要做一半
- 事务依赖于数据库实现MySQL通过事务区作为数据缓冲地带
事务的ACID(acid)属性1. 原子性(Atomicity)2. 一致性(Consistency)3. 隔离性(Isolation)4. 持久性(Durability)
2.JDBC两种事务模式
2.1.自动提交事务模式
- 自动提交模式是指每执行一次写操作SQL,自动提交事务
- 自动提交开启方法:conn.setAutoCommit(true)
- 自动提交事务是JDBC默认行为,此模式无法保证多数据一致性
2.2.手动提交事务模式
- 手动提交模式是指显式调用commit()和rollback()方法管理事务
- 手动提交开启方法:conn.setAutoCommit(false)
- 手动提交事务可保证多数据一致性,但必须手动调用提交/回滚方法
3.案例
/*数据库事务 --- 通过事务去操作账户案例 :AA给BB转账AA 2000BB 2000try{开启事务-禁止自动提交1.AA减掉1000元---修改mysql表中的数据System.out.println(1/0);2.BB加上1000元---修改mysql表中的数据事务提交}catch(Exception e){事务回滚}finaly{开启自动提交}*/
public class AccountDemo {public static void main(String[] args) {//1.获取数据库连接对象Connection connection = null;PreparedStatement ps = null;try {//1.获取数据库连接对象connection = JDBCUtils.getConnection();//2.预编译ps = connection.prepareStatement("update account set balance=? where name=?");//开启事务-禁止自动提交connection.setAutoCommit(false);//3.给占位符赋值 -- 把aa的账户减掉1000ps.setInt(1, 1000);ps.setString(2, "aa");//4.执行sql语句ps.executeUpdate();//System.out.println(1 / 0);//3.给占位符赋值 -- 把cc的账户加上1000ps.setInt(1, 3000);ps.setString(2, "bb");//4.执行sql语句ps.executeUpdate();//5.事务提交connection.commit();}catch (Exception e){e.printStackTrace();//事务回滚try {connection.rollback();} catch (SQLException ex) {ex.printStackTrace();}}finally {//1.允许自动提交try {connection.setAutoCommit(true);} catch (SQLException e) {e.printStackTrace();}//2.关闭资源JDBCUtils.close(ps,connection);}}}
