精华内容
下载资源
问答
  • JDBC技术介绍

    2013-08-18 12:52:05
    JDBC 技术介绍 Java连接数据库的技术详细介绍
  • jdbc技术介绍

    2018-12-22 23:54:10
    java和数据库连接的技术jdbc相关介绍,需要下载xmind打开
  • JDBC技术文档及接口的简单介绍,很详细的JDBC技术文档。
  • jdbc技术简介

    2016-08-31 12:27:06
    JDBC简介
  • JDBC技术简介

    2015-05-15 15:14:32
    JDBC(Java Database Conectivity)是为Java程序中访问数据库而设计的一组Java API, JDBC中包括了一组由Java语言书写的接口和类,它们都是独立于特定的DBMS。JDBC是Java数据库应用开发中的一项核心技术
  • jdbc介绍

    2019-06-07 17:26:49
    JDBC:jdk提供的java数据库连接技术,它只是一套接口规范 JDBC Driver:每个数据库厂商根据自己的数据库实现jdbc接口 jdbc基本使用过程: 1.加载驱动类:Class.forName("com.mysql.jdbc.Driver") 2.获取数据库连接:...

    jdbc

    JDBC:jdk提供的java数据库连接技术,它只是一套接口规范

    JDBC Driver:每个数据库厂商根据自己的数据库实现jdbc接口

    jdbc基本使用过程:

    1.加载驱动类:Class.forName("com.mysql.jdbc.Driver")
    2.获取数据库连接:DriverManager.getConnection()
    3.创建SQL语句执行句柄:Connection.createStatement()//connection.prepareStatement()预编译执行句柄,防注入
    4.执行SQL语句:Statement.executeUpdate()
    5.释放数据库连接资源:Connection.close()
    

    数据库连接池(C3P0,DBCP等)

    每一次java程序要在mysql中执行一条SQL语句时,都要建立一个Connection连接对象,执行完后再调用close方法关闭数据库连接。如果频繁的开关connection连接,那么会造成大量的对网络,IO资源的申请和释放的无谓的时间消耗,导致性能下降。

    数据库连接池在自己内部有一定数量的数据库连接,比如通常可能有200个左右,然后每次java程序要执行SQL时,就会从连接池中获取一个连接,执行之后又将连接返回连接池中。

    好处:
    java程序不用自己管理连接的创建和销毁。
    可以节省数据库连接的创建和销毁的资源开销以及时间开销。
    提升整个应用程序的性能。
    
    展开全文
  • JDBC介绍

    2016-05-12 11:21:05
    学习JDBC 技术目的,使用Java技术操作数据库。什么是驱动? 两个设备要进行通信,满足一定通信数据格式,数据格式由设备提供商规定,设备提供商为设备提供驱动软件,通过软件可以与该设备进行通信。如果没有JDBC,...

    JDBC介绍

    JDBC全称为:Java DataBase Connectivity(java数据库连接)。
    学习JDBC 技术目的,使用Java技术操作数据库。

    什么是驱动? 两个设备要进行通信,满足一定通信数据格式,数据格式由设备提供商规定,设备提供商为设备提供驱动软件,通过软件可以与该设备进行通信。

    如果没有JDBC,Java程序员需要面向各个数据库驱动接口编程,开发复杂 ; sun 公司提供一套统一JDBC接口规范,Java程序只需要使用JDBC就可以操作任何数据库,JDBC实现类由各个数据库厂商提供。

    学习JDK中自带JDBC接口规范:
    它们主要在两个包下:

    • java.sql
      类:DriverManger
      接口 Connection Statement ResultSet PreparedStatement
      CallableStatement(它是用于调用存储过程)
    • javax.sql
      接口 DataSource

    JDBC入门

    编写一个jdbc入门代码,完成对数据库操作。

    create table user(
       id int primary key auto_increment,
       username varchar(20) unique not null,
       password varchar(20) not null,
       email varchar(40) not null
    );
    
    INSERT INTO USER VALUES(NULL,'tom','123','tom@163.com');
    INSERT INTO USER VALUES(NULL,'fox','123','fox@163.com');    

    JDBC程序:

    // 1.注册驱动
    DriverManager.registerDriver(new Driver());
    
    // 2.获取连接对象
    Connection con = DriverManager.getConnection(
            "jdbc:mysql://localhost:3306/day17", "root", "abc");
    
    // 3.通过连接对象获取操作sql语句Statement
    Statement st = con.createStatement();
    
    // 4.操作sql语句
    String sql = "select * from user";
    
    // 操作sql语句(select语句),会得到一个ResultSet结果集
    ResultSet rs = st.executeQuery(sql);
    
    // 5.遍历结果集      
    while(rs.next()){
        int id=rs.getInt("id");
        String username=rs.getString("username");
        String password=rs.getString("password");
        String email=rs.getString("email");
    
        System.out.println(id+"  "+username+"  "+password+"  "+email);
    }
    
    //6.释放资源
    rs.close();
    st.close();
    con.close();

    JDBC操作详解

    注册驱动

    DriverManager.registDriver(new Driver());
    1. DriverManager类
      它是java.sql包下的一个驱动管理的工具类,可以理解成是一个容器(Vector),可以装入很多数据库驱动
      它的registDriver方法分析
      public static synchronized void registerDriver(java.sql.Driver driver)
      参数:java.sql.Driver
      我们传递的是 com.mysql.jdbc.Driver;

      com.mysql.jdbc.Driver类中有一段静态代码块:

      static {
          try {       
              java.sql.DriverManager.registerDriver(new Driver());                                   
          } catch (SQLException E) {
              throw new RuntimeException("Can't register driver!");           
          }
      }

      上述代码的问题:
      在驱动管理器中会装入两个mysql驱动.
      解决方案:使用反射
      Class.forName(“com.mysql.jdbc.Driver”);
      分析:使用反射的方式来加载驱动有什么好处?

      1. 只加载一次,装入一个驱动对象.
      2. 降低耦合,不依赖于驱动.
    2. 可以通过DriverManager来获取连接对象

    Connection con=DriverManager.getConection(String url,String user,String password);

    url作用:就是用于确定使用哪一个驱动.

    1. umysql url: jdbc:mysql://localhsot:3306/数据库名.
    2. oralce url: jdbc:oracle:thin:@localhost:1521:sid

    **总结:**DriverManager作用:

    1. 注册驱动
    2. 获取连接Connection

    关于url
    url格式:jdbc : mysql ://localhost:3306/day17

    主协议子协议主机端口数据库
    jdbcmysqllocalhost3306day17

    mysql的url可以简写:
    前提:主机是localhost 端口是3306
    jdbc:mysql:///day17
    在url后面可以带参数
    useUnicode=true&characterEncoding=UTF-8

    Connection详解

    java.sql.Connection,它代表的是一个连接对象。简单说,就是我们程序与数据库连接。
    Connection作用:

    1. 可以通过Connection获取操作sql的Statement对象。
      Statement createStatement() throws SQLException
      示例:
      Statement st=con.createStatement();
    2. 可以获取执行预处理的PreparedStatement对象.
      PreparedStatement prepareStatement(String sql) throws SQLException
    3. 可以获取执行存储过程的 CallableStatement
      CallableStatement prepareCall(String sql) throws SQLException
    4. 操作事务
      setAutoCommit(boolean flag);开启事务
      rollback();事务回滚
      commit();事务提交

    Statement详解

    java.sql.Statement用于执行sql语句.
    Statement作用:

    • 执行sql
      DML:执行insert update delete用executeUpdate
      int executeUpdate(String sql)
      利用返回值判断非0来确定sql语句是否执行成功。
      DQL:执行select用executeQuery
      ResultSet executeQuery(String sql)
      可以通过execute方法来执行任何sql语句.
      execute(String sql):用于向数据库发送任意sql语句
    • 批处理
      addBatch(String sql); 将sql语句添加到批处理
      executeBatch();批量执行
      clearBatch();清空批处理.

    ResultSet详解

    java.sql.ResultSet它是用于封装select语句执行后查询的结果。
    常用API:

    • next()方法
      public boolean next();
      用于判断是否有下一条记录。如果有返回true,并且让游标向下移动一行。
      如果没有返回false.

    • 可以通过ResultSet提供的getXxx()方法来获取当前游标指向的这条记录中的列数据。
      参数有两种
      getInt(int columnIndex);
      getInt(String columnName);
      如果列的类型不知道,可以通过下面的方法来操作
      getObject(int columnIndex);
      getObject(String columnName);

    关闭资源

    Jdbc程序运行完后,切记要释放程序在运行过程中,创建的那些与数据库进行交互的对象,这些对象通常是ResultSet, Statement和Connection对象。
    特别是Connection对象,它是非常稀有的资源,用完后必须马上释放,如果Connection不能及时、正确的关闭,极易导致系统宕机。Connection的使用原则是尽量晚创建,尽量早的释放。
    为确保资源释放代码能运行,资源释放代码也一定要放在finally语句中。

    展开全文
  • JDBC技术详解

    千次阅读 2016-12-01 00:52:06
    (一)JDBC介绍 (二)驱动的原理及使用 (三)JDBC核心使用 (四)DriverManager、Connection、Statement、ResultSet详细使用 (五)JDBC的CURD操作 (六)防止SQL注入及PrepareStatement使用

    JDBC基础

    1.JDBC介绍

    JDBC是java访问[对象型数据库/关系型数据库]数据库的规则,是原SUN公司开发的.

    原来我们程序员需要针对具体的数据库操作,费时费力;
    自从有了JDBC规则后,程序员只需要针对JDBC规则编程,不用管底层具体数据库的实现,
    好处在于:写一份JDBC代码,可以在很多数据库在执行,即可移植性

    2.驱动的原理及使用

    就是JDBC规则,在具体数据库中的实现类,且用java书写(需要安装JDK)

    3.JDBC核心使用

    做jdbc代码,需要用到如下几个固定步骤,以查询为例:

    • 1_注册mysql数据库服务器的驱动,DriverManager
    • 2_获取mysql数据库服务器的连接,Connection
    • 3_获取封装sql语句的对象,Statement
    • 4_执行sql语句,并返回结果集合,ResultSet
    • 5_迭代这个结果集合,while(){}
    • 6_按轻到重的原则关闭连接对象,ResultSet-Statement-Connection,在必要情况下,Connection可重用

    4.DriverManager(类)、Connection(接口)、Statement(接口)、ResultSet(接口)详细使用

    • DriverManager:
      它是一个类,由原SUN公司提供,负责管理一个或一组访问具体数据库的驱动,
      即你想访问Oracle数据库服务器的话,就让DriverManager加载Oracle驱动,
      只需注册一次就行

    • Connection:
      是原SUN公司提供的接口,是属于重量级对象,建议少创建,要重用
      只要你想与数据库进行操作,必须获取连接对象

      jdbc:mysql://127.0.0.1:3306/mydb1","root","123"
      jdbc:主协议,你只要使用jdbc技术访问数据库,都是jdbc主协议
      mysql:子协议
      127.0.0.1:MySQL数据库服务器所在PC的IP地址或域名,建议用IP
      3306:MySQL数据库服务器所在的PC的端口号
      mydb1:访问数据库服务器中哪一个具体的数据库
      root:用户名
      123:密码,如果没有密码的话,也需要写""空字符串
      
    • Statement:
      负责封装SQL语句并执行的对象,是原SUN公司提供的接口

      SQL语句在JDBC中分为二大类
      1_静态SQL:SQL语句中无?符号,即select id,name from users where name = '张三'(上)
      2_动态SQL:SQL语句中有?符号,即select id,name from users where name = ?
                 ?号由程序在运行时动态设置的值
      
    • Statement常用的API:
      查询:executeQuery(参数为静态SQL),返回值为ResultSet
      增删改:executeUpdate(参数为静态SQL),返回值为Int,表示影响表格行数

    • ResultSet:
      负责装查询语句的结果,默认情况下,游标位于第一条记录的前边。
      next()方法就能向下移动一行,如果有结果,返回true

    5.jdbc的crud

    • 增删改:Statment.executeUpdate(),返回值为int,表示这次操作影响了表中的几条记录
    • 查询:Statment.executeQuery(),返回值为ResultSet,表示这次查询操作结果记录数形成的集合

    6.sql注入

    • 客户端利用jdbc-Statement的缺点,传入非法参数,从而让jdbc返回不合法的值,我们利用这种情况,通称为sql注入.
    • 现在项目中不直接使用Statement,使用PreparedStatement,PreparedStatement它除了具有Statement是所有功能外,还有动态sql处理能力,包括:程序执行时动态为?符设置值,安全检查,避免sql注入问题,预处理能力

    • ?表示占位符,只能出现在字段值的位置,不能替代表名,不能替代列名;
      ?表示的字段值,不管是什么类型,都不用加”符号

    • Statement和PreparedStatement的区别:
      Statement只能处理静态SQL;
      PreparedStatement既能处理静态sql也能处理动态sql,它继承了Statement的特点

    • 站在预处理角度:
      PreparedStatement适合做连续多次结构相同的sql语句,有优势.
      Statement适合做连续多次不同结构的sql语句,有优势.

    • 项目中,我们都用子接口,
      1_支持动态sql,也支持静态sql
      2_预处理

      ---相同结构的sql
      select id,name,from users where id=1;
      select id,name,gender from users where id=2;
      是不相同结构 
      ---不同结构的sql
      
    • 声明:
      静态sql也可以用PreparedStatement

    适合:
    静态sql—优先Statement;
    动态sql—优先PreparedStatement

    Statement代码实现:

        import java.sql.Connection;
        import java.sql.DriverManager;
        import java.sql.ResultSet;
        import java.sql.SQLException;
        import java.sql.Statement;
    
        /**
         * JDBC开发
         */
        public class Demo {
        static{
            //1)注册一个MySQL数据库驱动,因为你现在要访问的是MySQL数据库服务器,用反射
            //好处:只向DriverManager注册一次MySQL驱动
            //好处:无需导入MySQL具体的类名
            try {
                Class.forName("com.mysql.jdbc.Driver");
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
        /**
         * 查询所有用户
         */
        public void findAllUser() throws Exception{
            Connection conn = null;
            Statement stmt = null;
            ResultSet rs = null;
            try {
                //NO2)获取JavaApp与MySQL数据库服务器的连接
                conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mydb1","root","123");
                //NO3)创建封装SQL语句的对象
                stmt = conn.createStatement();
                //NO4)执行SQL语句,返回结果集合,里面存放装SQL语句执行结果,即是四条记录
                rs = stmt.executeQuery("select id,username,gender,hiredate from users");
                //NO5)迭代结果集合,在默认情况下,游标指向第一条记录之前,通过next方法将游标下移一条,如果有记录存在,返回true;否则false
                while(rs.next()){
                    //获取一条中id列名对应的值
                    int id = rs.getInt("id");
                    String username = rs.getString("username");
                    String gender = rs.getString("gender");
                    //在与JDBC访问时,MySQL中的date,对应java中的java.sql.Date
                    java.sql.Date hiredate = rs.getDate("hiredate");
    
                    System.out.println(id+"#"+username+"#"+gender+"#"+hiredate);
                }
            } catch (SQLException e) {
                e.printStackTrace();
                //通知调用者,给前台用户提示,html/jsp
                throw e;
            } finally{
                //NO6)关闭上述用过的连接对象
                if(rs!=null){
                    try {
                        rs.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }finally{
                        //GC回收
                        rs = null;
                    }
                }
                if(stmt!=null){
                    try {
                        stmt.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }finally{
                        //GC回收
                        stmt = null;
                    }
                }
                //后期重用Connection
                if(conn!=null){
                    try {
                        conn.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }finally{
                        //GC回收
                        conn = null;
                    }
                }
            }
        }
    
        /**
         *  主方法
         */
        public static void main(String[] args) throws Exception{
            Demo dao = new Demo();
            dao.findAllUser();
        }
    }
    

    PreparedStatement完成对users表的CURD操作,代码实现:

        import java.sql.Connection;
        import java.sql.PreparedStatement;
        import java.sql.ResultSet;
        import cn.itheima.entity.User;
        import cn.itheima.utils.JdbcUtils;
    
        /**
         * 演示PreparedStatement完成对users表的CURD操作
         */
        public class Demo01 {
            /**
             * 增加用户 
             */
            public void add(User user){
                Connection conn = null;
                PreparedStatement pstmt = null;
                ResultSet rs = null;
                String sql = "insert into users(username,gender,hiredate) values(?,?,?)";
                try{
                    conn = JdbcUtils.getConnection();
                    pstmt = conn.prepareStatement(sql);
                    pstmt.setString(1,user.getUsername());
                    pstmt.setString(2,user.getGender());
                    pstmt.setDate(3,new java.sql.Date(user.getHiredate().getTime()));
                    int i = pstmt.executeUpdate();
                    System.out.println(i>0?"成功":"失败");
                }catch(Exception e){
                    e.printStackTrace();
                    throw new RuntimeException("增加用户失败");
                }finally{
                    JdbcUtils.close(rs);
                    JdbcUtils.close(pstmt);
                    JdbcUtils.close(conn);
                }
            }
            /**
             * 修改用户 
             */
            public void update(String oldUsername,String newUsername){
                Connection conn = null;
                PreparedStatement pstmt = null;
                ResultSet rs = null;
                String sql = "update users set username = ? where username = ?";
                try{
                    conn = JdbcUtils.getConnection();
                    pstmt = conn.prepareStatement(sql);
                    pstmt.setString(1,newUsername);
                    pstmt.setString(2,oldUsername);
                    int i = pstmt.executeUpdate();
                    System.out.println(i>0?"成功":"失败");
                }catch(Exception e){
                    e.printStackTrace();
                    throw new RuntimeException("增加用户失败");
                }finally{
                    JdbcUtils.close(rs);
                    JdbcUtils.close(pstmt);
                    JdbcUtils.close(conn);
                }
            }
            /**
             * 查询用户 
             * @param lastname 在这里表示姓
             * @param gender 性别
             */
            public void find(String lastname,String gender){
                Connection conn = null;
                PreparedStatement pstmt = null;
                ResultSet rs = null;
                //String sql = "select * from users where username like '赵%' and gender = '男'";
                String sql = "select id,username,gender,hiredate from users where username like ? and gender = ?";
                try{
                    conn = JdbcUtils.getConnection();
                    pstmt = conn.prepareStatement(sql);
                    pstmt.setString(1,lastname+"%");
                    pstmt.setString(2,gender);
                    rs = pstmt.executeQuery();
                    while(rs.next()){
                        int id = rs.getInt("id");
                        String username = rs.getString("username");
                        gender = rs.getString("gender");
                        java.sql.Date hiredate = rs.getDate("hiredate");
                        System.out.println(id+"#"+username+"#"+gender+"#"+hiredate);
                    }
                }catch(Exception e){
                    e.printStackTrace();
                    throw new RuntimeException("查询用户 失败");
                }finally{
                    JdbcUtils.close(rs);
                    JdbcUtils.close(pstmt);
                    JdbcUtils.close(conn);
                }
            }
            /**
             * 批量删除用户 
             */
            public void delete(int... ids){
                Connection conn = null;
                PreparedStatement pstmt = null;
                ResultSet rs = null;
                StringBuffer sb = new StringBuffer("delete from users where id in (");
                for(int id : ids){
                    sb.append(id+",");
                }
                //删除最后一个逗号
                sb.deleteCharAt(sb.length()-1);
                //在最后拼接)
                sb.append(")");
                String sql = sb.toString();
                try{
                    conn = JdbcUtils.getConnection();
                    pstmt = conn.prepareStatement(sql);
                    int i = pstmt.executeUpdate();
                    System.out.println(i>0?"成功":"失败");
                }catch(Exception e){
                    e.printStackTrace();
                    throw new RuntimeException("批量删除用户失败");
                }finally{
                    JdbcUtils.close(rs);
                    JdbcUtils.close(pstmt);
                    JdbcUtils.close(conn);
                }
            }
    
    
    
    
            public static void main(String[] args) {
                Demo01 test = new Demo01();
                User user = new User();
                user.setUsername("张三");
                user.setGender("男");
                user.setHiredate(new java.util.Date());
                //test.add(user);
                //test.update("张三","李四");
                //test.find("赵","男");
                test.delete(1,6,7);
            }
        }
    
    展开全文
  • JDBC技术.pdf

    2008-05-12 22:48:26
    JDBC技术,详细介绍,使用方法,武汉科技大学的课件
  • SQL技术与JDBC技术.rar

    2009-07-31 09:29:26
    SQL技术与JDBC技术介绍,偏重于SQL技术的讲解。
  • jdbc详细介绍学习一

    2018-07-02 21:04:38
    JDBC介绍JDBC介绍JDBC全称为:Java DataBase Connectivity(java数据库连接)。l SUN公司为了简化、统一对数据库的操作,定义了一套Java操作数据库的规范,称之为JDBC。学习JDBC 技术目的,使用Java技术操作...

    JDBC介绍

    JDBC介绍

    l JDBC全称为:Java DataBase Connectivityjava数据库连接)。

    l SUN公司为了简化、统一对数据库的操作,定义了一套Java操作数据库的规范,称之为JDBC

    学习JDBC 技术目的,使用Java技术操作数据库中数据记录

     

    什么是驱动? 两个设备要进行通信,满足一定通信数据格式,数据格式由设备提供商规定,设备提供商为设备提供驱动软件,通过软件可以与该设备进行通信

     

    如果没有JDBCJava程序员需要面向各个数据库驱动接口编程,开发复杂 ; sun 公司提供一套统一JDBC接口规范,Java程序只需要使用JDBC就可以操作任何数据库,JDBC实现类由各个数据库厂商提供,

     

    学习JDBC

    1、学习JDK中自带JDBC接口规范  java.sql javax.sql

    DriverManager 驱动管理类

    Connection 连接接口

    Statement (PreparedStatementCallableStatement) 数据库操作

    ResultSet 结果集接口

     

    2、必须在工程中引入不同数据库驱动实现

     

    JDBC体验

    编程从user表中读取数据,并打印在命令行窗口中。

    create table user(

       id int primary key auto_increment,

       username varchar(20) unique not null,

       password varchar(20) not null,

       email varchar(40) not null

    );

    一、搭建实验环境

    1、在mysql中创建一个库,并创建user表和插入表的数据。

    2、新建一个Java工程,并导入数据驱动。

    二、编写程序,在程序中加载数据库驱动

    DriverManager. registerDriver(Driver driver)

    三、建立连接(Connection)

    Connection conn = DriverManager.getConnection(url,user,pass); 

    四、创建用于向数据库发送SQLStatement对象,并发送sql

    Statement st = conn.createStatement();

    ResultSet rs = st.executeQuery(sql);

    五、从代表结果集的ResultSet中取出数据,打印到命令行窗口

    六、断开与数据库的连接,并释放相关资源

     

    JDBC API 详解(重点)

    DriverManager

    static void registerDriver(Driver driver)  注册一个JDBC驱动程序

    注意:DriverManager中可以同时注册多个JDBC驱动 例如:同时注册 mysqloralcedb2 驱动 ,通过对JDBC URL分析,决定采用哪个驱动

    static Connection getConnection(String url, String user, String password)  根据jdbc url 和 用户名、密码获得一个数据库连接

     

    实际开发中,不推荐使用DriverManager.registerDriver 会导致驱动注册两次、会使得程序依赖 具体数据库API

    推荐使用 Class.forName("com.mysql.jdbc.Driver"); 加载Driver类时完成驱动注册,使得程序不依赖MySQLAPI

     

    ***** 不要引入 与数据库相关 具体 API

     

    JDBC URL

    jdbc:mysql://localhost:3306/demo

    这里 jdbc: JDBC连接协议

    这里 mysql:// mysql数据库连接协议,JDBC子协议

    localhost:3306 主机和端口

    数据库

     

    常用数据库URL写法

    MYSQL jdbc:mysql://localhost:3306/demo

    ORACLE jdbc:oracle:thin:@localhost:1521:sid

     

     

     

    创建数据表 users

    create table users(

       id int primary key ,

       username varchar(20) unique not null,

       password varchar(20) not null,

       email varchar(40) not null

    );

     

    插入一些数据记录

    insert into users values(1,'zhangsan','123','zhangsan@learn.cn');

    insert into users values(2,'lisi','123','lisi@learn.cn');

    insert into users values(3,'wangwu','123','wangwu@learn.cn');

     

    oracle中执行 insert update delete 后 必须使用commit 操作

     

    4) 在工程引入oraclejdbc 驱动

    安装目录\app\oracle\product\10.2.0\server\jdbc\lib\ojdbc14.jar

     

    5) 修改Oracle驱动类 oracle.jdbc.driver.OracleDriver  URL  jdbc:oracle:thin:@localhost:1521:orcl

     

    MySQL 如果连接localhost:3306 可以省略

    jdbc:mysql://localhost:3306/day13 --------------- jdbc:mysql:///day11

    JDBCURL 可以通过?& 携带参数

    常用属性:useUnicode=true&characterEncoding=UTF-8 ----------- 解决操作数据库乱码问题

     

    Connection 连接接口

    应用一:获得SQL的操作对象

    Statement  conn.createStatement() 该对象可以将SQL发送给数据库进行执行

    PreparedStatement conn.prepareStatement(sql) SQL语句进行预编译,防止SQL注入

    CallableStatement conn.prepareCall(sql); 该对象可以调用数据库中存储过程 (以后Oracle学习)

     

    应用二:对数据库事务进行管理(明天)

    conn.setAutoCommit(boolean); 设置事务是否自动提交

    conn.commit(); 提交数据库事务

    conn.rollback(); 回滚数据库事务

    Statement 用于将SQL 发送给数据库 获得操作结果

    发送单条SQL

    executeUpdate 用于向数据库发送 insert update delete 语句,返回int 类型参数,代表影响记录行数

    executeQuery  用于向数据库发送 select 语句,返回ResultSet 结果集对象

    execute 用于数据库发送任何SQL语句(包括 DDL DML DCL) 返回boolean SQL执行结果是ResultSet 返回true,否则 false

     

    发送多条SQL

    addBatch(sql) SQL加入批处理队列

    executeBatch() 执行队列中所有SQL语句 ,一次性向数据库发送多条SQL

     

    使用ResultSet 遍历结果集

    while(rs.next()){

       // 根据数据库内部 列类型,选择相应 getXXX方法

       int ---- getInt

       varchart ---- getString

       date ----- getDate

    }

     

    java.sql 定义DateTime TimeStamp 对应数据库中 date time timestamp 类型 --------------- java.sql.Date/Time/TimeStamp 都是 java.util.Date 子类

    java.sql.Date 只有日期没有时间

    java.sql.Time 只有时间没有日期

    java.sql.TimeStamp 既有日期也有时间

     

    getXXX 有两种写法 第一种 getString(index) 结果集中列索引 第二种 getString(列名)

     

    思考:如果SQL语句可能会返回一行数据,也可能查不到任何记录时,代码应该怎么写? ----- 用于登陆

    if(rs.next()){

      // 查到了数据

    }else{

      // 没有查到数据

    }

     

    ResultSet 高级应用 ---- 滚动结果集

    Connection 接口的 createStatement()  返回Statement对象,操作SQL后 产生ResultSet 默认执行next 向前滚动,不支持在滚动中对数据进行修改 (只读不执行滚动)

    Connection 接口还提供 createStatement(int resultSetType, int resultSetConcurrency) 在创建Statement对象 设置结果集类型,并发策略

     

    结果集类型

    ResultSet.TYPE_FORWARD_ONLY 只能向前,只能调用next 不能向回滚动

    ResultSet.TYPE_SCROLL_INSENSITIVE 支持结果集向回滚动,不能查看修改结果

    ResultSet.TYPE_SCROLL_SENSITIVE  支持结果集向回滚动,查看修改结果

     

    结果集并发策略

    ResultSet.CONCUR_READ_ONLY 只读

    ResultSet.CONCUR_UPDATABLE 支持修改

     

    常见三种组合

    ResultSet.TYPE_FORWARD_ONLY ResultSet.CONCUR_READ_ONLY  (默认) 只读不支持向回滚动

    ResultSet.TYPE_SCROLL_INSENSITIVE ResultSet.CONCUR_READ_ONLY  只读,支持向回滚动

    ResultSet.TYPE_SCROLL_SENSITIVE ResultSet.CONCUR_UPDATABLE 支持向回滚动,支持对数据修改

    JDBC完成CRUD示例

    编写对user表 增删改查程序,从重复代码中提取公共方法 JDBCUtils 工具类 ,将数据库连接参数写入properties 配置文件

     

    示例代码

     

    DAO模式

    DAO模式(Data Access Object 数据访问对象):在持久层通过DAO将数据源操作完全封装起来,业务层通过操作Java对象,完成对数据源操作

    * 业务层无需知道数据源底层实现 ,通过java对象操作数据源

     

    DAO模式结构

    1、数据源(MySQL数据库)

    2Business Object 业务层代码,调用DAO完成 对数据源操作

    3DataAccessObject 数据访问对象,持久层DAO程序,封装对数据源增删改查,提供方法参数都是Java对象

    4TransferObject 传输对象(值对象) 业务层通过向数据层传递 TO对象,完成对数据源的增删改查

     

    DAO登录示例

     

    使用三层结构和DAO模式登陆

    cn.learn.web  ---- 表现层

    cn.learn.service ---- 业务层

    cn.learn.dao ----- 持久层

    cn.learn.domain ----- 对应数据表实体类 TO对象

     

    1、编写login.jsp 登陆表单,提交 /demo/login

    2、编写LoginServlet 获得请求数据,调用业务层UserService

    3UserService编写业务逻辑,调用数据层UserDAO 返回结果

    4、在LoginServlet获得结果,判断结果跳转页面

     

    示例代码

     

    SQL注入

    由于没有对用户输入进行充分检查,而SQL又是拼接而成,在用户输入参数时,在参数中添加一些SQL 关键字,达到改变SQL运行结果的目的,也可以完成恶意攻击。

     

    String sql = select * from user where username ='' and password ='' ;

     

    例如:

    一、输入 username: 老李' or '1'='1    password 随意

    select * from user where username ='老李' or '1'='1' and password ='';

    * and 优先级 执行 高于 or

     

     

    解决SQL注入:使用PreparedStatement 取代 Statement

    PreparedStatement 解决SQL注入原理,运行在SQL中参数以?占位符的方式表示

    select * from user where username = ? and password = ? ;

    将带有?SQL 发送给数据库完成编译 (不能执行的SQL 带有?SQL 进行编译 叫做预编译),在SQL编译后发现缺少两个参数

    PreparedStatement 可以将? 代替参数 发送给数据库服务器,因为SQL已经编译过,参数中特殊字符不会当做特殊字符编译,无法达到SQL注入的目的

     

    问题:

    SQL注入原理是什么?

    1.在输入时连接一个永远为真的一个值

    2.使用mysql 中的 – 注释

    为什么PreparedStatement 可以防止SQL注入 ?

    因为它对sql语句进行预编译。

     

     

    JDBC处理大数据

    在实际开发中,程序需要把大文本 Text 或二进制数据 Blob保存到数据库。

    l Textmysql叫法,Oracle中叫Clob

     

    基本概念:大数据也称之为LOB(Large Objects)LOB又分为:

    • clobblob

    • clob用于存储大文本。Text

    • blob用于存储二进制数据,例如图像、声音、二进制文等。

     

    MySQL而言只有blob,而没有clobmysql存储大文本采用的是TextTextblob分别又分为:

    • TINYTEXT(255)TEXT(64k)MEDIUMTEXT(16M)LONGTEXT(4G)

    • TINYBLOBBLOBMEDIUMBLOBLONGBLOB

    JDBC进行批处理

    业务场景:当需要向数据库发送一批SQL语句执行时,应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升执行效率。

    l 实现批处理有两种方式,第一种方式:

    • Statement.addBatch(sql)

    • 执行批处理SQL语句

    • executeBatch()方法:执行批处理命令

    • clearBatch()方法:清除批处理命令

    采用Statement.addBatch(sql)方式实现批处理:

    • 优点:可以向数据库发送多条不同的SQL语句。

    • 缺点:

    l SQL语句没有预编译。

    当向数据库发送多条语句相同,但仅参数不同的SQL语句时,需重复写上很多条SQL语句。例如:

    Insert into user(name,password) values(aa,111);

    Insert into user(name,password) values(bb,222);

    Insert into user(name,password) values(cc,333);

    Insert into user(name,password) values(dd,444);

     

    l 实现批处理的第二种方式:

    • PreparedStatement.addBatch()

     

    采用PreparedStatement.addBatch()实现批处理

    • 优点:发送的是预编译后的SQL语句,执行效率高。

    • 缺点:只能应用在SQL语句相同,但参数不同的批处理中。因此此种形式的批处理经常用于在同一个表中批量插入数据,或批量更新表的数据。

     

    : 

    默认使用PreparedStatement是不能执行预编译的,这需要在url中给出useServerPrepStmts=true参数(MySQL Server 4.1之前的版本是不支持预编译的,而Connector/J5.0.5以后的版本,默认是没有开启预编译功能的)。

    例如:jdbc:mysql://localhost:3306/test?useServerPrepStmts=true

    这样才能保证mysql驱动会先把SQL语句发送给服务器进行预编译,然后在执行executeQuery()时只是把参数发送给服务器。

     

    当使用不同的PreparedStatement对象来执行相同的SQL语句时,还是会出现编译两次的现象,这是因为驱动没有缓存编译后的函数key,导致二次编译。如果希望缓存编译后函数的key,那么就要设置cachePrepStmts参数为true。例如:

    jdbc:mysql://localhost:3306/test?useServerPrepStmts=true&cachePrepStmts=true

     

    MySQL的批处理也需要通过参数来打开:rewriteBatchedStatements=true

    例如:jdbc:mysql://localhost:3306/test?rewriteBatchedStatements=true

     

    Mysql驱动要使用mysql-connector-java-5.1.13以上

     

    展开全文
  • JDBC

    2014-03-01 20:23:55
    JDBC 技术概述 JDBC (Java Database Connectivity)是一种用于执行 SQL 语句的 Java API。它由一组用 Java 编程语 言编写的类和接口组成,为 Java 应用程序与各种不同数据库之间...23.1.1 JDBC 技术介绍 应用
  • JDBC接口技术介绍2

    2001-06-03 12:01:00
    JDBC接口技术(07-29 10:13:45) 作者:郑林峰 张公忠 JDBC是一种可用于执行SQL语句的JavaAPI(ApplicationProgrammingInterface应用程序设计接口)。它由一些Java语言编写的类和界面组成。JDBC为数据库应用开发人员、...
  • JDBC介绍

    2007-04-24 18:24:00
    JDBC介绍 JDBC是Java的开发者??Sun的Javasoft公司制定的Java数据库连接(Java Data Base Connectivity)技术的简称,是为各种常用数据库提供无缝联接的技术JDBC在Web和Internet应用程序中的作用和ODBC在Windows系列...
  • JDBC介绍

    2013-08-25 22:00:18
    JDBC是Java的开发者??Sun的Javasoft公司制定的Java数据库连接(Java Data Base Connectivity)技术的简称,是为各种常用数据库提供无缝联接的技术JDBC在Web和Internet应用程序中的作用和ODBC在Windows系列平台...
  • JDBC核心技术精讲

    2020-09-14 12:04:38
    本课程《JDBC核心技术精讲》为JavaWeb必学课程。课程内容丰富全面,全程手写代码,可以带你一步一步学会JDBC!课程内容涵盖如下:1、JDBC概述及核心类介绍 2、JDBC入门案例 3、Statement对象介绍和使用4、...
  • JDBC核心技术

    千次阅读 2020-05-27 10:45:41
    JDBC核心技术 第1章:JDBC概述 1.1 数据的持久化 持久化(persistence):把数据保存到可掉电式存储设备中以供之后使用。大多数情况下,特别是企业级应用,数据持久化意味着将内存中的数据保存到硬盘上加以”固化”...
  • JDBC接口技术介绍1

    2001-06-03 11:59:00
    JDBC是一种可用于执行SQL语句的JavaAPI(ApplicationProgrammingInterface应用程序设计接口)。它由一些Java语言编写的类和界面组成。JDBC为数据库应用开发人员、数据库前台工具开发人员提供了一种标准的应用程序...
  • 1.什么是JDBC JDBC全称为:Java Data Base Connectivity,它是可以执行SQL语句的Java API 2.为什么我们要用JDBC 市面上有非常多的数据库,本来我们是需要根据不同的数据库学习不同的API,sun公司为了简化这个...
  • JDBC简单介绍和了解

    2020-07-22 12:16:49
    java 是通过JDBC技术实现对各种数据库访问的,JDBC是java数据库连接技术的简称,它充当了java应用程序与各种不同数据库之间进行对话的媒介。他可以把数据持久保存,这就是一种持久化机制。 持久化是将程序中的数据在...
  • Java EE之JDBC技术

    千次阅读 2016-06-02 14:06:56
    Java EE 之 JDBC介绍Java Database Connectivity(使用java操作数据库的标准接口,任何java访问数据库框架最终底层都是基于jdbc接口实现 来操作数据库的,只是框架对jdbc有所封装).JDBC是java ee众多标准其中一个。...
  • 快速掌握使用shardingjdbc框架,shardingjdbc是目前国内最热门的分库分表框架,更是大型高并发网络公司的技术架构?
  • JDBC技术(三)

    千次阅读 2020-01-07 22:02:13
    JDBC工具类: 在上次我们使用的工具类中,我们只能使用mysql的数据库获取连接,如果要做修改则会很麻烦,这就是我们将代码写的“太死了“,我们可以通过properties集合的方式,将代码写入文件中,最后将文件中内容...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 74,260
精华内容 29,704
关键字:

jdbc技术介绍