JDBC-完结

2020-05-06  本文已影响0人  咸小鱼404

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。

上一篇下一篇

猜你喜欢

热点阅读