JDBC API 允许用户访问任何形式的表格数据,尤其是存储在关系数据库中的数据。
1. JDBC 1.1 简介
1.2 工作原理
1.3 JDBC API
1.4 JDBC 驱动
1.5 Connection[会话]
1.6 Statement【执行SQL】 Statement 用于执行静态 SQL 语句
PreparedStatement 表示预编译的 SQL 语句的对象。
CallableStatement 用于执行 SQL 存储过程的接口。
存储过程定义 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 DELIMITER $$ CREATE PROCEDURE p_save_dept(v_deptno INT ,v_dname VARCHAR (20 ),v_loc VARCHAR (20 ) ,OUT v_rs INT ) BEGIN DECLARE cut INT (1 ) ; SELECT COUNT (0 ) INTO cut FROM dept WHERE deptno = v_deptno ; IF cut = 1 THEN SET v_rs = -1 ; END IF ; IF cut = 0 THEN SET v_rs = 1 ; INSERT INTO dept (deptno,dname,loc) VALUES (v_deptno,v_dname,v_loc) ; COMMIT ; END IF ; END $$DELIMITER ;
数据库直接调用 1 2 CALL p_save_dept(11 ,'aa' ,'NJ' ,@rs ) ;SELECT @rs ;
JDBC调用 1 2 3 4 5 6 7 8 9 10 11 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test" , "root" , "root" );CallableStatement cs = conn.prepareCall("{call p_save_dept(?,?,?,?)}" );cs.setInt(1 ,12 ); cs.setString(2 ,"dev" ); cs.setString(3 ,"NJ" ); cs.registerOutParameter(4 , JDBCType.INTEGER); cs.execute() ; int out = cs.getInt(4 );System.out.println(out); cs.close(); conn.close();
1.7 ResultSet 【查询结果集】
2. DAO 2.1 什么是DAO
2.2 DAO作用
2.3 组成部分
2.4 示例
3.Dbutils Dbutils:主要是封装了JDBC的代码,简化dao层的操作。 作用:帮助java程序员,开发Dao层代码的简单框架。 框架的作用:帮助程序员,提高程序的开发效率。
3.1 环境搭建 jar包下载
https://mvnrepository.com/artifact/commons-dbutils/commons-dbutils/1.7
3.2 官网地址 https://commons.apache.org/proper/commons-dbutils/examples.html
3.3 Dbutils三个核心类介绍 1:DbUtils:连接数据库对象—-jdbc辅助方法的集合类,线程安全 构造方法:DbUtils() 作用:控制连接,控制事务,控制驱动加载额一个类。
2:QueryRunner:SQL语句的操作对象,可以设置查询结果集的封装策略,线程安全。 构造方法: (1)QueryRunner():创建一个与数据库无关的QueryRunner对象,后期再操作数据库的会后,需要手动给一个Connection对象,它可以手动控制事务。 Connection.setAutoCommit(false); 设置手动管理事务 Connection.commit(); 提交事务
(2)QueryRunner(DataSource ds):创建一个与数据库关联的queryRunner对象,后期再操作数据库的时候,不需要Connection对象,自动管理事务。 DataSource:数据库连接池对象。
1 2 3 4 5 6 7 8 QueryRunner() update(Connection conn, String sql, Object... params) query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) QueryRunner(DataSource ds) update(String sql, Object... params) query(String sql, ResultSetHandler<T> rsh, Object... params)
3:ResultSetHandle:封装数据的策略对象——将封装结果集中的数据,转换到另一个对象 策略:封装数据到对象的方式(示例:将数据库保存在User、保存到数组、保存到集合) 方法介绍:handle(ResultSet rs)
3.4 创建DBCP连接池 1、创建DBCP链接池配置文件:名称为 dbcp.properties 内容如下:
1 2 3 4 5 driverClassName=com.mysql.jdbc.Driver username=root password=123456 url=jdbc:mysql://127.0.0.1:3306/long1?characterEncoding=UTF8 maxActive=2
2、读取配置文件,创建 DataSource 连接池实例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 package com.test.dbcp;import java.sql.Connection;import java.util.Properties;import javax.sql.DataSource;import org.apache.commons.dbcp.BasicDataSourceFactory;public class DbcpDataSource {private static DataSource ds;static { try { Properties p = new Properties (); p.load(DbcpDataSource.class.getClassLoader().getResourceAsStream("dbcp.properties" )); ds = BasicDataSourceFactory.createDataSource(p); System.out.println("创建DataSource为" +ds); }catch (Exception e){ throw new RuntimeException (e); } } public static DataSource getDataSource () { return ds; } public static Connection getConnection () { Connection con = null ; try { con = ds.getConnection(); System.out.println("通过DataSource获取connection连接" +con); }catch (Exception e){ e.printStackTrace(); } return con; } }
另外也可以不配置文件直接使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 static { Properties prop = new Properties (); prop.setProperty("driverClassName" ,"com.mysql.jdbc.Driver" ); prop.setProperty("url" ,"jdbc:mysql://localhost:3306/customer?useSSL=false&characterEncoding=utf8" ); prop.setProperty("password" ,"root" ); prop.setProperty("username" ,"root" ); try { dataSource = DruidDataSourceFactory.createDataSource(prop); }catch (Exception e) { e.printStackTrace(); } }
3.5 DBUtil 增删改查 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 package com.test.ts;import java.sql.SQLException;import java.util.List;import javax.persistence.Version;import org.apache.commons.dbutils.QueryRunner;import org.apache.commons.dbutils.handlers.ArrayHandler;import org.apache.commons.dbutils.handlers.ArrayListHandler;import org.junit.Test;import com.test.dbcp.DbcpDataSource;public class DbutilTests {@Test public void add () throws SQLException{ QueryRunner run1 = new QueryRunner (DbcpDataSource.getDataSource()); String sq1 = "INSERT INTO student(id,namee,sex,birth,department,address)" + "VALUES(3,'王思','男',1995,'英文系','山东沧州')" ; int result1 = run1.update(sq1); System.out.println("新增数据库结果,更新了数据有:" +result1+"条" ); } @Test public void update () throws SQLException{ QueryRunner run2 = new QueryRunner (DbcpDataSource.getDataSource()); String sq2 = "UPDATE student SET sex=? WHERE id=?" ; int result2 = run2.update(sq2, "男" ,16 ); System.out.println("更新数据库结果,更新了数据有:" +result2+"条" ); } @Test public void delete () throws SQLException{ QueryRunner run3 = new QueryRunner (DbcpDataSource.getDataSource()); String sq3 = "DELETE FROM student WHERE id IN " + "(SELECT a.id FROM " + "(SELECT MAX(id) id FROM student a WHERE id IN" + "(SELECT id FROM student b WHERE a.id=b.id ORDER BY id DESC)) a)" ; int result3 = run3.update(sq3); System.out.println("更新数据库结果,更新了数据有:" +result3+"条" ); } @Test public void query () throws SQLException{ QueryRunner run = new QueryRunner (DbcpDataSource.getDataSource()); String sq4 = "Select * from student" ; Object[] var = run.query(sq4, new ArrayHandler ()); if (var !=null ){ System.out.print("输出学生表查询的信息" +"\n" ); for (Object o :var ){ System.out.print(o+"\n" ); } } } @Test public void query2 () throws SQLException{ QueryRunner run5 = new QueryRunner (DbcpDataSource.getDataSource()); String sq5 = "select * from student" ; List<Object[]> list = run5.query(sq5, new ArrayListHandler ()); if (list!=null ){ for (Object[] os:list){ for (Object o :os){ System.out.println("ArrayListHandler()显示查询到的所有数据:" +o+"\t" ); } System.out.println("\n--------------------------------------------" ); } } } }