蒋振飞的博客 - Java提升01:JDBC   
正在加载蒋振飞的博客...
V3.0
蒋振飞的博客

Java提升01:JDBC

发布时间: 2018年10月19日 发布人: 蒋振飞 热度: 263 ℃ 评论数: 0

一、JDBC基础

    1.JDBC全称

        JAVA Database Connectivity

    2.为什么会出现JDBC

        SUN公司提供的一种数据库访问规则、规范, 由于数据库种类较多,并且java语言使用比较广泛,sun公司就提供了一种规范,让其他的数据库提供商去实现底层的访问规则。 

    3.使用JDBC的基本步骤

        1) 注册驱动

DriverManager.registerDriver(new com.mysql.jdbc.Driver());

        2) 建立连接

//DriverManager.getConnection("jdbc:mysql://localhost/test?user=monty&password=greatsqldb");
//2. 建立连接 参数一: 协议 + 访问的数据库 , 参数二: 用户名 , 参数三: 密码。
conn = DriverManager.getConnection("jdbc:mysql://localhost/student", "root", "mysql");

         3) 创建statement

//3. 创建statement , 跟数据库打交道,一定需要这个对象
st = conn.createStatement();

        4) 得到ResultSet

//4. 执行查询 , 得到结果集
String sql = "select * from t_stu";
rs = st.executeQuery(sql);

        5) 遍历结果集

//5. 遍历查询每一条记录
while(rs.next()){
    int id = rs.getInt("id");
    String name = rs.getString("name");
    int age = rs.getInt("age");
    System.out.println("id="+id + "===name="+name+"==age="+age);
}

        6) 释放资源

try {
    if(rs != null) {
    rs.close();
    }
} catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}finally {
    rs = null;
}

    4.JDBC使用完整代码

package day14;

import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import com.mysql.jdbc.Connection;

public class JDBCDemo1 {
    public static void main(String[] args) {
        Connection conn = null;
        Statement st = null;
        ResultSet rs = null;
    		
        try {
            // 1.注册驱动
            DriverManager.registerDriver(new com.mysql.jdbc.Driver());
			
            // 2.建立连接
            conn = (Connection) DriverManager.getConnection("jdbc:mysql://localhost/students", "root", "mysql");
			
            // 3.创建statement,跟数据库交互,必须要有此对象
            st = conn.createStatement();
			
            // 4.执行查询
            String sql = "select * from t_stu";
            rs = st.executeQuery(sql);
			
            // 5.遍历循环每条记录
            while(rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                int age = rs.getInt("age");
                System.out.println("id="+id+",name="+name+"age="+age);
            }		
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            // 6.清理
            JDBCUtil.release(rs, st, conn);
        }
    }
}

二、JDBC 工具类构建

    1. 资源释放工作的整合

package day14;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;


public class JDBCUtil {

    /**
    * 获取连接对象	
    * @return
    */
    public static Connection getConn() {
        Connection conn = null;
						
        try {
            Class.forName(driveClass);
            conn = DriverManager.getConnection(url, name, password);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return conn;
    }

    /**
    * 释放资源
    * @param rs
    * @param st
    * @param conn
    */
	
    public static void release(ResultSet rs, Statement st, Connection conn) {
        closeConn(conn);
        closeRs(rs);
        closeSt(st);
    }
	
    private static void closeRs(ResultSet rs) {
        try {
            if(rs != null) {
                rs.close();
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            rs = null;
        }
    }
	
    private static void closeSt(Statement st) {
        try {
            if(st != null) {
                st.close();
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            st = null;
        }
    }
	
    private static void closeConn(Connection conn) {
        try {
            if(conn != null) {
                conn.close();
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            conn = null;
        }
    }
}

    2. 驱动防二次注册

DriverManager.registerDriver(new com.mysql.jdbc.Driver());

        Driver 这个类里面有静态代码块,一上来就执行了,所以等同于注册了两次驱动,将之前第一步的注册驱动改为

Class.forName("com.mysql.jdbc.Driver");

    3. 使用properties配置文件

        在src底下声明一个文件 xxx.properties ,里面的内容如下:

driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost/student
name=root
password=mysql

        在工具类里面,使用静态代码块,读取属性

static{
    try {
        // 1. 创建一个属性配置对象
        Properties properties = new Properties();
        InputStream is = new FileInputStream("jdbc.properties"); //对应文件位于工程根目录
				 
        // 使用类加载器,去读取src底下的资源文件。 后面在servlet  //对应文件位于src目录底下
        // InputStream is = JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");
        // 导入输入流。
        properties.load(is);
				
        // 读取属性
        driverClass = properties.getProperty("driverClass");
        url = properties.getProperty("url");
        name = properties.getProperty("name");
        password = properties.getProperty("password");
    } catch (Exception e) {
        e.printStackTrace();
    }
}

三、数据库的CRUD

    1.insert

// 1. 获取连接对象
conn = JDBCUtil.getConn();

// 2. 根据连接对象,得到statement
st = conn.createStatement();
 
// 3. 执行添加
String sql = "insert into t_stu values(null , 'aobama' , 59)";

// 影响的行数,如果大于0 表明操作成功。 否则失败
int result = st.executeUpdate(sql);
 
if(result >0 ){
    System.out.println("添加成功");
}else{
    System.out.println("添加失败");
}

    2.delete

// 1. 获取连接对象
conn = JDBCUtil.getConn();

// 2. 根据连接对象,得到statement
st = conn.createStatement();
 
//3. 执行添加
String sql = "delete from t_stu where name='aobama'";

// 影响的行数, ,如果大于0 表明操作成功。 否则失败
int result = st.executeUpdate(sql);
 
if(result >0 ){
    System.out.println("删除成功");
}else{
    System.out.println("删除失败");
}

    3.query

// 1. 获取连接对象
conn = JDBCUtil.getConn();
 
// 2. 根据连接对象,得到statement
st = conn.createStatement();

// 3. 执行sql语句,返回ResultSet
String sql = "select * from t_stu";
rs = st.executeQuery(sql);
 
// 4. 遍历结果集
while (rs.next()) {
    String name = rs.getString("name");
    int age = rs.getInt("age");
    System.out.println(name + "   " + age);
}

    4.update

// 1. 获取连接对象
conn = JDBCUtil.getConn();

// 2. 根据连接对象,得到statement
st = conn.createStatement();
 
//3. 执行添加
String sql = "update t_stu set age = 26 where name ='qyq'";

//影响的行数, ,如果大于0 表明操作成功。 否则失败
int result = st.executeUpdate(sql);
 
if(result >0 ){
    System.out.println("更新成功");
}else{
    System.out.println("更新失败");
}

四、Dao模式

    1. 新建一个dao的接口

        声明数据库访问规则。

/**
* 定义操作数据库的方法
*/
public interface UserDao {
    /**
    * 查询所有
    */
    void findAll();
}

    2. 新建一个dao的实现类

        具体实现早前定义的规则。

public class UserDaoImpl implements UserDao{

    @Override
    public void findAll() {
        Connection conn = null;
        Statement st = null;
        ResultSet rs = null;
        try {
            //1. 获取连接对象
            conn = JDBCUtil.getConn();
            //2. 创建statement对象
            st = conn.createStatement();
            String sql = "select * from t_user";
            rs = st.executeQuery(sql);
 
            while(rs.next()){
                String userName = rs.getString("username");
                String password = rs.getString("password");
 
                System.out.println(userName+"="+password);
            }
 
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
        JDBCUtil.release(conn, st, rs);
        }
    }
}

    3. 直接使用实现

@Test
public void testFindAll(){
    UserDao dao = new UserDaoImpl();
    dao.findAll();
}

五、Statement安全问题

    1. Statement执行

        先拼接sql语句,然后在一起执行。

String sql = "select * from t_user where username='"+ username  +"' and password='"+ password +"'";

UserDao dao = new UserDaoImpl();
dao.login("admin", "100234khsdf88' or '1=1");
	
SELECT * FROM t_user WHERE username='admin' AND PASSWORD='100234khsdf88' or '1=1' 
	
// 前面先拼接sql语句, 如果变量里面带有了 数据库的关键字,那么一并认为是关键字。 不认为是普通的字符串。 
rs = st.executeQuery(sql);

    2.PrepareStatement

        该对象就是替换前面的statement对象。

        相比较以前的statement, 预先处理给定的sql语句,对其执行语法检查。 在sql语句里面使用 ? 占位符来替代后续要传递进来的变量。 后面进来的变量值,将会被看成是字符串,不会产生任何的关键字。

String sql = "insert into t_user values(null , ? , ?)";
ps = conn.prepareStatement(sql);
			 
// 给占位符赋值 从左到右数过来,1 代表第一个问号,永远是1开始。
ps.setString(1, userName);
ps.setString(2, password);

打赏 蒋振飞

取消

感谢您的支持,我会继续努力的!

扫码支持
一分也是爱     一块不嫌多

点击 支付宝 或 微信 打赏蒋振飞

打开支付宝扫一扫,即可进行扫码打赏哦

评论列表