JDBC案例
1.在DBHelper类中写参数信息
import com.sun.media.sound.SoftTuning;
import org.junit.Test;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.*;
import java.util.List;
import java.util.Properties;
/**
* JDBC
*/
public class DBHelper {
//设置url ,建立链接时,指向数据库的地址
private static String url = "jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC&characterEncoding=utf8";
//设置遍历和用户建立连接
private static String driver = "com.mysql.jdbc.Driver";
//账号
private static String username = "root";
//密码
private static String password = "root";
//链接对象
private static Connection conn;
//预编译对象
private static PreparedStatement ps;
//返回结果对象
private static ResultSet rs;
//私有构造函数,避免创建该类
private DBHelper() {
}
static {
try {
//加载驱动
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//建立链接并返回链接对象
public static Connection getConn() {
try {
//如果已经存在该链接对象,直接返回
if(conn!=null)return conn;
//建立链接
conn= DriverManager.getConnection(url, username, password);
return conn;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
// 关闭资源
public static void close(Connection conn, PreparedStatement ps, ResultSet rs) {
try {
if (conn != null) conn.close();
if (ps != null) ps.close();
if (rs != null) rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void close(Connection conn, PreparedStatement ps) {
close(conn, ps, null);
}
public static void close(Connection conn) {
close(conn, null, null);
}
}
2.读取配置文件,然后进行建立链接的JDBC
DBHelper.properties配置文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc\:mysql\://localhost\:3306/school?useSSL\=false&serverTimezone\=UTC&characterEncoding\=utf8
jdbc.username=root
jdbc.password=root
JDBC文件
package cn.hp.demo3;
import com.sun.media.sound.SoftTuning;
import org.junit.Test;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.*;
import java.util.List;
import java.util.Properties;
/**
* JDBC
*/
public class DBHelper {
//设置url ,建立链接时,指向数据库的地址
private static String url = "";
//设置遍历和用户建立连接
private static String driver = "";
//账号
private static String username = "";
//密码
private static String password = "";
//链接对象
private static Connection conn;
//预编译对象
private static PreparedStatement ps;
//返回结果对象
private static ResultSet rs;
//私有构造函数,避免创建该类
private DBHelper() {
}
/**
* 读取配置文件信息,
*/
private static void init(){
//获取Properties对象
Properties p= new Properties();
try {
//Properties对象获取资源文件的输入流
p.load(new FileInputStream("DBHelper.properties"));
driver=p.getProperty("jdbc.driver");
url=p.getProperty("jdbc.url");
username=p.getProperty("jdbc.username");
password=p.getProperty("jdbc.password");
} catch (IOException e) {
e.printStackTrace();
}
}
static {
//配置信息初始化
init();
try {
//加载驱动
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//建立链接并返回链接对象
public static Connection getConn() {
try {
//如果已经存在该链接对象,直接返回
if(conn!=null)return conn;
//建立链接
conn= DriverManager.getConnection(url, username, password);
return conn;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
// 关闭资源
public static void close(Connection conn, PreparedStatement ps, ResultSet rs) {
try {
if (conn != null) conn.close();
if (ps != null) ps.close();
if (rs != null) rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void close(Connection conn, PreparedStatement ps) {
close(conn, ps, null);
}
public static void close(Connection conn) {
close(conn, null, null);
}
}
3.添加修改删除方法
/**
* 添加,修改删除
* @param sql
* @param obj
*/
public static void addOrUppOrDel (String sql, Object ... obj){
getConn();//1.建立链接
try {
ps = conn.prepareStatement(sql);//2.获取预编译对象
//3.参数赋值
if(obj!=null){
for (int i=0; i < obj.length; i++) {
Object o = obj[i];
ps.setObject(i+1, o);
}
}
//4、执行
int i = ps.executeUpdate();
System.out.println(i);
} catch (SQLException e) {
e.printStackTrace();
}
}
4.查询方法
public static void select(String sql,Object ...obj){
getConn();//1.建立链接
try {
ps = conn.prepareStatement(sql);//2.获取预编译对象
//3.参数赋值
if(obj!=null){
for (int i=0; i < obj.length; i++) {
Object o = obj[i];
ps.setObject(i+1, o);
}
}
//4、执行
rs= ps.executeQuery();
//5.结果进行获取输出
while (rs.next()) {
System.out.println(rs.getObject("id"));
System.out.println(rs.getObject("type_name"));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
5.通过Map集合,优化数据库查询方法
/**
* 查询方法
* @param sql sql语句
* @param obj 参数
* @return List<Map>
*/
public static List<Map> select(String sql, Object...obj) {
List<Map> list = new ArrayList<>();
// 1.建立连接
getConn();
try {
// 2.创建语句对象,预编译
ps = conn.prepareStatement(sql);
// 3.参数处理 itar 普通for循环
for (int i = 0; i < obj.length; i++) {
ps.setObject(i + 1, obj[i]);
}
// 4.执行sql,得到结果集
rs = ps.executeQuery();
ResultSetMetaData metaData = rs.getMetaData();//元数据,查询的数据结构
while (rs.next()) {
Map map = new HashMap();
int columnCount = metaData.getColumnCount();//字段的列数,id,name 获取的就是2
for (int i = 0; i < columnCount; i++) {
//metaData.getColumnLabel(i+1)//这个的从1开始获取第几列的字段名称
//rs.getObject(i+1)//根据列数(从1开始)数据集中的数据
map.put(metaData.getColumnLabel(i+1), rs.getObject(i+1));
}
list.add(map);
}
return list;
} catch (SQLException e) {
e.printStackTrace();
} finally {
close(conn, ps, rs);
}
// 5.返回结果集
return null;
}
通用版的dao层
package cn.hp.util;
import java.util.List;
import java.util.Map;
public class BeanDao {
/**
* 查询所有
* @param sql sql语句
* @param obj 参数
*/
public static List<Map> findAll(String sql, Object... obj) {
return DBHelper.select(sql, obj);
}
/**
* 修改方法
* @param sql sql语句
* @param obj 参数
*/
public int update(String sql, Object... obj) {
return DBHelper.update(sql, obj);
}
/**
* 单个查询
*
* @param sql sql
* @param obj 参数
* @return
*/
public Map getOne(String sql, Object... obj) {
List<Map> list = DBHelper.select(sql, obj);
if (list != null && list.size() > 0) {
return list.get(0);
}
return null;
}
/**
* 分页查询
*
* @param sql
* @param page 当前页
* @param limit 每页的条数
* @return
*/
public static PageBean selectPage(String sql, Integer page, Integer limit, Object... obj) {
int totalCount = getCount(sql, obj);//获取总行数
int totalPages = totalCount % limit == 0 ? (totalCount / limit) : (totalCount / limit) + 1;//总页数
int startIndex = (page - 1) * limit;//开始条数
sql = sql + " limit " + startIndex + "," + limit;//添加分页条件
List<Map> list = DBHelper.select(sql, obj);
PageBean pageBean = new PageBean(page, limit, totalCount, totalPages, list);//分页
return pageBean;
}
/**
* 查询总条数
* @param sql
* @return
*/
private static int getCount(String sql, Object... obj) {
int num = 0;
List<Map> list = DBHelper.select("select count(*) num from (" + sql + ") z", obj);
if (list != null) {
num = Integer.valueOf(list.get(0).get("num").toString());
}
return num;
}
public static void main(String[] args) {
PageBean pageBean = selectPage("select * from emp", 2, 2);
System.out.println(pageBean);
}
}
通过反射,封装操作数据库的方法基类
package cn.hp.web.dao.impl;
import cn.hp.web.util.DBHelper;
import cn.hp.web.util.DBHelper2;
import cn.hp.web.util.PageBean;
import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class BeanDao {
/**
* 升级后的查询方法
*
* @param sql sql语句
* @param obj 参数
* @return 升级
*/
public static <T> List<T> select(String sql, Class<T> clz, Object... obj) {
System.out.println(sql);
for (int i = 0; i < obj.length; i++) {
Object o = obj[i];
System.out.println(o);
}
// 1.建立连接
Connection conn = DBHelper2.getConn();
PreparedStatement ps = null;
ResultSet rs = null;
List<T> list = new ArrayList<T>();
try {
// 2.创建语句对象,预编译
ps = conn.prepareStatement(sql);
// 3.参数处理 itar 普通for循环
for (int i = 0; i < obj.length; i++) {
ps.setObject(i + 1, obj[i]);
}
// 4.执行sql,得到结果集
rs = ps.executeQuery();
while (rs.next()) {
// 手动进行数据处理
// Dept dept = new Dept();
// dept.setId(rs.getInt("id"));
// dept.setName(rs.getString("name"));
//通过反射将数据集转换成对应的实体(比如Dept)
T bean = toDataChange(rs, clz);
list.add(bean);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBHelper2.close(conn, ps, rs);
}
// 5.返回转换后的集合
return list;
}
/**
* 具体的转换方法
*
* @param rs
* @param clz
* @param <T>
* @return
*/
private static <T> T toDataChange(ResultSet rs, Class<T> clz) {
try {
T bean = clz.newInstance();//获取clz 的实例
ResultSetMetaData metaData = rs.getMetaData();//元数据,查询的数据结构
int columnCount = metaData.getColumnCount();//字段的列数,id,name 获取的就是2
for (int i = 0; i < columnCount; i++) {
String key = metaData.getColumnLabel(i + 1);//这个的从1开始获取第几列的字段名称 -->列名
Object value = rs.getObject(key);//根据列名获取数据集中的数据
Field field = clz.getDeclaredField(key);//获取实体类中指定的字段对象
field.setAccessible(true);//给赋值提速
field.set(bean, value);//给实体对应字段具体赋值
}
return bean;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 修改方法
*
* @param sql sql语句
* @param obj 参数
* @return
*/
public int update(String sql, Object... obj) {
System.out.println(sql);
for (int i = 0; i < obj.length; i++) {
Object o = obj[i];
System.out.println(o);
}
int count = 0;
// 1.建立连接
Connection conn = DBHelper2.getConn();
PreparedStatement ps = null;
try {
// 2.创建语句对象,预编译
ps = conn.prepareStatement(sql);
// 3.参数处理 itar 普通for循环
for (int i = 0; i < obj.length; i++) {
ps.setObject(i + 1, obj[i]);
}
// 4.执行sql,得到影响的条数
count = ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally {
DBHelper2.close(conn, ps);
}
// 5.返回影响的条数
return count;
}
/**
* 单个查询
*
* @param sql sql
* @param clz 要返回的实体
* @param obj 参数
* @param <T>
* @return
*/
public <T> T findByOne(String sql, Class<T> clz, Object... obj) {
List<T> list = select(sql, clz, obj);
if (list != null && list.size() > 0) {
return list.get(0);
}
return null;
}
/**
* 分页查询
* @param sql
* @param page 当前页
* @param limit 每页的条数
* @param clz
* @param obj 参数
* @param <T>
* @return
*/
public <T> PageBean<T> selectPage(String sql, Integer page, Integer limit, Class<T> clz, Object... obj){
int totalCount = getCount(sql, obj);
int totalPages = totalCount%limit==0?(totalCount/limit):(totalCount/limit)+1;//总页数
int startIndex=(page-1)*limit;//开始条数
sql= sql + " limit "+startIndex+","+limit;//添加分页条件
List<T> list = select(sql, clz, obj);
PageBean<T> pageBean = new PageBean<T>(page, limit, totalCount, totalPages, list);
return pageBean;
}
/**
* 查询总条数
* @param sql
* @return
*/
private int getCount(String sql, Object... obj) {
int num = 0;
// 1.建立连接
Connection conn = DBHelper2.getConn();
PreparedStatement ps = null;
ResultSet rs =null;
try {
// 2.创建语句对象,预编译
ps = conn.prepareStatement("select count(*) num from ("+sql+") z");
// 3.参数处理 itar 普通for循环
for (int i = 0; i < obj.length; i++) {
ps.setObject(i + 1, obj[i]);
}
// 4.执行sql,得到影响的条数
rs = ps.executeQuery();
while(rs.next()){
num=rs.getInt(1);
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
DBHelper2.close(conn, ps, rs);
}
// 5.返回总行数
return num;
}
}