27、JDBC

本文深入解析Java数据库连接(JDBC)的概念与操作流程,包括驱动管理、连接获取、SQL执行及结果处理,同时探讨了PreparedStatement的优势,以及如何通过JDBC控制事务。此外,文章还介绍了数据库连接池和JDBCTemplate的使用,旨在提高数据库操作的安全性和效率。
摘要由CSDN通过智能技术生成

JDBC:

概念:Java数据库连接,Java语言操作数据库

JDBC本质:其实是官方定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商其实现这套接口,提供数据库驱动jar包。我们可以使用这套接口编程,真正执行的代码是驱动jar包中的实现类

 

快速入门:

1、导入驱动jar包

2、注册驱动

3、获取数据库连接对象 connection

4、定义SQL语句

5、获取执行SQL语句的对象 statement

6、执行SQL,接收返回结果

7、处理结果

8、释放资源

 

示例代码:

public class Demo {

    public static void main(String[] args) throws Exception{
        Class.forName("com.mysql.jdbc.Driver");
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db?useSSL=false","root","123");
        String sql = "select * from Student";
        Statement stmt = connection.createStatement();
        ResultSet rs  = stmt.executeQuery(sql);
        stmt.close();;
        connection.close();
    }

}

详解JDBC:

1、DriverManager,驱动管理对象

        功能:1、注册驱动:告诉程序该使用哪一个数据库驱动jar

                            static void registerDriver(Driver driver):注册与给定的驱动程序 DriverManager

                            写代码使用 Class.forName("com.mysql.jdbc.Driver");

                             在com.mysql.jdbc.Driver类中存在静态代码块

                               static{

                                        java.sql.DriverManager.registerDriver(new Driver());

}catch(SQLException E){

                                        thorw new RuntimeException("Can't register driver");

}

                        注意:mysql 5 之后的驱动jar包可以省略注册驱动的步骤

                 2、获取数据库连接

                        方法:static Connection getConnection(String url,string user,string password)

                        参数:1、url:指定连接的路径

                                     语法: jdbc:mysql://ip地址(域名):端口号/数据库名称

                                     例如:jdbc:mysql://localhost:3306/db

                                     注意:如果连接的是本机地址,端口号为3306,那么可以省略不写

                                2、user:用户名

                                3、password:密码 

2、Connection,数据库连接对象

                1、获取执行SQL的对象Statement

                        statement createStatement();

                        preparStatement prepareStatement()

                2、管理事务

                        开启事务:setAutoCommit(boolean autoCommit):调用该方法设置参数为false,即开启事务

                        提交事务:commit()

                        回滚事务:rollback()

3、Statement,执行SQL对象

                执行sql:1、boolean execute(String sql),可以执行任意的sql

                             2、int executeUpdate(string sql),执行DML(Update,insert,delete),DDL(create,alter,drop),返回值为影响行数

                            3、ResultSet executeQuery(string sql),执行DQL(select)

4、ResultSet,结果集对象,封装查询结果

                next():游标向下移动一行,判断当前行是否是最后一行末尾,如果是返回false,不是返回true

                getXXX(参数):获取数据

                    参数:int:代表列的编号,从1开始,如:getString(1);

                            String :代表列的名称 ,如:getDouble(“balance”)

                使用步骤:1、游标向下移动一行

                               2、判断是否有数据

                               3、获取数据

                               while(rs.next()){int id = rs.getInt(1);}

5、PreparedStatement,执行SQL对象,Statement子类

            解决问题:SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接,会造成安全性问题

            预编译SQL:参数使用?作为占位符

            步骤:1、导入驱动jar包

                     2、注册驱动

                     3、获取数据库连接对象 Connection

                     4、定义sql

                     5、获取执行sql语句对象 preparedStatement Connection.prepaereStatement(String sql)

                     6、给?赋值:setXXX(参数1,参数2):参数1:?的位置编号,从1开始,参数2:?的值

                     7、执行sql,接受返回结果,不需要传递sql语句

                     8、处理结果

                     9、释放资源

                注意:后期都会使用preparedStatement来完成增删改查的所有操作

                          1、可以防止SQL注入

                          2、效率更高

public class Demo {

    public static void main(String[] args) throws Exception{
       Statement stme = null;
       Connection conn = null;
       try {
           Class.forName("com.mysql.jdbc.Driver");
           String sql="insert into Student value ('dd',18,'1992-07-05','1992-07-05')";
           conn=DriverManager.getConnection("jdbc:mysql:///db?useSSL=false","root","123");
           stme=conn.createStatement();
           int count =stme.executeUpdate(sql);
           if (count>0){
               System.out.println("成功");
           }else {
               System.out.println("失败");
           }


       }catch (Exception e){
           e.printStackTrace();
       }
       
       if (conn != null){
           try {
               conn.close();
           }catch (Exception e){
               e.printStackTrace();
           }
       }
    }

}

JDBC控制事务:

使用Connection对象来管理事务

开启事务:在执行sql之前开启事务

提交事务:当所有sql都执行完提交事务

回滚事务:在catch中回滚事务

 

数据库连接池:

概念:就是一个容器,存放数据库连接的容器,当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完以后,会将连接对象归还给容器

好处:1、节约资源

         2、用户访问高效

实现:标准接口:DataSource 

                方法:1、获取连接:getConnection()

                         2、归还连接:Connection.close()。如果连接对象是从数据库连接池中获取的,那么调用Connection.close()方法,则不会再关闭连接,而是归还连接

          一般我们不去实现它,有数据库厂商来实现

                1、C3P0

                        使用步骤:1、导入jar包,c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar

                                            注意还需要导入数据库驱动包

                                       2、定义配置文件

                                            名称:c3p0.properties 或者 c3p0-config.xml

                                            路径:直接将文件放到src目录下即可

                                        3、创建核心对象, 数据库连接池对象 combopooledDataSource

                                        4、获取连接:getConnection

                2、Druid

                            使用步骤:1、导入jar包,druid-1.0.9.jar

                                           2、定义配置文件,注意:配置文件格式为priperties ,可以叫任意名字,放置在任意目录下

                                           3、加载配置文件,Properties

                                           4、获取数据库连接池对象:通过工厂来获取,DruidDataSourceFactory

                                           5、获取连接,getConnection

 

JDBCTemplate:

spring 框架对JDBC的简单封装,提供了一个JDBCTemplate对象简化JDBC的开发

    步骤:1、导入jar包

             2、创建jdbcTemplate对象。依赖于数据源DataSource

                        jdbcTemplate template = new jabcTemplate(ds);

            3、调用jdbcTemplate的方法完成CRUD的操作

                        1、update():执行DML语句,增,删,改语句

                        2、queryForMap():查询结果将结果集封装为map集合,结果集长度只能是1。

                        3、queryForList():查询结果将结果封装为list集合,将每一条记录封装问map集合,再添加到list集合

                        4、qurey():查询结果,将结果封装为JavaBean对象

                                                参数:RowMapper

                                                            一般我们使用BeanPropertyRowMapper实现类,实现自动封装

                                                            例如:new BeanpropertyRowMapper<类型>(类型.class)

                        5、queryForObject:查询结果,将结果封装为对象

                                                一般用于聚合函数的查询结果

 

转载于:https://my.oschina.net/u/4131739/blog/3065480

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值