8.7JDBC学习

jdbc连接mysql
  • JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。是Java访问数据库的标准规范
  • JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。
  • JDBC需要连接驱动,驱动是两个设备要进行通信,满足一定通信数据格式,数据格式由设备提供商规定,设备提供商为设备提供驱动软件,通过软件可以与该设备进行通信
  • mysql的驱动mysql-connector-java-5.1.30-bin.jar
  • JDBC是接口,驱动是接口的实现,没有驱动将无法完成数据库连接,从而不能操作数据库!每个数据库厂商都需要提供自己的驱动,用来连接自己公司的数据库,也就是说驱动一般都由数据库生成厂商提供
public class TestJDBC {
    public static void main(String[] args)  {
        Connection conn =null;
        Statement stmt=null;
        ResultSet rs=null;
        String Driver ="com.mysql.jdbc.Driver";  
    try{
    //1、加载jdbc驱动程序
        Class.forName(Driver);
    
    //2、提供jdbc连接的url
    String url = "jdbc:mysql://localhost:3306/itcast";
    String username= "root";
    String password = "123456";
    //3、创建数据库的连接
     conn = DriverManager.getConnection(url,username,password);
    //4、创建一个statement,将sql语句发送到数据库
     stmt = conn.createStatement();
    //5、执行sql语句 
     rs=stmt.executeQuery("select*from student2");
    
    //6、处理结果
    while(rs.next()){
        System.out.println(rs.getString("name"));
        System.out.println(rs.getFloat("grade")); 
    }
    }catch(ClassNotFoundException e){
        e.printStackTrace();
    }catch(SQLException e){
        e.printStackTrace();
    }finally{
        
    
    //7、关闭jdbc对象
        try{
            if(rs!=null){
            rs.close();
            }
            if(stmt!=null){
            stmt.close();
            }
            if(conn!=null){
            conn.close();
            }
        }catch(SQLException e){
            e.printStackTrace();
        }
    }
    }
}
DriverManager类
  • 驱动管理者
    静态方法
    1、static tegisterDriver(Driver driver)
    用于驱动的加载
    一般下驱动的加载采用下列方式
    Class.forName("com.mysql.jdbc.Driver");
    2、static Connection getConnection(String url,String user,String password);
    返回值是Connection接口的实现类对象
    url:数据库地址
    格式:连接方式:数据库//主机IP地址:端口号/数据库名
Connection conn = DriverManager.getConnection(url,username,password);

创建出数据库的连接对象conn

Statement接口

数据库的连接对象conn调用方法createStatement();获取Statement实现类对象stmt,将SQL语句发送到数据库

Statement stmt= conn.createStatement();

通过执行者对象调用方法执行SQL语句,获取结果
1、int executeUpdate(sql);
执行数据库中的SQL 包含(insert delete update)
2、ResultSet executeQuery(String sql);
执行数据库SQL的select查询
返回的是ResultSet接口的实现类对象
ResultSet接口方法
boolean next()
有结果返回true
没有结果返回false

Statement的子接口PrepareStatement

对SQL语句编译存储,多次高效的执行SQL语句

PrepareStatement    PrepareStatement(String sql);
PreparStatement pstmt = conn.prepareStatement("insert into student2 values(?,?,?,?)");
    //5、执行sql语句 
     pstmt.setInt(1, 0);
     pstmt.setString(2, "123");
     pstmt.setInt(3, 98);
     pstmt.setString(4, "女");
     pstmt.executeUpdate();

java中Properties配置文件

* Properties类继承自Hashtable类并且实现了Map接口,也是使用一种键值对的形式来保存属性集。不过Properties有特殊的地方,就是它的键和值都是字符串类型
属性文件db.properties如下

image.png

读取db.properties属性列表

public class jdbcUtil {
   private static String driver;
   private static String url;
   private static String username;
   private static String password;
   static{
       try{
       Properties p=new Properties();
       p.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties"));
      driver= p.getProperty("Driver");
      url=p.getProperty("url");
      username=p.getProperty("username");
      password=p.getProperty("password");
      Class.forName(driver);
       }catch(IOException e){
           e.printStackTrace();
       }catch(ClassNotFoundException e){
           e.printStackTrace();
       }
   }
   public static Connection createConnection(){
       Connection conn=null;
       try {
           conn= DriverManager.getConnection(url,username,password);
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
       return conn;
   }
   public static void close (Connection conn,Statement stmt,ResultSet rs){
       try{
           if(rs!=null){
                rs.close();
           }
           if(stmt!=null){
                stmt.close();
           }
           if(conn!=null){
                conn.close();
           }
       }catch(SQLException e){
           e.printStackTrace();
       }
   }
}

p.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties"));//此处不解???????????

连接池

数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能
连接池(connection pool)
就是讲Connection接口的实现类对象放入List中,反复使用
连接池的初始化
事先放入多个连接对象
从连接池中获取连接对象
如果池中有可用连接,则将池中最后一个返回,同时,将该连接从池中remove,表示正在使用
如果池中无可用连接,则创建一个新的
关闭连接
不是真正的关闭,而是将用完的放回去

    //连接池对象
    private static List<Connection> pool;
    //最大连接数
    private static final int POOL_MAX_SIZE = 100;
    //最小连接数
    private static final int POOL_MIN_SIZE = 10;
    //声明一个临时变量来计算连接对象的数量
    private int currentsize = 0;
    
    public DBConnPool() {
        initPool();
    }
    
    //初始化连接池,让池中的连接数达到最小值
    public void initPool(){
        if(pool == null){
            pool = new ArrayList<Connection>();
        }
        while(pool.size()<POOL_MIN_SIZE){
            pool.add(jdbcUtil.createConnection());
            System.out.println("初始化池,池中连接数:"+pool.size());
            currentsize++;
        }
    }
    //从池中取连接,连接池中的最后一个
    public synchronized Connection getConnection(){
        System.out.println("连接池里资源数"+currentsize);
        int last_index;
        if(pool.size() > 0){
            last_index = pool.size()-1;
            Connection conn = pool.get(last_index);
            pool.remove(last_index);
            return conn;
        }                   
            //连接池被拿空,且连接数没有达到上限,创建新的连接
        else if(pool.size() == 0 && currentsize<POOL_MAX_SIZE){
            System.out.println("没有资源啦,要创建一个新的");
            pool.add(jdbcUtil.createConnection());
            currentsize++;
            System.out.println(currentsize);
            Connection conn = pool.get(0);
            pool.remove(0);
            return conn;
        }
        throw new RuntimeException("连接数达到上限,请等待");
        
    }
    
    //将连接池放回池中
    
    public synchronized void close(Connection conn){
        
            pool.add(conn);
        
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 161,192评论 4 369
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,186评论 1 303
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,844评论 0 252
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,471评论 0 217
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,876评论 3 294
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,891评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,068评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,791评论 0 205
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,539评论 1 249
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,772评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,250评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,577评论 3 260
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,244评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,146评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,949评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,995评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,812评论 2 276

推荐阅读更多精彩内容