JDBC技术

JDBC是java程序操作数据库的API

一 JDBC连接数据库的过程

  (1) 注册数据库驱动

      Class.forName("com.mysal.jdbc.Dirver")      //加载数据库驱动,注册数据库驱动管理器

  (2)构建数据库连接URL

      String url="jdbc:mysql://localhost:3306/test"

      url都符合一个基本的格式,即“JDBC 协议+IP地址或域名+端口+数据库名称"

   (3) 获取Connection对象

      Connection con=DriverMannager.getConnection(url,username,password);  //闯将Connection连接

二 JDBC API

  (1) Connection接口

      获得数据库的连接对象

  (2)DriverManager类

      主要作用于用户及驱动程序之间,它是JDBC中的管理层

  (3) Statement接口

      这个是实现对sql语句的管理

  (4)PreparedStatement接口

      这个接口是对Statement的扩充,应为对于sql语句中的有些操作是要传参数的,这能用PrePareStatement

      有一点个值得注意的是:使用PreparedStatement对象对sql语句的占位符参数赋值,其参数的下标值不是0,而是1

      使用这个还可以防止注入攻击

  (5) ResultSet接口

         执行sql语句的查询语句返回的结果集; 

      这里也有要强调的是:ResultSet集合中第一行数据之前与最后一行数据之后都存在一个位置,而默认情况下光标位于第一行数据之前

      所以在执行循环判断语句就会出项这样一种情况:while( rs,next())  等于是将光标移到了第一条数据的位置

三 JDBC操作数据库

  (1) 实现批处理

      我觉得主要是讲sql语句以及它们的参数分别以对象的形式进行处理

      当然在调用PreparedStatement的executebatch() 而不是调用execute()方法或executeUpdate()

  (2)   调用存储过程

      提供了CallableStatement

      语法: {call <procedure-name>[(<arg1>,<arg2>,...)]}

  

四 案例

  DBhelper

package com.yc.test1.dao;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.yc.test1.utils.LogUtil;

public class DBHelper {
    //让静态块保证数据库的驱动只加载一次
    static{
        try{                //因为只有一条语句需要调用Myproperties ,可以直接.getInstance(). 来直接调用
            Class.forName(MyProperties.getInstance().getProperty("driverclassname"));
        }catch(ClassNotFoundException e){
            LogUtil.log.error(e.toString());
            e.printStackTrace();
        }catch(IOException e){
            LogUtil.log.error(e.toString());
            e.printStackTrace();
        }
    }
    //获取与数据库的连接
    public Connection getCon() throws SQLException, IOException{
        //因为有三句语句需要Myproperties,所以getInstance 它,节省语句
        MyProperties mp=MyProperties.getInstance();
        Connection con=DriverManager.getConnection(mp.getProperty("url"),mp.getProperty("username"),mp.getProperty("password"));
        return con;
    }

    //查询数据
    public List<Map<String,String>> findAll(String sql,List<Object>params) throws SQLException, IOException{
        Connection con=getCon();
        PreparedStatement pstmt=con.prepareStatement(sql);
        setParams(pstmt,params);
        // 得到结果集
        ResultSet rs=pstmt.executeQuery();
        //取出所有的列名,存到list中
        //从结果集中取出列名
        ResultSetMetaData rsmd=rs.getMetaData();
        //取出列数
        int columnCount=rsmd.getColumnCount();
        List<String>cnlist=new ArrayList<String>();
        for(int i=1;i<=columnCount;i++){
            cnlist.add(rsmd.getColumnName(i));
        }
        List<Map<String,String>>list=new ArrayList<Map<String,String>>();
        //取出表中的数据
        while(rs.next()){
            Map<String,String>map=new HashMap<String,String>();
            //循环cnlist中所有的列名,再根据这个列名从rs 中取数据
            for(String cn:cnlist){
                map.put(cn, rs.getString(cn));
            }
            list.add(map);
        }
        closeAll(pstmt,con,rs);
        return list;
    }

    //查询聚合函数的方法: count  avg  max  min
    public double findDouble(String sql,List<Object>params) throws SQLException, IOException{
        double result=0;
        Connection con=getCon();
        PreparedStatement pstmt=con.prepareStatement(sql);
        setParams(pstmt,params);
        //得到结果集
        ResultSet rs=pstmt.executeQuery();
        if(rs.next()){
            result=rs.getDouble(1);
        }
        closeAll(pstmt,con,rs);
        return result;
    }

    //封装增删改
    public int doUpdate(String sql,List<Object>params) throws SQLException, IOException{
        Connection con=getCon();
        PreparedStatement pstmt=con.prepareStatement(sql);
        setParams(pstmt,params);
        int result=pstmt.executeUpdate();
        closeAll(pstmt,con,null);
        return result;
    }

    //封装事务的增删改
    public void doUpdate(List<String> sqls,List<List<Object>>listparams) throws SQLException, IOException{
        Connection con=getCon();
        PreparedStatement pstmt=null;
        //关闭隐式事务提交(一句sql语句提交一次)
        con.setAutoCommit(false);
        try{
            if(sqls!=null&&sqls.size()>0){
                for(int i =0 ; i<sqls.size();i++){
                    String sql=sqls.get(i);//取出每条sql 语句
                    pstmt=con.prepareStatement(sql);
                    setParams(pstmt,listparams.get(i));
                    pstmt.executeUpdate();
                }
            }
            con.commit();//提交事务
        }catch(Exception e){
            if(con!=null){
                con.rollback();
            }
            LogUtil.log.error(e.toString());
        }finally{
            con.setAutoCommit(true);//再次恢复事务为隐式事务
            closeAll(pstmt,con,null);
        }
    }

    //设置sql语句当中的参数,如果有的话
    private void setParams(PreparedStatement pstmt, List<Object> params) throws SQLException {
        if(params!=null&& params.size()>0){
            for(int i=1;i<=params.size();i++){
                pstmt.setObject(i, params.get(i-1));
            }
        }

    }
    //关闭连接
    private void closeAll(PreparedStatement pstmt,Connection con,ResultSet rs) throws SQLException{
        if(rs!=null){
            rs.close();
        }
        if(pstmt!=null){
            pstmt.close();
        }
        if(con!=null){
            con.close();
        }
    }

    public List<Map<String, String>> find(String sql, List<Object> params) throws SQLException, IOException {
        List<Map<String,String>> list=new ArrayList<Map<String,String>>();
        Connection con=getCon();
        PreparedStatement pstmt=con.prepareStatement(sql);
        setParams(pstmt,params);
        ResultSet rs=pstmt.executeQuery();

        List<String> cnames=new ArrayList<String>();
        ResultSetMetaData rsmd=rs.getMetaData();
        for(int i=0;i<rsmd.getColumnCount();i++){
            cnames.add(rsmd.getColumnName(i+1));
        }

        while(rs.next()){
            Map<String,String>map =new HashMap<String,String>();
            for(String cn:cnames){
                String value=rs.getString(cn);
                map.put(cn, value);
            }
            list.add(map);
        }
        closeAll(pstmt,con,rs);
        return list;
    }
}

  MyProperties

package com.net.dao;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class MyProperties extends Properties {
    private static MyProperties myproperties;
    //将这个类的构造方法设为私有,这样这个类就不能多次实例化了
    private MyProperties() throws IOException {
        InputStream iis = MyProperties.class.getClassLoader().getResourceAsStream("db.properties");
        super.load(iis);
    }

    //对外提供一个方法来猎取唯一的一个实例
    public static MyProperties getInstance() throws IOException {
        if ( myproperties == null) {
            myproperties = new MyProperties();
        }
        return myproperties;
    }
}

  db.properties

username=scott
password=a
driveclass=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:orcl

时间: 2024-10-24 13:55:42

JDBC技术的相关文章

使用JDBC技术连接数据库(附源码)--JAVA的简单应用

一.创建数据库(以mysql数据库为例) mysql数据库的下载安装与配置 -可参考博主之前的随笔:Windows平台下搭建MySQL数据库 创建wxb数据库-create database wxb; 使用-show databases语句可查看mysql数据库下的所有数据库名 二.使用JDBC技术连接MySQL数据库 JAVA=============JDBC===============DB 高级编程语言              结构化查询语言 JDBC: Java Database Co

Javaweb学习笔记7—JDBC技术

今天来讲javaweb的第7阶段学习. JDBC技术,关于JDBC本篇博客只介绍了它的一部分,后面博客会更加深入探讨. 老规矩,首先先用一张思维导图来展现今天的博客内容. ps:我的思维是用的xMind画的,如果你对我的思维导图感兴趣并且想看到你们跟详细的备注信息,请点击下载 另外:如果图看不清的话请右击---在新窗口中打开会清楚很多. 一,概述: 1,定义 各个数据库厂商会遵循SUN的规范提供一套访问自己公司的数据库服务器的API出现.SUN提供的规范命名为JDBC,而各个厂商提供的,遵循了J

JAVA数据库编程(JDBC技术)-入门笔记

本菜鸟才介入Java,我现在不急着去看那些基本的语法或者一些Java里面的版本的特征或者是一些晋级的知识,因为有一点.Net的OOP编程思想,所以对于Java的这些语法以及什么的在用到的时候在去发现学习一下.我现在很迫不及待用JAVA想来实现以下对数据库的增删改查.想实现就来看Java是怎么操作数据库的,回想下.Net里你可能会配置web.Config,或者你去写一些DBhelper类然后调用里面的自己定义的一些增删改查的方法,更或者你去配一些数据控件等等往往发现操作基本都是一体化的简单.现在面

JDBC技术总结(三)

1. 数据库连接池 JDBC部分的前两个总结主要总结了一下JDBC的基本操作,而且有个共同点,就是应用程序都是直接获取数据库连接的.这会有个弊端:用户每次请求都需要向数据库获得连接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设一个网站每天有10万次访问量,那么数据库服务器就需要创建10万次连接,这极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出.脱机. 为了解决上述问题,数据库连接池的技术便得到了广泛的使用.为了优化性能,应用程序一启动,就向数据库要一批连接放到池(也

JDBC技术基础整理

mysql 启动和关闭命令:启动:net start mysql 关闭:net stop mysqlmysql修改密码的命令:use mysql;update user set password=password('12345') where user='root'; 登录的命令:mysql -u root -p 新建登录用户mysql> insert into mysql.user(Host,User<Password)values("localhost","t

JDBC 技术开发

JDBC 开发: 作用:用Java语句向数据库发送请求并操作数据库. 简介: 练习: 数据库创建代码: create database day14; use day14 ; create table users( id int primary key, name varchar(40), password varchar(40), email varchar(60), birthday date ); insert into users(id,name,password,email,birthd

JDBC数据库连接技术

[学习笔记]JDBC数据库连接技术(Java Database Connectivity) 一.JDBC简介 Java是通过JDBC技术实现对各种数据库的访问的,JDBC是Java数据库连接技术的简称.它可以把数据持久保存,是一种持久化机制. 1.持久化 持久化就是将程序中的数据在瞬时状态和持久状态间转换的机制. 2.JDBC API Connection连接接口 Statement接口 ResultSet结果集接口 PerparedStatement接口 3.JDBC Driver Manag

【学习笔记】JDBC数据库连接技术(Java Database Connectivity)

一.JDBC简介 Java是通过JDBC技术实现对各种数据库的访问的,JDBC是Java数据库连接技术的简称.它可以把数据持久保存,是一种持久化机制. 1.持久化 持久化就是将程序中的数据在瞬时状态和持久状态间转换的机制. 2.JDBC API Connection连接接口 Statement接口 ResultSet结果集接口 PerparedStatement接口 3.JDBC Driver Manager(驱动程序管理器) SUN公司提供,它是JDBC体系结构的支柱,负责管理各种不同的驱动(

JDBC连接池技术

一.连接池技术 (1)Java语言通过JDBC技术访问数据库的基本过程是: 1.加载数据库驱动程序: 2.通过JDBC建立数据库连接: 3.访问数据库,执行SQL语句: 4.断开数据库连接. (2)在Web应用程序开发中,使用这种模式访问数据库时,存在很多问题,为了解决这些问题,可以采用数据库连接池技术. 连接池实际上是在一个集合对象中存储一定数量的数据库连接对象.当程序需要使用数据库连接时,请求从池中获取一个空闲的连接, 程序使用完毕后再把连接放回池中重用.连接池通过重用连接的方法,减少了创建