javaweb进阶-jdbc基础

javaweb进阶-jdbc基础,第1张

javaweb进阶-jdbc基础 JDBC基础 一、概念
概念:
	 Java Database Connectivity(java语言连接数据库)

本质【一套接口】:
	 JDBC是SUN公司制定的一套接口(interface)
        java.sql.*;(这个软件包下有很多接口)
        
作用:每一个数据库都有自己独特的实现原理,
二、JDBC原生六步
第一步:注册驱动(作用:告诉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();
    }
三、Junit单元测试
使用步骤:
	1. 把junit4.x的测试jar,添加到该项目中来;
	2. 定义一个测试类 测试类的名字: XxxTest
	3. 在测试类中编写测试方法:
 		@Test
		public void testXxx(){
 		}
 	注意:方法是`public修饰的,无返回的,该方法上必须贴有@Test标签`,XXX表示测试的功能名字
	4. 运行测试方法
    
常见注解:
	 @Test:要执行的测试方法
	 @Before:每次执行测试方法之前都会执行
	 @After: 每次执行测试方法之后都会执行
四、JDBC优化之连接

连接池原理:

	连接池负责分配、管理和释放数据库连接,它的核心思想就是连接复用.
    通过建立一个连接池,这个池中有若干个连接对象,当用户想要连接数据库,就要先从连接池中获取连接对象,然后 *** 作数据库。
    一旦连接池中的连接对象被用完了,判断连接对象的个数是否已达上限,如果没有可以再创建新的连接对象,如果已达上限,用户必须处于等待状态,等待其他用户释放连接对象,直到连接池中有被释放的连接对象了,这时候等待的用户才能获取连接对象,从而 *** 作数据库。
    这样就可以使连接池中的连接得到高效、安全的复用,避免了数据库连接频繁创建、关闭的开销,明显提高对数据库 *** 作的性能。

连接池优势:

	(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
		
	


五、封装JDBCUtils工具类
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();
        }
    }
}
六、SQL注入优化
优化命令:将Statement 替换成了 PreparedStatment预编译命令对象
七、事务在Java中的实现

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();
        }
    }
}
八、dbutils的使用

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:返回结果集中第一行第一列的数据,返回类型为object

4、基本使用

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);
九、通用DAO封装

封装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;
        }
    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5719478.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-18

发表评论

登录后才能评论

评论列表(0条)

保存