JDBC
JavaWeb 三层架构(经典三层) 降低耦合/ 提高复用性
1.表示层
由与用户交互组件构成(请求/响应)
2.业务逻辑层
处理业务逻辑(登录,注册)
3.数据持久层
直接与数据库交互(insert/update/delete/select )
dao 主要负责 数据持久层 (接口+实现类)
接口类:StudentDao.java
package dao;
import java.util.List;
import entity.Student;
public interface StudentDao {
List<Student> queryAll();
int insert(Student stu);
int delete(int sid);
}
实现类: studentDaoImpl3.java
package dao.impl;
import java.util.List;
import dao.BaseDao;
import dao.StudentDao;
import entity.Student;
/**
*
* 将增删改提炼成一个通用方法。(BaseDao.java)
* @author LXR
*/
public class studentDaoImpl3 extends BaseDao implements StudentDao {
// 查询
@Override
public List<Student> queryAll() {
String sql = "select * from student";
Object[] params = {};
return executeQuery(sql,params,Student.class);
}
//插入(增)
@Override
public int insert(Student stu) {
// sql语句
String sql = "insert into student values(?,?)";
// 获取到 sid 和 sname
Object[] params = {stu.getsid(),stu.getSname()};
// 调用通用模板 第3步:发送数据(里面包含着注册管理和获取连接)
// 得到返回值输出 或者后续 操作
return executeUpdate(sql,params);
}
// 删除
@Override
public int delete(int sid) {
String sql = "delete from student where sid = ?";
Object[] params = {sid};
// 调用通用模板 第3步:发送数据(里面包含着注册管理和获取连接)
// 得到返回值输出 或者后续 操作
return executeUpdate(sql,params);
}
public static void main(String[] args){
StudentDao dao = new studentDaoImpl3();
System.out.print(dao.queryAll());
}
}
公共模块:BaseDao.java
package dao;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import util.JdbcUtils;
/**
* 通用方法
* 3.发送数据
* @author LXR
*
*/
public class BaseDao {
private Connection conn = null;
private PreparedStatement ps = null;
private ResultSet rs = null;
// 通用增删改,不同表 insert/update/delete(sql) 参数类型和参数个数
public int executeUpdate(String sql,Object[] params){
int rows = 0;
try {
conn = JdbcUtils.getConnection();
ps = conn.prepareStatement(sql);
//赋值 (参数可能有好多个)
for(int i=0;i<=params.length;i++){
ps.setObject(i+1, params[i]);
}
rows = ps.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
JdbcUtils.closeRes(rs, ps, conn);
}
return rows;
}
// 通用 查
public<T> List<T> executeQuery(String sql,Object[] params,Class<T> clz){
List<T> lists = new ArrayList<>();
try {
//调用工具类,注册管理 、 建立连接
conn = JdbcUtils.getConnection();
//调用prepareStatement是为了防止SQL注入
ps = conn.prepareStatement(sql);
//赋值
for(int i=0;i<params.length;i++){
ps.setObject(i+1, params[i]);
}
// 发送sql语句
// rs 游标 其携带了表的所有元数据信息(能知道表有多少列)
rs = ps.executeQuery();
// 获取rs结果集(元数据)
ResultSetMetaData md = rs.getMetaData();
//获取字段个数
int count = md.getColumnCount();
while(rs.next()){
//调用实体类的无参构造
try {
T t = clz.newInstance(); //反射
// 将每个字段值一次赋值到对应的属性中 (数据库字段中 与 程序中参数 相对应)
for(int i=0;i<count;i++){ // 获取每列数据
//字段名称
String name = md.getCatalogName(i+1);
//获取每个字段的值
Object value = rs.getObject(name);
// 获取对应属性
Field field= clz.getDeclaredField(name);
field.setAccessible(true);
//赋值
field.set(t, value);
}
lists.add(t);
} catch (NoSuchFieldException | SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
实体类:Student.java Userinfo.java
package entity;
// student实体类
/**
* student 表对应的类
*/
public class Student {
private int sid;
private String sname;
public Student(){
}
public Student(int sid,String sname){
super();
this.sid = sid;
this.sname = sname;
}
// get 、set
public int getsid(){
return sid;
}
public void setSid(int sid){
this.sid = sid;
}
public String getSname(){
return sname;
}
public void setSname(String sname){
this.sname = sname;
}
@Override
public String toString(){
return "Student [sid="+ sid +",sname="+ sname +"]";
}
}
package entity;
/**
* userinfo 实体类
*
*/
public class Userinfo {
private int sid;
private String username;
private String password;
public Userinfo(){
}
public Userinfo(int sid,String username,String password){
super();
this.sid = sid;
this.username = username;
this.password = password;
}
public int getSid(){
return sid;
}
public String getsname(){
return username;
}
public String getPassword(String password){
return this.password;
}
public void setSid(int sid){
this.sid = sid;
}
public void setSname(String username){
this.username = username;
}
public void setPassword(String password){
this.password = password;
}
}
工具类:jdbc.properties 配置文件
driver=com.mysql.jdbc.Driver
url=jdbc:mysql:///bd2021?useSSL=true
user=root
password=root
注意:用 配置文件 来解决 硬编码问题。
java属性文件:properties(key/value)
xml文件: 通过标签(ssm)
<book>
<title>内容</title>
</book>