【JDBC/MVC个人笔记】JDBC 六部曲、三个类的作用、反射注册驱动、properties 文件封装属性

———————————————————————————————————————————————————————

READING TIPS

纯小白,仅作自学用复习笔记,仅供参考。

———————————————————————————————————————————————————————

MVC

  1. controller 调用 services
  2. services(业务管理层)访问 dao
  3. dao 访问数据库
    MVC三层之间的相互关系

———————————————————————————————————————————————————————

JDBC 是啥呀?

JDBC (Java database connectity)

  • 用 Java 语言连接数据库
  • 是 SUN 公司提供的一套接口,大部分都是数据库厂商提供的 jar 包

MySQL —— SQL Server —— Oracle

连接数据库后,就可以用 Java 对数据库数据进行操作了。

———————————————————————————————————————————————————————

了解三个类的作用:Connection,PreparedStatement,ResultSet

1. Connection

与特定数据库的连接(会话)。 执行 SQL 语句并在连接的上下文中返回结果。

Connection 对象的数据库能够提供描述其表,其支持的 SQL 语法,其存储过程,此连接的功能等的信息。

简单来说,应该就是用来连接数据库的。

———————————————————————————————————————————————————————

2. PreparedStatement

*PreparedStatement extends Statement

表示预编译的 SQL 语句的对象。

SQL 语句已预编译并存储在 PreparedStatement 对象中。然后可以使用该对象多次有效地执行此语句。

此处转载两篇CSDN中的文章
Java JDBC PreparedStatement类
java中PreparedStatement和Statement详细讲解

  • Statement 对象,每执行一条语句,都会让数据库先编译再运行。

  • PreparedStatement 对象,则会相同语句、不同参数(通过 ? 号传入)进行一次编译。

所以, PreparedStatement 对象有两个优点:

  1. 预编译功能提高了执行效率
  2. 通过 “ ? ” 传递参数,可以防止 SQL 注入,安全性高

———————————————————————————————————————————————————————

3. ResultSet

表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。

ResultSet 对象保持一个光标指向其当前的数据行。 最初,光标位于第一行之前。

next 方法将光标移动到下一行,并且由于在 ResultSet 对象中没有更多行时返回 false ,因此可以在 while 循环中使用循环来遍历结果集。

默认的 ResultSet 对象不可更新,并且只有一个向前移动的光标。

因此,我们只能从第一行到最后一行迭代一次。 可以生成可滚动和/或可更新的 ResultSet 对象。

此处转载一篇CSDN中的文章
java中的resultset类详解

结果集 (ResultSet) 是数据中查询结果返回的一种对象。

可以说结果集是一个存储查询结果的对象,但是结果集并不仅仅具有存储的功能,它同时还具有操纵数据的功能,可以完成对数据的更新等。

———————————————————————————————————————————————————————

4. ELSE TIPS
  • prepareStatement(String sql)
    创建一个 PreparedStatement 对象,用于将参数化的 SQL 语句发送到数据库。

  • 查询用 executeQuery(); 这个方法

  • 其他的删除、添加、更新数据都用 executeUpdate(); 方法

  • a 是运行会有一个返回 int 类型的值,影响多少条
    借助a可以进行判断:如果 a 大于 0 ,说明没有运行成功语句;

    比如你更新需要的更新的那个 id 不存在,程序没错,语句也没问题,是值的问题,就需要判断了。

	// a代表最后更新数据时,影响了多少条数据
		int a = 0;
  • (int) executeUpdate()
    该 SQL 语句必须是 SQL 数据操纵语言(DML)语句,如 INSERT,UPDATE 或 DELETE ;或不返回任何内容的 SQL 语句,例如 DDL 语句。
	a = pstm.executeUpdate();

———————————————————————————————————————————————————————

JDBC 开发六部曲 ♪

1. 注册驱动

Driver 管理驱动的接口(java.sql.Driver)


	// 用多态的形式实例化对象
	Driver driver = new com.mysql.jdbc.Driver();
	// 加载驱动
	DriverManager.registerDriver(driver);

2. 获取连接

getConnection() 连接数据库

Driver.getConnection(url,username,password);

  1. url 路径: jdbc:mysql://localhost:3306/test01
    (1) jdbc:mysql —— 协议
    (2) localhost ——— 本机 IP 地址 127.0.0.1
    (3) 3306 ————— 数据库端口号
    (4) test01 ————— 所要连接的数据库名
  2. username: 数据库用户名
  3. password: 数据库用户密码

jdbc:mysql://localhost:3306/test01?characterEncoding=utf-8
characterEncoding=utf-8 处理中文字符,防止乱码

连接数据库的对象 Connection
Connection connection = Driver.getConnection(url,username,password);

3. 获取操作数据库的对象

操作数据库的对象 Statement
Statement statement = connection.createStatement();

4. 对数据库进行操作,执行 SQL 语句
  1. executeQuery(sql) 执行 DQL 查询语句

    statement.executeQuery(sql);

  2. executeUpdate(sql) 执行 DML 增加、删除、修改语句

    statement.executeUpdate(sql);

  3. 返回一个 int 类型的 num,代表数据库中的影响记录条数

    int num = statement.executeUpdate(sql);

5. 获得查询的结果集

ResultSet resultSet = statement.executeQuery(sql);

while(resultSet.next()){
	int id = resultSet.getInt("id");
	String name = resultSet.getString("name");
	System.out.println("id=" + id + ",name" + name);
}

6. 释放资源

connection.close();
statement.close();
resultSet.close();

Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;

	try{
		/* 前五步 */
	}
	catch(SQLException e){
		e.printStackTrace();
	}
	finally{
		try{
			if(connection != null)
				connection.close();
			if(statement != null)
				statement.close();
			if(resultSet != null)
				resultSet.close();
		}
		catch(SQLException e){
			e.printStackTrace();
		}
	}

———————————————————————————————————————————————————————

JDBC 通过反射注册驱动

Class.forName("com.mysql.jdbc.Driver"); // 加载类对象

———————————————————————————————————————————————————————

jdbc.properties 封装 JDBC 属性的配置文件

  • jdbc.properties
url = jdbc:mysql://localhost:3306/test01
user = root
password = root
driver = com.mysql.jdbc.Driver
  • JDBCTest.java

// 根据键值对的形式获取信息
ResourceBundle jdbc = new ResourceBundle.getBundle("jdbc.properties");
/* 或 */
ResourceBundle jdbc = new ResourceBundle.getBundle("jdbc");

// 默认都为 String 类型
String driver = jdbc.getString("driver");
String url = jdbc.getString("url");
String user = jdbc.getString("user");
String password = jdbc.getString("password");

———————————————————————————————————————————————————————

想了一下还是贴下代码好啦ヾ(◍°∇°◍)ノ゙

贴上无敌的大佬写的 UserDao.java
package dao;

import entity.User;
import util.DBUtil;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class UserDao {
    private Connection conn;
    private PreparedStatement pstm;
    private ResultSet rs;

    // 查询所有
    public List<User> selectAllUser(){
        List<User> list = new ArrayList<User>();
        User user = new User();
        // 获得数据库连接
        conn = DBUtil.getConnection();
        // 设置SQL语句
        String sql = "select * from user";
        try {
            /*
             * prepareStatement(String sql)
             * 创建一个 PreparedStatement对象,用于将参数化的SQL语句发送到数据库。
             */
             
            // 用pstm接收PreparedStatement对象
            pstm = conn.prepareStatement(sql);
            // 用rs接收执行语句后所得到的结果集
            // 查询用 executeQuery(); 这个方法
            rs = pstm.executeQuery();
            while (rs.next()){
                // 创建User数据
                User user1 = new User();
                // 设置User1数据中的三个键
                user1.setId(rs.getInt(1));
                user1.setName(rs.getString(2));
                user1.setPassword(rs.getString(3));
                // 添加数据
                list.add(user1);
            }
        }catch (SQLException e){
            e.printStackTrace();
        }finally {
            DBUtil.close(pstm,rs);
        }
        return list;
    }

    /*
     * 查询用 executeQuery(); 这个方法
     * 其他的删除、添加、更新数据都用 executeUpdate(); 方法
     */
    
    // 添加
    public int insertUser(User user){
        // a是运行会有一个返回int类型的值,影响多少条
        // 借助a可以进行判断:如果a大于0,说明没有运行成功语句
        // 比如你更新需要的更新的那个id不存在,程序没错,语句也没问题,是值的问题,就需要判断了

        // a代表最后更新数据时,影响了多少条数据
        int a = 0;
        conn = DBUtil.getConnection();
        String sql = "INSERT INTO user VALUES(?,?,?)";
        try {
            pstm = conn.prepareStatement(sql);
            pstm.setInt(1,user.getId());
            pstm.setString(2,user.getName());
            pstm.setString(3,user.getPassword());
            /*
             * (int)  executeUpdate()
             * 执行在该SQL语句PreparedStatement对象,它必须是一个SQL数据操纵语言(DML)语句,
             * 如 INSERT,UPDATE或 DELETE ; 或不返回任何内容的SQL语句,例如DDL语句。
             */
            a = pstm.executeUpdate();
        }catch (SQLException e){
            e.printStackTrace();
        }finally {
            DBUtil.close(pstm,rs);
        }
        return a;
    }
    
    // 修改
    public int updateUser(User user,int id){
        int a = 0;
        conn = DBUtil.getConnection();
        String sql = "UPDATE user SET password = ? WHERE id = ?";
        try {
            pstm = conn.prepareStatement(sql);
            pstm.setString(1,user.getPassword());
            pstm.setInt(2,id);
            a = pstm.executeUpdate();
        }catch (SQLException e){
            e.printStackTrace();
        }finally {
            DBUtil.close(pstm,rs);
        }
        return a;
    }
    
    // 删除
    public int delUser(int id){
        int a = 0;
        conn = DBUtil.getConnection();
        String sql = "DELETE FROM user WHERE id = ?";
        try {
            pstm.setInt(1,id);
            a = pstm.executeUpdate();
        }catch (SQLException e){
            e.printStackTrace();
        }finally {
            DBUtil.close(pstm,rs);
        }
        return 0;
    }
}

DBUtil.java
package util;

import java.sql.*;

public class DBUtil {
    private static Connection conn;
    private static PreparedStatement pstm;
    private static ResultSet rs;

    //静态代码块,用来加载MySQL的jar包
    static{
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    //用来创建数据库的连接
    public static Connection getConnection(){
        try {
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/ljw_jdbc", "root", "12345");
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return conn;
    }

    //关闭流。节源
    public static void  close(PreparedStatement pstm, ResultSet rs){
        try {
            if(rs!=null)
                rs.close();
            if(pstm!=null)
                pstm.close();
            if(conn!=null)
                conn.close();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

———————————————————————————————————————————————————————

贴上菜菜的自己写的 JdbcTest.java

仅作学习用对比

package Connection;

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

/**
 * @projectname jdbcTest
 * @author yundy
 * @createtime 2020年7月4日下午1:43:13
 */
public class JdbcTest {
	public static void main(String[] args) {
		Connection conn = null;
		Statement st = null;
		ResultSet rs = null;
		
		try {
			// 1. 注册驱动
			
			/*
			 *  Driver是一个接口
			 */
			DriverManager.registerDriver(new com.mysql.jdbc.Driver());
			
			// 2. 建立连接
			
			/*
			 * 一个参数的方法
			 * DriverManager.getConnection(url);
			 * DriverManager.getConnection("jdbc:mysql://localhost/test?user= &password= ");
			 * 
			 * 三个参数的方法
			 * DriverManager.getConnection(url, user, password);
			 * DriverManager.getConnection("协议 + 访问的数据库", "用户名", "密码");
			 */
			conn = DriverManager.getConnection("jdbc:mysql://localhost/t_stu", "root", "12345");
			
			// 3. 创建statement,JDBC一定需要这个对象
			st = conn.createStatement();
			
			// 4. 执行查询,得到结果集(rs)
			
			/*
			 * 创建SQL查询语句
			 * st.executeQuery(sql);
			 */
			String sql = "select * from stu";
			rs = st.executeQuery(sql);
			
			// 5. 遍历查询每一条记录
			
			/*
			 * 指向数据库中的下一条数据
			 * rs.next();
			 */
			while(rs.next()) {
				int id = rs.getInt("id");
				String name = rs.getString("name");
				int age = rs.getInt("age");
				
				System.out.printf("id=" + id + "\t name=" + name + "\t age=" + age + "\n");
			}
			
		} catch(SQLException e) {
			e.printStackTrace();
		} finally {
			JdbcUtil.release(conn, st, rs);
		}
	}
}
JdbcUtil.java

其实只是上述代码块中的关闭流功能

package Connection;

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

import com.mysql.jdbc.Statement;

/**
 * @projectname jdbcTest
 * @author yundy
 * @createtime 2020年7月4日下午5:31:14
 */
public class JdbcUtil {
	public static void release(Connection conn,java.sql.Statement st,ResultSet rs) {
		closeRs(rs);
		closeSt(st);
		closeConn(conn);
	}
	
	private static void closeRs(ResultSet rs) {
		try {
			if(rs != null) {
				rs.close();
			}
		} catch(SQLException e){
			e.printStackTrace();
		} finally {
			rs = null;
		}
	}
	
	private static void closeSt(java.sql.Statement st) {
		try {
			if(st != null) {
				st.close();
			}
		} catch(SQLException e){
			e.printStackTrace();
		} finally {
			st = null;
		}
	}
	
	private static void closeConn(Connection conn) {
		try {
			if(conn != null) {
				conn.close();
			}
		} catch(SQLException e){
			e.printStackTrace();
		} finally {
			conn = null;
		}
	}
}

———————————————————————————————————————————————————————

第一次写,那么就到这里啦,感谢你看到这里!Thanks♪(・ω・)ノ

最后更新于 2020/7/27 7:01

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值