PreparedStatement和Statement
工作原理图:
PreparedStatement是Statement的一个子接口
Connection连接的四个条件
条件:
-
使用的驱动--->使用xml或者其他配置文件进行管理
-
URL--->连接的ip和端口号和数据库
-
用户名
-
密码
封装获取连接的过程:
getConnection()
/*获取数据库连接*/
/**
* 获取数据库连接
* @return
*/
public static Connection getConnection() throws SQLException {
/*从配置文件当中去读数据库连接所需要的数据--->通过获取系统类加载器来读取配置文件*/
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("Localhost.properties");
//创建Properties引用
Properties prop = new Properties();
try {
//读取流文件
prop.load(is);
}catch (IOException e){
System.out.println("读取流文件的时候抛出的异常!");
e.printStackTrace();
}
//获取文件当中的属性
String driverClass = prop.getProperty("DRIVER");
String url = prop.getProperty("URL");
String username = prop.getProperty("USERNAME");
String password = prop.getProperty("PASSWORD");
try {
//反射获取mysql驱动
Class.forName(driverClass);
}catch (ClassNotFoundException e){
System.out.println("获取数据库驱动抛出的异常!");
e.printStackTrace();
}
/*获取Connection对象引用*/
Connection conn = DriverManager.getConnection(url, username, password);
return conn;
}
closeResource()
/*关闭资源类*/
public static void closeResource(Connection conn, PreparedStatement ps){
/*后打开的先关闭*/
try {
if (ps!=null){
ps.close();
}
}catch (SQLException e){
System.out.println("关闭ps抛出的异常!");
e.printStackTrace();
}
try {
if (conn!=null){
conn.close();
}
}catch (SQLException e){
System.out.println("关闭连接抛出的异常!");
e.printStackTrace();
}
}
将改、查的过程封装
改
将不确定的信息参数化:
使用可变形参将需要参数化的地方参数化:
/*统一的修改方法*/
//由于通配符不知道有多少所以设置成可变形参
public void upload(String sql, Object ...args){
//定义属性
Connection conn = null;
PreparedStatement ps = null;
//获取数据库连接
try {
conn = JDBCUtils.getConnection();
//创建PreparedStatement对象携带sql去进行操作
ps = conn.prepareStatement(sql);
//填充占位符
/*
sql当中占位符的个数应该与可变形参的长度一致
可变形参当成数组
*/
for (int i = 1; i < args.length; i++){
ps.setObject(i, args[i]); //当心参数声明错误
}
//执行语句
ps.execute();
}catch (Exception e){
e.printStackTrace();
}
//关闭资源
JDBCUtils.closeResource(conn, ps);
}
测试:
查
Java
与SQL
对应数据类型转换表:
Java类型 | SQL类型 |
---|---|
boolean | Bit |
byte | TinyInt |
short | Smallint |
int | Integer |
long | Bigint |
String | Char,Varchar,LongVarchar |
byte array | Binary,Var Binary |
java.sql.Date | Date |
java.sql.Time | Time |
java.sql.TimeStamp | TimeStamp |
针对不同的表进行查询操作:
ORM
思想:一个Java
类对应一个表格
:
package JDBCStatementCRUD;
import java.util.Date;
/**
* 相当于一个结构体,用于存放某一个表当中的记录
* ORM的编程思想:
* 1、一个数据表对应一个Java类
* 2、表中的一条记录对应一个Java类的一个对象
* 3、表中的一个字段对应Java类的一个属性
* @since JDk 1.8
* @date 2021/09/24
* @author Lucifer
*/
public class Customer {
/*属性字段私有化*/
private int id;
private String name;
private String email;
private Date birth;
/*生成构造器*/
public Customer() {
}
public Customer(int id, String name, String email, Date birth) {
this.id = id;
this.name = name;
this.email = email;
this.birth = birth;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public String getEmail() {
return email;
}
public Date getBirth() {
return birth;
}
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setEmail(String email) {
this.email = email;
}
public void setBirth(Date birth) {
this.birth = birth;
}
}
指定查询的字段进行查询:
通用的查询方式:
关键点:
-
根据传入的
sql
语句判断需要查询的字段进行查询 -
因为
ORM
的思想,一个表对应一个JavaBean
对象。所以需要根据传入的sql
要获取传入的列 -
通过元数据获取列数,循环获取查询的列名,在通过反射运行时类的属性与列名进行比较,相同的赋值--->这不是判断而是同时获取
-
没有查询到的属性为
null
/**
* 针对Customers表的通用的查询操作--->查询的字段数量不一样
* 1、获取列数--->结果集元数据
* 2、获取列名--->结果集元数据
* 3、获取需要查询多少个字段--->反射的方式来获取--->动态获取对象当中的属性--->运行时类加载器
*/