JDBC/MVC个人笔记
———————————————————————————————————————————————————————
READING TIPS
纯小白,仅作自学用复习笔记,仅供参考。
———————————————————————————————————————————————————————
MVC
- controller 调用 services
- services(业务管理层)访问 dao
- dao 访问数据库
———————————————————————————————————————————————————————
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 对象有两个优点:
- 预编译功能提高了执行效率
- 通过 “ ? ” 传递参数,可以防止 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);
- url 路径: jdbc:mysql://localhost:3306/test01
(1) jdbc:mysql —— 协议
(2) localhost ——— 本机 IP 地址 127.0.0.1
(3) 3306 ————— 数据库端口号
(4) test01 ————— 所要连接的数据库名 - username: 数据库用户名
- 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 语句
-
executeQuery(sql) 执行 DQL 查询语句
statement.executeQuery(sql);
-
executeUpdate(sql) 执行 DML 增加、删除、修改语句
statement.executeUpdate(sql);
-
返回一个 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