2七、JDBC

JDBC:java

概念:Java数据库链接,Java语言操做数据库mysql

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

 

快速入门:sql

一、导入驱动jar包数据库

二、注册驱动编程

三、获取数据库链接对象 connection安全

四、定义SQL语句app

五、获取执行SQL语句的对象 statement框架

六、执行SQL,接收返回结果函数

七、处理结果

八、释放资源

 

示例代码:

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:

一、DriverManager,驱动管理对象

        功能:一、注册驱动:告诉程序该使用哪个数据库驱动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包能够省略注册驱动的步骤

                 二、获取数据库链接

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

                        参数:一、url:指定链接的路径

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

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

                                     注意:若是链接的是本机地址,端口号为3306,那么能够省略不写

                                二、user:用户名

                                三、password:密码 

二、Connection,数据库链接对象

                一、获取执行SQL的对象Statement

                        statement createStatement();

                        preparStatement prepareStatement()

                二、管理事务

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

                        提交事务:commit()

                        回滚事务:rollback()

三、Statement,执行SQL对象

                执行sql:一、boolean execute(String sql),能够执行任意的sql

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

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

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

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

                getXXX(参数):获取数据

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

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

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

                               二、判断是否有数据

                               三、获取数据

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

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

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

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

            步骤:一、导入驱动jar包

                     二、注册驱动

                     三、获取数据库链接对象 Connection

                     四、定义sql

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

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

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

                     八、处理结果

                     九、释放资源

                注意:后期都会使用preparedStatement来完成增删改查的全部操做

                          一、能够防止SQL注入

                          二、效率更高

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中回滚事务

 

数据库链接池:

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

好处:一、节约资源

         二、用户访问高效

实现:标准接口:DataSource 

                方法:一、获取链接:getConnection()

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

          通常咱们不去实现它,有数据库厂商来实现

                一、C3P0

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

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

                                       二、定义配置文件

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

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

                                        三、建立核心对象, 数据库链接池对象 combopooledDataSource

                                        四、获取链接:getConnection

                二、Druid

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

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

                                           三、加载配置文件,Properties

                                           四、获取数据库链接池对象:经过工厂来获取,DruidDataSourceFactory

                                           五、获取链接,getConnection

 

JDBCTemplate:

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

    步骤:一、导入jar包

             二、建立jdbcTemplate对象。依赖于数据源DataSource

                        jdbcTemplate template = new jabcTemplate(ds);

            三、调用jdbcTemplate的方法完成CRUD的操做

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

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

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

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

                                                参数:RowMapper

                                                            通常咱们使用BeanPropertyRowMapper实现类,实现自动封装

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

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

                                                通常用于聚合函数的查询结果

相关文章
相关标签/搜索