思维导图:
一:通用查询
第一步:连接数据库
package com.whw.util;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**
* 提供了一组获得或关闭数据库对象的方法
*
*/
public class DBAccess {
private static String driver;
private static String url;
private static String user;
private static String password;
static {
// 静态块执行一次,加载 驱动一次
try {
InputStream is = DBAccess.class
.getResourceAsStream("config.properties");
Properties properties = new Properties();
properties.load(is);
driver = properties.getProperty("driver");
url = properties.getProperty("url");
user = properties.getProperty("user");
password = properties.getProperty("pwd");
Class.forName(driver);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
/**
* 获得数据连接对象
*
* @return
*/
public static Connection getConnection() {
try {
Connection conn = DriverManager.getConnection(url, user, password);
return conn;
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
public static void close(ResultSet rs) {
if (null != rs) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
public static void close(Statement stmt) {
if (null != stmt) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
public static void close(Connection conn) {
if (null != conn) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
public static void close(Connection conn, Statement stmt, ResultSet rs) {
close(rs);
close(stmt);
close(conn);
}
public static boolean isOracle() {
return "oracle.jdbc.driver.OracleDriver".equals(driver);
}
public static boolean isSQLServer() {
return "com.microsoft.sqlserver.jdbc.SQLServerDriver".equals(driver);
}
public static boolean isMysql() {
return "com.mysql.cj.jdbc.Driver".equals(driver);
}
public static void main(String[] args) {
Connection conn = DBAccess.getConnection();
System.out.println(conn);
DBAccess.close(conn);
System.out.println("isOracle:" + isOracle());
System.out.println("isSQLServer:" + isSQLServer());
System.out.println("isMysql:" + isMysql());
System.out.println("数据库连接(关闭)成功");
}
}
第二步:创建预定义对象
第三步:执行查询
第四步:结果集处理
方法如下:
类为BaseDao是所有dao类的父类,为类型就可以无论查找什么类型都可以用一样的代码去解决
BaseDao:
package com.whw.dao;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import com.sg.entity.Book;
import com.sg.util.DBAccess;
import com.sg.util.PageBean;
import com.sg.util.StringUtils;
/**
* 所有Dao层的父类
* @author T440s
*
* @param <T>
*/
public class BaseDao<T> {
public List<T> list(String sql,Class<T> clz)throws Exception{
//不确定list集合中装的什么东西 子类Dao继承BaseDao<T>,子类传的是什么类那么list集合中放的就是什么
List<T> list=new ArrayList<T>();
Connection con = DBAccess.getConnection();
PreparedStatement ps = con.prepareStatement(sql);
ResultSet rs=ps.executeQuery();
while(rs.next()) {
//books.add(new Book(rs.getInt("bid"),rs.getString("bname"),rs.getFloat("price")));
/**
* 上面一行代码分析:
* 1.实例化了一个对象
* 2.从ResultSet的对象的属性获取值(bid)获取值,赋值给了前面的实例化的对象
* 3.把已经赋值了的对象添加到List集合中
*/
//实例化一个对象
T t=clz.newInstance();
//获取属性
Field[] fields = clz.getDeclaredFields();
for (Field f : fields) {
f.setAccessible(true);
f.set(t, rs.getObject(f.getName()));
}
list.add(t);
}
return list;
}
BookDao
package com.whw.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import com.sg.entity.Book;
import com.sg.util.DBAccess;
import com.sg.util.PageBean;
import com.sg.util.StringUtils;
public class BookDao extends BaseDao<Book>{
/**
* 简单的查询方法
* 思路:
* 1.建立数据库连接
* 2.预定义对象PrepareStatement
* 3.查询结果集
* 4.处理结果集
*/
public List<Book> list(Book book)throws Exception{
List<Book> books=new ArrayList<Book>();
String sql=