美文网首页
JDBC-完结

JDBC-完结

作者: 咸小鱼404 | 来源:发表于2020-05-06 10:56 被阅读0次

    1.概念及作用

    Java DataBase Connectivity --> JDBC-->用Java连接数据库,使用标准SQL语句。
    需要导入对应数据库的Java驱动,以MySQL为例需要导入jar包 mysql-connector-java-xxx-bin.jar

    jdbc扮演的角色.png

    2.重点

    1.Statement和PreparedStatement的区别

    PreparedStatement是Statement接口的实现类,Statement有SQL注入漏洞的风险,而PreparedStatement可进行SQL语句的预编译,通过占位符?的方式防止SQL注入漏洞。
    tip: 优先使用PreparedStatement

    2.推荐使用连接池

    不使用连接池.png 使用连接池.png

    连接池中会存放很多连接,使用时拿取,不用时归还,大大减少资源开销。
    tip: 优先使用连接池

    3.抽取工具类,方便调用,减少重复代码

    以使用连接池为例,这里使用的是C3P0连接池,使用前须导入该jar包。并且推荐使用xml配置文件来配置连接池参数。

    package com.imooc.jdbc.utils;
    
    import java.sql.Connection;
    import java.sql.Statement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    import com.mchange.v2.c3p0.ComboPooledDataSource;
    
    /**
     * JDBC的工具类
     * @author geek
     *
     */
    public class JDBCUtils {
        private static final ComboPooledDataSource dataSource = new ComboPooledDataSource();
        
        /**
         * 获得连接的方法:
         * @throws SQLException 
         */
        public static Connection getConnection() throws Exception{
            Connection conn = dataSource.getConnection();
            return conn;
        }
        
        /**
         * 资源释放
         */
        public static void release(Statement stmt,Connection conn){
            if(stmt != null){
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                stmt = null;
            }
            if(conn != null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                conn = null;
            }
        }
        
        public static void release(ResultSet rs,Statement stmt,Connection conn){
            if(rs!= null){
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                rs = null;
            }
            if(stmt != null){
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                stmt = null;
            }
            if(conn != null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                conn = null;
            }
        }
    }
    

    c3p0-config.xml配置文件放在类加载目录下,即src目录下,不要直接复制到src文件夹下,必须手动拖到IDE中(eclipse),正确情况下IDE的src目录下能看到此文件!!!这样才算放入成功!!!,程序会自动寻找并配置。参数设置可参考官网,基本示例如下,可自己增加其它属性:

    <c3p0-config>
    
      <default-config>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql:///jdbctest</property>
        <property name="user">root</property>
        <property name="password">123</property>
        <property name="initialPoolSize">5</property>
        <property name="maxPoolSize">20</property>
      </default-config>
      
    </c3p0-config>
    

    3.基本示例:增删改查

    除了查为executeQuery()外,其余均为executeUpdate()

    新建测试数据库及表

    CREATE DATABASE IF NOT EXISTS jdbctest;
    
    USE jdbctest;
    
    CREATE TABLE user(
    uid INT PRIMARY KEY AUTO_INCREMENT,
    username  VARCHAR(20),
    password  VARCHAR(20),
    name VARCHAR(20)
    )ENGINE=INNODB  CHARSET=UTF8;
    
    INSERT user values(null,"admin","adminxy","administrator"),
    (null,"test","testok","helloWorld"),
    (null,"geek","123","GeekCat");
    

    示例代码如下:

    package com.imooc.jdbc.demo;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    
    import org.junit.Test;
    
    import com.imooc.jdbc.utils.JDBCUtils;
    
    /**
     * 使用JDBC自定义抽取工具类和PreparedStatement
     * @author geek
     *
     */
    
    public class JDBCDemo {
        
        @Test
        /**
         * 增
         */
        public void demo1(){
            Connection conn = null;
            PreparedStatement pstmt = null;
            try{
                // 获得连接:
                conn = JDBCUtils.getConnection();
                // 编写SQL:
                String sql = "INSERT  user (username,password,name) VALUES (?,?,?)";
                // 预处理SQL:
                pstmt = conn.prepareStatement(sql);
                // 设置参数的值:
                pstmt.setString(1, "xxyy");  //占位符编号从1开始
                pstmt.setString(2, "123");
                pstmt.setString(3, "测试");
                // 执行SQL:
                int num = pstmt.executeUpdate();
                if(num > 0){
                    System.out.println("增加成功!");
                }else{
                    System.out.println("无效");
                }
            }catch(Exception e){
                e.printStackTrace();
            }finally{
                // 释放资源
                JDBCUtils.release(pstmt, conn);
            }
        }
    
    
        @Test
        /**
         * 删
         */
        public void demo2(){
            Connection conn = null;
            PreparedStatement pstmt = null;
            try{
                // 获得连接:
                conn = JDBCUtils.getConnection();
                // 编写SQL:
                String sql = "DELETE FROM user WHERE uid = ?";
                // 预编译SQL:
                pstmt = conn.prepareStatement(sql);
                // 设置参数:
                pstmt.setInt(1, 4);
                // 执行SQL:
                int num = pstmt.executeUpdate();
                if(num > 0){
                    System.out.println("删除成功!");
                }
            }catch(Exception e){
                e.printStackTrace();
            }finally{
                JDBCUtils.release(pstmt, conn);
            }
        }
        
        @Test
        /**
         * 改
         */
        public void demo3(){
            Connection conn = null;
            PreparedStatement pstmt = null;
            try{
                // 获得连接:
                conn = JDBCUtils.getConnection();
                // 编写SQL:
                String sql = "UPDATE user SET username = ?,password = ?,name = ? WHERE uid = ?";
                // 预编译SQL:
                pstmt = conn.prepareStatement(sql);
                // 设置参数:
                pstmt.setString(1, "www");
                pstmt.setString(2, "123456");
                pstmt.setString(3, "张六");
                pstmt.setInt(4, 6);
                // 执行SQL:
                int num = pstmt.executeUpdate();
                if(num > 0){
                    System.out.println("修改成功!");
                }
            }catch(Exception e){
                e.printStackTrace();
            }finally{
                JDBCUtils.release(pstmt, conn);
            }
        }
    
    
        @Test
        /**
         * 查多条
         */
        public void demo4(){
            Connection conn = null;
            PreparedStatement pstmt = null;
            ResultSet rs = null;
            try{
                // 获得连接:
                conn = JDBCUtils.getConnection();
                // 编写SQL:
                String sql = "SELECT * FROM user";
                // 预编译SQL:
                pstmt = conn.prepareStatement(sql);
                // 设置参数
                // 执行SQL:
                rs = pstmt.executeQuery();
                while(rs.next()){
                    System.out.println(rs.getInt("uid")+"  "+rs.getString("username")+"  "+rs.getString("password")+"  "+rs.getString("name"));
                }
            }catch(Exception e){
                e.printStackTrace();
            }finally{
                JDBCUtils.release(rs, pstmt, conn);
            }
        }
    
    
        @Test
        /**
         * 查一条
         */
        public void demo5(){
            Connection conn = null;
            PreparedStatement pstmt = null;
            ResultSet rs = null;
            try{
                // 获得连接:
                conn = JDBCUtils.getConnection();
                // 编写SQL:
                String sql = "SELECT * FROM user WHERE uid = ?";
                // 预编译SQL:
                pstmt = conn.prepareStatement(sql);
                // 设置参数:
                pstmt.setObject(1, 3);
                // 执行SQL:
                rs = pstmt.executeQuery();
                // 判断结果集:
                if(rs.next()){
                    System.out.println(rs.getInt("uid")+"  "+rs.getString("username")+"  "+rs.getString("password")+"  "+rs.getString("name"));
                }
            }catch(Exception e){
                e.printStackTrace();
            }finally{
                JDBCUtils.release(rs, pstmt, conn);
            }
        }   
        
    }
    

    附:

    1.知识点
    JDBC概念,如何连接数据库,常用API,增删改查,抽取工具类减少重复代码,解决SQL注入漏洞,C3P0连接池。


    jdbc1.png jdbc2.png

    2.如何导入jar包
    在Project中新建lib文件夹,将数据库驱动的jar包mysql-connector-java-xxx-bin.jar放入lib,然后add to build path。

    相关文章

      网友评论

          本文标题:JDBC-完结

          本文链接:https://www.haomeiwen.com/subject/suempctx.html