二、JDBC原生六步概念: Java Database Connectivity(java语言连接数据库) 本质【一套接口】: JDBC是SUN公司制定的一套接口(interface) java.sql.*;(这个软件包下有很多接口) 作用:每一个数据库都有自己独特的实现原理,
三、Junit单元测试第一步:注册驱动(作用:告诉java程序,即将要连接的是哪个品牌的数据库) 第二步:获取连接(表示JVM的进程和数据库进程之间的通道打开了。这属于进程之间的通信,重量级的,用完之后要关闭) 第三步:获取数据库 *** 作对象(专门执行sql语句的对象) 第四步:执行SQL语句 第五步:处理查询结果集(当第四步执行的select语句的时候,才有第五步) 第六步:释放资源 代码示例: import com.mysql.jdbc.Driver; import java.sql.*; public class TestJdbc { public static void main(String[] args) throws SQLException { //注册驱动 DriverManager.registerDriver(new Driver()); //建立连接 //如果链接地址ip是localhost 并且 端口是3306 那么可以省略不写 Connection connection = DriverManager.getConnection("jdbc:mysql:///day11", "root", "root"); //创建执行对象 Statement statement = connection.createStatement(); //ResultSet 结果集对象 ResultSet resultSet = statement.executeQuery("select * from user"); //循环判断游标是否还可以下移(是否还有数据) while(resultSet.next()){ String name = resultSet.getString("name"); int age = resultSet.getInt("age"); System.out.println(name+"===="+age); } //释放资源 先开后关 resultSet.close(); statement.close(); connection.close(); }
四、JDBC优化之连接池使用步骤: 1. 把junit4.x的测试jar,添加到该项目中来; 2. 定义一个测试类 测试类的名字: XxxTest 3. 在测试类中编写测试方法: @Test public void testXxx(){ } 注意:方法是`public修饰的,无返回的,该方法上必须贴有@Test标签`,XXX表示测试的功能名字 4. 运行测试方法 常见注解: @Test:要执行的测试方法 @Before:每次执行测试方法之前都会执行 @After: 每次执行测试方法之后都会执行
五、封装JDBCUtils工具类连接池原理:
连接池负责分配、管理和释放数据库连接,它的核心思想就是连接复用. 通过建立一个连接池,这个池中有若干个连接对象,当用户想要连接数据库,就要先从连接池中获取连接对象,然后 *** 作数据库。 一旦连接池中的连接对象被用完了,判断连接对象的个数是否已达上限,如果没有可以再创建新的连接对象,如果已达上限,用户必须处于等待状态,等待其他用户释放连接对象,直到连接池中有被释放的连接对象了,这时候等待的用户才能获取连接对象,从而 *** 作数据库。 这样就可以使连接池中的连接得到高效、安全的复用,避免了数据库连接频繁创建、关闭的开销,明显提高对数据库 *** 作的性能。连接池优势:
(1)程序启动时提前创建好连接,不用用户请求时创建,给服务器减轻压力; (2)连接关闭的时候不会直接销毁connection,这样能够重复利用; (3)如果超过设定的连接数量但是还没有达到最大值,那么可以再创建; (4)如果空闲了,会默认销毁(释放)一些连接,让系统性能达到最优;常用的开源连接池:
1. DBCP 是Apache提供的数据库连接池,速度相对c3p0较快,但因自身存在BUG,Hibernate3已不再提供支持 2. C3P0 是一个开源组织提供的一个数据库连接池,速度相对较慢,稳定性还可以 Proxool 是sourceforge下的一个开源项目数据库连接池,有监控连接池状态的功能,稳定性较c3p0差一点 BoneCP 是一个开源组织提供的数据库连接池,速度快 3.Druid 是阿里提供的数据库连接池,据说是集DBCP 、C3P0 、Proxool 优点于一身的数据库连接池,但是速度不知道 是否有BoneCP快连接池的使用【c3p0】:
创建配置文件c3p0.xml ,放在src目录下 :com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/day10 root root 30000 30 10 30 100 10 200 10 1 0
六、SQL注入优化import com.mchange.v2.c3p0.ComboPooledDataSource; import javax.sql.DataSource; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; //负责管理数据库连接 public class JdbcUtils { private static ComboPooledDataSource dataSource = new ComboPooledDataSource(); //私有化JdbcUtils的构造方法 private JdbcUtils(){} //提供连接池对象方法 public static DataSource getDataSource(){ return dataSource; } //提供数据连接对象的方法 public static Connection getConnection(){ try { return dataSource.getConnection(); } catch (SQLException throwables) { throwables.printStackTrace(); return null; } } public static void close(Connection connection, Statement statement, ResultSet resultSet){ try { if(resultSet!=null) resultSet.close(); if (statement!=null) statement.close(); if(connection!=null) connection.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } public static void close(Connection connection, Statement statement){ try { if (statement!=null) statement.close(); if(connection!=null) connection.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } }
七、事务在Java中的实现优化命令:将Statement 替换成了 PreparedStatment预编译命令对象
八、dbutils的使用1、手动开启事务
2、成功 提交
3、失败 回滚
import com.offcn.util.JdbcUtils; import org.junit.Test; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; public class TestTransaction { @Test public void test() throws SQLException { Connection connection = JdbcUtils.getConnection(); PreparedStatement preparedStatement = null; try { //1、关闭自动提交,开启事务 connection.setAutoCommit(false); //2、具体的事务 ...... //3、程序没有问题,提交事务 connection.commit(); } catch (SQLException throwables) { throwables.printStackTrace(); //4、程序出问题了,回滚事务 connection.rollback(); }finally{ //5、关闭资源 preparedStatement.close(); JdbcUtils.close(); } } }
九、通用DAO封装1、简介
commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。2、作用
DbUtils :提供如关闭连接、装载JDBC驱动程序等常规工作的工具类,里面的所有方法都是静态的。 该包封装了SQL的执行,是线程安全的。 (1)可以实现增、删、改、查、批处理、 (2)考虑了事务处理需要共用Connection。 (3)该类最主要的就是简单化了SQL查询,它与ResultSetHandler组合在一起使用可以完成大部分的数据库 *** 作,能够大大减少编码量。3、常用方法
① *** 作:update() public int update(Connection conn, String sql, Object... params) throws SQLException:用来执行一个更新(插入、更新或删除) *** 作。 ② 查询:query() public Object query(Connection conn, String sql, ResultSetHandler rsh,Object... params) throws SQLException:执行一个查询 *** 作,在这个查询中,对象数组中的每个元素值被用来作为查询语句的置换参数。该方法会自行处理 PreparedStatement 和 ResultSet 的创建和关闭。 注: 该接口用于处理 java.sql.ResultSet,将数据按要求转换为另一种形式。ResultSetHandler 接口提供了一个单独的方法:Object handle (java.sql.ResultSet rs)该方法的返回值将作为QueryRunner类的query()方法的返回值 方法: ArrayHandler:把结果集中的第一行数据转成对象数组。 ArrayListHandler:把结果集中的每一行数据都转成一个数组,再存放到List中。 BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。 BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。 ColumnListHandler:将结果集中某一列的数据存放到List中。 MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。 MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List ScalarHandler:返回结果集中第一行第一列的数据,返回类型为object4、基本使用
1、下载导包 commons-dbutils-1.7.jar 2、创建核心对象 QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource()); 3、调用方法 int update = qr.update(connection,sql,params); // 执行增删改 T t = qr.query(connection,sql,new BeanHandler,params); List t = qr.query(connection,sql,new BeanListHandler,params); Object t = qr.query(connection,sql,new ScalerHandler,params);
封装baseDao
import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import java.sql.SQLException; import java.util.List; public class baseDao{ QueryRunner queryRunner = new QueryRunner(JdbcUtils.getDataSource()); //负责通用增删改 public int executeUpdate(String sql, Object ...params){ try { return queryRunner.update(sql,params) ; } catch (SQLException throwables) { throwables.printStackTrace(); return 0; } } //负责通用查询(单条记录) public T queryForSingle(String sql,Class clazz,Object...params){ try { return queryRunner.query(sql,new BeanHandler (clazz),params); } catch (SQLException throwables) { throwables.printStackTrace(); return null; } } //负责通用查询(多条记录) public List queryForList(String sql,Class clazz,Object ...params) { try { return queryRunner.query(sql,new BeanListHandler (clazz),params); } catch (SQLException throwables) { throwables.printStackTrace(); return null; } } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)