数据库连接JDBC

本文介绍了JDBC的基本概念和操作步骤,包括注册驱动、获取连接、执行SQL等。接着,讨论了数据库连接池的作用,并以Druid为例展示了其使用方法。此外,还提到了DBUtils工具库如何简化JDBC编码,以及如何利用DBUtils进行事务控制。最后,文章提及了Junit单元测试的注解和基本使用流程。
摘要由CSDN通过智能技术生成

一、JDBC

1.什么是JDBC

Java数据库连接,是一种用于执行SQL语句的JavaAPI,它是一套统一的、基于Java语言的关系数据库编程接口规范,该规范允许你把SQL语句作为参数通过JDBC接口发送给远端数据库,远端数据库接受到你的SQL后进行语法分析、验证,然后执行、响应。

2.JDBC的本质

Jdbc是一个普通的Java类,是数据库厂商提供的驱动jar包,可以实现sun提供一套接口规范!
java.sql.Driver:驱动接口---->驱动jar包—>实现了这个接口
java.sql.Connection:数据库的连接会话—>驱动jar包—>ConnectionImpl实现了这个接口

3.JDBC的七大步骤

1)导入java驱动jar包

​ mysql-connnector-java

2)注册驱动

​ Class.forName(“com.mysql.jdbc.Driver”);

3)准备SQL语句

​ DML和DQL

​ 参数化SQL

​ String sql = “select * from 表面 where 字段1=?”

4)获取数据库的连接对象

Connection conn = DriverManager.getConnection(	
    			//MySQL5.7
				"jdbc:mysql://localhost:3306/库名",
    			//如果使用mysql8.0的jar包,此时后面带上一些参数:时区以及编码格式
                //jdbc:mysql://localhost:3306/库名?characterEncoding=utf-8&timezone=utc
				"数据库用户名",
				"数据库密码") ;

5)通过连接对象获取执行对象Statement

​ Statement stmt = conn.createStatement() ;

​ 预编译执行对象PreparedStatement

​ PreparedStatement ps = conn.prepareStatement(sql);

​ ps.setXXX(占位符,值) ; //占位符从1开始

6)执行SQL

​ int count = stmt.executeUpdate(sql) ; //通用DML语句

​ ResultSet rs = stmt.executeQuery(sql) ; //执行DQL语句

预编译执行SQL

​ int i = ps.executeUpdate()

​ ResultSet rs = ps.executeQuery()

7)释放资源

​ stmt.close();

​ conn.close();

3.1读取ResultSet结果集中的数据

ResultSet rs = stmt.executeQuery() ;
//next():将指针移动到当前位置的下一行,初始位置为第一行之前
while(rs.next()){
    //获取结果中的数据
	XXX name = rs.getXXX(表字段索引/表字段名称);
	System.out.prinltn(name);
}

4.自定义JDBC工具类

driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/库名
user=root
password=123456
class JdbcUtils{
    private static String user = null ;
    private static String password = null ;
    private static String driverClass = null ;
    private static String url = null ;
    
    //定义static代码块
    static{
        //读取配置文件
        Properties prop = new Properties() ;
        //获取key对应的value,赋值给上面四个成员变量
        InputStream inputStream = JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties") ;
        user = prop.getProperty("user") ;
        password = prop.getProperty("password") ;
        url = prop.getPrpperty("url") ;
        driverClass = prop.getProperty("driverClass") ;
        //注册驱动
        Class.forName(driverClass) ;
    }

    private JdbcUtils(){}
    public static Connnection getConnection(){
        	Connection conn = DriverManager.getConnection(url,user,password) ;
        return conn ;
    }
    //释放资源
    //带三个参数:ResultSet ,Statment,Connection---针对DQL语句操作
    //带两个参数:Satement,Connection--->针对DML语句
}

二、数据库连接池

1.连接池作用

数据库连接池 负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个

2.Druid连接池的使用步骤:

1)导包 druid-1.1.10.jar包

2)准备好连接池的配置文件

3)从连接池获取连接对象

​ 提供jar包—>com.alibaba.druid.pool.DruidDataSource—>

​ 本质实现了一个接口javax.sql.DataSource—>Connection getConnection()

//3)创建数据源DruidDataSource对象
//德鲁伊提供的数据源工厂:DruidDataSourceFactory提供静态方法,返回值就是DataSource
//public static DataSource createDataSource(Properties properties)
//创建属性集合列表
Properties prop = new Properties() ;

//读取src下配置文件
InputStream inputStream = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
//将字节输入流加载进来
prop.load(inputStream) ;

DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
for(int x = 1 ; x <=11 ; x++){
    //System.out.println(dataSource.getConnection());
    Connection conn = dataSource.getConnection() ;
    if(x==3){
        conn.close(); //暂时释放,归还连接池中
    }
    System.out.println(conn);
}

三、DBUtils

1.DBBtils简介

commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,创建连接、结果集封装、释放资源,同时也不会影响程序的性能。创建连接、结果集封装、释放资源

2.commons-dbutils的使用步骤:

1)导包 commons-dbutils-1.6.jar
2)创建执行器 QueryRunner—> 底层PreparedStatement
public QueryRunner(DataSource ds) 参数就是数据源—>自定义工具获取到了数据源 (自动提交)
public QueryRunner():创建执行器,手动提交

3)准备好sql语句
DML语句—添加/修改/删除
insert into
update
delete from…

QueryRunner提供通用的更新操作:
	public int update(Connection conn, String sql, Object... params) throws SQLException  :手动提交
    public int update(String sql, Object... params):自动提交

​ DQL语句— 查询语句

QueryRunner提供的通用查询操作
	public <T> T query(String sql, ResultSetHandler<T> rsh, Object... params) throws SQLException
    第一个参数:查询的sql语句
    第二个参数:ResultSetHandler结果集的处理
	BeanHandler---->
		将查询的某一条记录封装到实体类中(JavaBean:是具体类,属性私有,对外提供setXXX()/getXXX)
		Employee emp = qr.query(sql, new BeanHandler<>(实体类.class), 参数);
	BeanListHandler<T>--->
		将查询的多条记录封装到List集合中,List集合都是当前类对象
		List<实体类> list = qr.query(sql, new BeanListHandler<>(实体类.class));
	ScalarHandler--->
		通过聚合函数(count(列名称),其他max(xx),avg(xxx))查询单行单的列的数据的结果封装到Object类中
		Object object = qr.query(sql, new ScalarHandler<>());
    第三个参数:就是赋值的实际参数params,没有参数可以不写

3.Jdbc控制事务:

public void setAutoCommit(boolean auto) ;参数为true,表示自动提交,如果是false,手动提交

void rollback():事务回滚,撤销之前所有更改,必须释放连接对象,连接对象需要从线程中解绑

void commit():提交事务,将更改数据永久保存,提交完毕,释放连接对象,需要从线程中解绑

try {
    //获取连接池中的初始化连接数量中的连接对象
     conn = DruidJdbcUtils.getConnection();

    //开启手动提交模式(开启事务)
    //public void setAutoCommit(boolean auto) ;参数为true,表示自动提交,如果是false,手动提交
     conn.setAutoCommit(false) ;
	//执行的SQL语句,当作一个整体
    // void commit():提交事务,将更改数据永久保存,提交完毕,释放连接对象,需要从线程中解绑
    conn.commit(); //事务提交
    } catch (SQLException throwables) {
        //事务回滚
       // void rollback():事务回滚,撤销之前所有更改,必须释放连接对象,连接对象需要从线程中解绑
        try {
            conn.rollback();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        throwables.printStackTrace();
    } finally {
        DruidJdbcUtils.close(ps1,conn) ;
        DruidJdbcUtils.close(ps2,conn) ;
    }

四、Junit单元测试

1.Junit注解

@Test:标记这个方法是单元测试方法
@Before:标记的方法:是在执行单元测试之前执行
@After:标记的方法:是在执行单元测试之后执行

2.junit单元测试的使用步骤

1)导入junit的核心包: 4.13.1以及依赖包
2)建立测试类—XXXTest
3)定义单元测试方法,在方法上加入@Test
4)方法中要么Assert断言,要么直接测试指定功能(XXXDao—>添加,删除,修改,查询的功能)

3.应用

@Before
public void init(){
    System.out.println("执行单元测试方法之前执行了...");
}

@Test
//测试添加学生
public void testaddStudent() throws Exception {
    System.out.println("进入单元测试方法了");
}

@After
public void close(){
    System.out.println("执行单元测试方法之后执行了...");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值