使用PreparedStatement实现
数据库连接的本质:
-
一个Socket连接,用于对数据库发出指令接收响应的
java.sql
包当中定义了3种对数据库的调用方式:
-
Statement:
执行静态SQL语句,返回生成结果的对象 -
PrepatedStatement:
SQL语句被预编译并存储在此对象中,可以使用此对象多次高效地执行该语句(Connection
是接口,PrepatedStatement
是子接口)--->实际开发过程当中用的都是这个 -
CallableStatement:
执行SQL存储
具体地实现如图:
整体地CRUD过程
-
获取连接--->Connection
-
创建Statement对象
-
让Statement对象去执行SQL语句
模拟登录判断是否存在用户的操作
登录类:
创建驱动类:
//这个get是Statement当中的方法
public <T> T get(String sql, Class<T> clazz) {
T t = null;
//创建连接
Connection conn = null;
Statement st = null;
ResultSet rs = null;
//进行数据库连接事务
try {
//加载配置文件--->使用类加载机制获取到配置文件
InputStream is = Statement.class.getClassLoader().getResourceAsStream("Localhost.properties");
//创建Properties对象引用
Properties prop = new Properties();
//加载流文件
prop.load(is);
//读取配置文件
String driverClass = prop.getProperty("DRIVER");
String url = prop.getProperty("URL");
String userName = prop.getProperty("USERNAME");
String password = prop.getProperty("PASSWORD");
//加载数据库驱动
Class.forName(driverClass);
//获取连接
/*mysql驱动连接*/
conn = DriverManager.getConnection(url, userName, password);
/*创建statement对象*/
st = conn.createStatement();
/*创建结果集对象*/
rs = st.executeQuery(sql);
//获取结果元数据
ResultSetMetaData rsmd = rs.getMetaData();
//获取结果集列数
int columnCount = rsmd.getColumnCount();
//判断--->如果有下一列,再次创建事务去读取
if (rs.next()){
t = clazz.newInstance();
//循环获取列名
for (int i = 0; i < columnCount; i++){
//获取列名
String columnName = rsmd.getColumnLabel(i+1);
//根据列名获取对应的数据
Object columnValue = rs.getObject(columnName);
//将数据表中得到的数据封装进入对象当中
Field field = clazz.getDeclaredField(columnName);
field.setAccessible(true);
field.set(t, columnValue);
}
return t;
}
}catch (Exception e){
e.printStackTrace();
}finally {