JDBC简介
JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序
- Java 具有坚固、安全、易于使用、易于理解和可从网络上自动下载等特性,是编写数据库应用程序的杰出语言。所需要的只是 Java应用程序与各种不同数据库之间进行对话的方法。
- JDBC可以在各种平台上使用Java,如Windows,Mac OS和各种版本的UNIX。
- JDBC库包括通常与数据库使用相关的下面提到的每个任务的API。
JDBC实现验证登录代码思路
-
加载驱动类
-
获取连接
-
编写sql
-
创建Statemet对象
-
发送sql,通知数据库执行,接收结果
-
如果是查询, 结果是ResultSet, 解析ResultSet
-
关闭资源
Java工具类
在java开发过程中,代码中时常用到一些Scanner、Random一样的类,他们是键盘录入,生成随机数的类,像一个工具一样,在java中被称为工具类。
我们在编写自己的代码时,有的代码功能和java工具类似,比如连接数据库、验证登录,时长会用得到,每次都书写一次太麻烦,我们可以尝试编写自己的工具类,每次用到的时候直接导包调用就行,能提高我们的开发效率。
封装JDBC工具类
- 注册驱动
- 获取连接
- 释放资源
- 执行命令
db.properties信息文件
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/web?
user=root
password=root
代码如下:
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
/**
* jdbc的工具类
*/
public class JDBCUtil {
static Properties props = new Properties();
static{
InputStream in = JDBCUtil.class.getClassLoader().getResourceAsStream("db.properties");
try {
props.load(in);
Class.forName(props.getProperty("driverClass"));
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//得到连接的方法
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(props.getProperty("url"),props.getProperty("username"),props.getProperty("password"));
}
//关闭资源的方法
public static void close(ResultSet rs, PreparedStatement pstmt,Connection conn ){
try {
if(rs != null) rs.close();
if(pstmt != null) pstmt.close();
if(conn != null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 执行增删改的sql
*/
public static int executeUpdate(String sql,Object...params){
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = JDBCUtil.getConnection();
pstmt = createPreparedStatement(conn,sql,params);
return pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCUtil.close(null,pstmt,conn);
}
return 0;
}
private static PreparedStatement createPreparedStatement(Connection conn,String sql,Object...params) throws SQLException {
conn = JDBCUtil.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql);
//给?赋值 params本质数组
if( params != null && params.length > 0 ){
for (int i = 0; i < params.length; i++) {
pstmt.setObject(i+1,params[i]);
}
}
return pstmt;
}
/**
* 执行查询的sql
* 可变参数约束:
* 1. 位于所有参数后面
* 2. 一个方法只能有一个可变参数
* 所有可变参数都可以使用数组替换
*/
public static <T> List<T> executeQuery(String sql,Class<T> clazz, Object... params){
//使用jdbc 查询tb_user表
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = JDBCUtil.getConnection();
//创建PreparedStatement
pstmt = createPreparedStatement(conn,sql,params);
//执行
rs = pstmt.executeQuery();
//解决ResultSet 反射
List<T> list = new ArrayList<>();
while(rs.next()){
//rs.getXxx()
//newInstance() 调用无参构造方法
T t = clazz.newInstance();
//给t的属性赋值
//获取T的属性
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
//设置允许访问
field.setAccessible(true);
//给属性赋值 底层调用 对象.属性 = 值
//getObject(列索引)
//getObject(列名) 约定: 属性名与列名一样,赋值
// 如果属性名与列名不一样: 列名:user_name username 属性名:username
// 给列名取一个属性名的别名
field.set(t,rs.getObject(field.getName()));
}
list.add(t);
}
return list;
}catch (Exception e) {
e.printStackTrace();
}finally{
JDBCUtil.close(rs,pstmt,conn);
}
return null;
}