BaseDao自己要封装一个类,这个类对数据库的数据进行增删改查,在这个类中需要写两个方法,一个是增删改,一个是查。
src/com/qf/utils/JdbcUtil
package com.qf.utils;
import java.io.FileInputStream;
import java.sql.*;
import java.util.Properties;
public class JdbcUtil {
private static String url = null;
private static String user = null;
private static String password = null;
static{
try {
Properties properties = new Properties();
properties.load(new FileInputStream("src/db.properties"));
//数据都在properties对象中
String diver = properties.getProperty("driver");
url = properties.getProperty("url");
user = properties.getProperty("user");
password = properties.getProperty("password");
Class.forName(diver);
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection () {
Connection connection = null;
try {
connection = DriverManager.getConnection(url,user,password);
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
public static void close(Connection connection){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void close(Connection connection, Statement statement){
try {
statement.close();
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void close(ResultSet resultSet,Connection connection, Statement statement){
try {
resultSet.close();
statement.close();
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
src/com/qf/utils/BaseDao
package com.qf.utils;
import org.apache.commons.beanutils.BeanUtils;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
/*
只有两个方法:
1.增删改
2.查
*/
public class BaseDao {
/**
* 增删改
* @param sql 需要传入sql语句
* @param parameters 对sql语句的?进行赋值
* @return 受影响的行数
*/
//String sql = "insert into work(name, age , info )values(?,?,?)";
//Object[] objs = {"煮鸡蛋", 23,"csxddw"};
//baseDao.update(sql,objs);
public int update (String sql,Object[] parameters) {
//1.获取数据库的连接的对象 从另外一个工具类中去获取的
Connection connection = JdbcUtil.getConnection();
//2.获取预处理的搬运工对象去预处理sql语句
PreparedStatement preparedStatement = null;
try {
preparedStatement = connection.prepareStatement(sql);
//3.现在要对sql语句的参数进行赋值,你知道有几个参数吗?
//因为参数不确定
//获取参数的个数 靠参数元数据
int parameterCount = preparedStatement.getParameterMetaData().getParameterCount();
System.out.println(parameterCount);
//4.循环进行赋值
//String sql = "insert into work (name,age,info)values(?,?,?)";
//Object[] objs = {"gongdian",123,"qweqwewqe"}; 3
if(parameters != null && parameters.length == parameterCount ){
//if条件 保证代码的健壮性
for (int i = 1; i <= parameterCount ; i++) {
//i = 1 setObject(1, "gongdian")
//i = 2 setObject(2,12)
//i = 3 setObject(3,"qweqwewqe")
preparedStatement.setObject(i,parameters[i - 1]);
}
}
//5.执行sql语句
int i = preparedStatement.executeUpdate();
return i;
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtil.close(connection,preparedStatement);
}
return 0;
}
//查询的方法 咱们需要关注什么? 查询的数据是要赋值给一个实体类对象的
/**
*
* @param sql
* @param parameters
* @param cls 查询出来的数据赋值给一个对象
* @param <T>
* @return
*/
//super.query("select * from work where id = ?", null ,Work.class)
public <T> List<T> query(String sql, Object[] parameters, Class<T> cls){
//1.连接数据库的对象 获取
Connection connection = JdbcUtil.getConnection();
//2.获取预处理的搬运工的对象
PreparedStatement preparedStatement = null;
ResultSet resultSet =null;
try {
preparedStatement = connection.prepareStatement(sql);
//3.获取参数的个数
int parameterCount = preparedStatement.getParameterMetaData().getParameterCount();
//4.对?进行赋值
if (parameters != null && parameters.length == parameterCount){
for (int i = 1; i <= parameterCount ; i++) {
preparedStatement.setObject(i,parameters[i - 1]);
}
}
//5,执行sql语句
resultSet = preparedStatement.executeQuery();
//6.创建一个空的集合
List<T> list = new ArrayList<>();
//7.获取结果集元数据,通过元数据获取字段的个数和字段的名字
ResultSetMetaData metaData = resultSet.getMetaData();
//8.通过元数据的对象 获取字段的个数
int columnCount = metaData.getColumnCount();
/**
* id name a ge info 《=
* 1 狗蛋 12 大数据 《=
* 2 嘻嘻 13 去问我去饿
* 3 大话 14 全俄文全额
*/
//9.遍历数据
while(resultSet.next()){//往下遍历每一行的数据的
//10.通过Class对象获取所对应的类对象
//Work.class-> Work work = new Work()
//Person.class-> Person person = new Person();
T t = cls.getConstructor(null).newInstance(null);
for (int i = 1; i <=columnCount ; i++) {//获取字段的
//11.获取列(字段)的名字
String columnName = metaData.getColumnName(i);
//System.out.println(columnName);
//12.通过字段获取值
Object value = resultSet.getObject(columnName);
// System.out.println(value);
//13.获取数据库的数据之后,将数据赋值给一个对象,得有类
//BeanUtils.setProperty(对象,属性,值)
BeanUtils.setProperty(t,columnName,value);
}
//14.每次while循环一次 存到集合中
list.add(t);
}
return list.size() != 0 ? list : null;
} catch (Exception e) {
e.printStackTrace();
}finally {
//15.关闭资源
JdbcUtil.close(resultSet,preparedStatement,connection);
}
return null;
}
}
src/com/qf/a_mysql/WorkDao
package com.qf.a_mysql;
import com.qf.entity.Work;
import com.qf.utils.BaseDao;
import java.util.List;
import java.util.function.Consumer;
public class WorkDao extends BaseDao {
public void insert() {
String sql = "insert into work(name,age,info)values(?,?,?)";
Object[] objs = {"老玩玩",20,"xixihh"};
super.update(sql,objs);
}
public void delete () {
String sql = "delete from work where id = ?";
Object[] objs = {4};
super.update(sql,objs);
}
public void select(){
String sql = "select * from work";
List<Work> query = super.query(sql, null, Work.class);
query.forEach((work)-> System.out.println(work));
//Work.class
//会将Work实例化,从数据库取出来数据,赋值给这个work对象
}
}
src/com/qf/a_mysql/Demo1
package com.qf.a_mysql;
import com.qf.utils.BaseDao;
import com.qf.utils.JdbcUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class Demo1 {
public static void main(String[] args) throws SQLException {
WorkDao workDao = new WorkDao();
workDao.insert();
// workDao.delete();
// workDao.select();
}
}
src/com/qf/entity/Work
package com.qf.entity;
public class Work {
private Integer id;
private String name ;
private Integer age;
private String info;
public Work() {
}
public Work(Integer id, String name, Integer age, String info) {
this.id = id;
this.name = name;
this.age = age;
this.info = info;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
@Override
public String toString() {
return "Work{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", info='" + info + '\'' +
'}';
}
}