jdbc对数据库操作需要好几个步骤,数据库的操作经常用到,所以要将jdbc封装成一个工具类以便使用,下面是自己简单的封装一个jdbc(maven工程)
1.数据库连接配置文件
新建一个mysql。properties文件,woshop是数据库名
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/weshop
username=root
password=123456
2.创建一个PageBean类,定义分页属性的
package com.by.db;
import lombok.Data;
import java.util.List;
import java.util.Map;
@Data
public class PageBean {
int page;
int pageSize;
int total;
List<Map> list;
}
3.封装JDBC,创建一个DbTools类
package com.by.db;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.sql.*;
import java.util.*;
/**
* 封装jdbc
*
*/
public class DbTools {
private String username;
private String password;
private String url;
private String driver;
private static DbTools instance;
private DbTools(){
init();
}
public static DbTools getInstance(){
if (null==instance){
instance=new DbTools();
}
return instance;
}
/**
* 初始号方法
*/
private void init(){
InputStream is=this.getClass().getClassLoader().getResourceAsStream("mysql.properties");
Properties prop=new Properties();
try {
prop.load(is);
} catch (IOException e) {
e.printStackTrace();
}
this.url=prop.getProperty("url");
this.password=prop.getProperty("password");
this.username=prop.getProperty("username");
this.driver=prop.getProperty("driver");
//注册驱动
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
System.out.println("数据库注册驱动失败");
}
}
/**
* 保存Statement
* @param sql 要执行的sql语句
* @return 代表影响的行数,1代表成功,0代表失败
*/
public int save(String sql){
return execute(sql);
}
/**
* 保存 使用PreparedStatement
* @param sql 编译sql
* @param params 传递sql中的参数
* @return
*/
public int save(String sql, Object [] params){
return excute(sql, params);
}
/**
* 修改
* @param sql
* @return 代表影响的行数,1代表成功,0代表失败
*/
public int updata(String sql){
return execute(sql);
}
/**
* 修改
* @param sql 编译sql
* @param params 传递sql中的参数
* @return
*/
public int updata(String sql,Object[] params){
return excute(sql, params);
}
/**
* 删除
* @param sql
* @return 代表影响的行数,1代表成功,0代表失败
*/
public int delete(String sql) {
return execute(sql);
}
/**
* 删除
* @param sql 编译sql
* @param id 根据id删除
* @return
*/
public int delete(String sql, Serializable id){
return excute(sql,new Object[]{id});
}
//Serializable 序列化
public PageBean queryForPage(String sql, Object[] params, int page, int pageSize) {
PageBean pageBean = new PageBean();
//初始连接
initConn();
//查询分页结果 分两次查询 1是查询分页的结果 2是查询总记录数
//计算分页查询的 起始位置
int begin = (page - 1) * pageSize;
String tmp = sql + " limit " + begin + "," + pageSize;
initPst(tmp, params);
//查询结果
try {
ResultSet rs = pstat.executeQuery();
//获取结果集对象
ResultSetMetaData metaData = rs.getMetaData();
//获取总列数
int count = metaData.getColumnCount();
List<Map> list = new ArrayList<>();
//遍历结果
while (rs.next()) {
//一行结果 转换成map
Map map = new HashMap();
//有多少列取多少个结果
for (int i = 1; i <= count; i++) {
//获取列名
String name = metaData.getColumnLabel(i);
map.put(name, rs.getObject(name));
}
//存储当前行数据
list.add(map);
}
//循环完 所有记录转换为list
pageBean.setPage(page);
pageBean.setPageSize(pageSize);
pageBean.setList(list);
} catch (SQLException e) {
throw new RuntimeException(e);
}
//第二次查询 查询总记录数
tmp = "select count(1) " + sql.substring(sql.indexOf("from"));
initPst(tmp, params);
try {
ResultSet rs = pstat.executeQuery();
if (rs.next()) {
//取出总记录数
int total = rs.getInt(1);
//计算总页数
int pageTotal = (total % pageSize == 0) ? (total / pageSize) : (total / pageSize + 1);
pageBean.setTotal(pageTotal);
}
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
close();
}
return pageBean;
}
private void initPst(String sql, Object[] params) {
try {
pstat = conn.prepareStatement(sql);
//设置参数
if (null != params && params.length != 0) {
for (int i = 1, len = params.length; i <= len; i++) {
pstat.setObject(i, params[i - 1]);
}
}
} catch (SQLException e) {
System.out.println("初始pst语句失败");
}
}
/**
*
* @param sql 要执行的insert update delete 语句
* @return 影响的行数
*/
private int execute(String sql){
int rs=0; //默认影响行数为0
//初始连接
initConn();
//创建语句对象
try {
stat=conn.createStatement();
rs=stat.executeUpdate(sql);
} catch (SQLException e) {
System.out.println("创建语句失败");
}finally {
close();
}
return rs;
}
private int excute(String sql,Object [] params){
int rs=0;
//初始连接
initConn();
//创建语句对象
initPst(sql, params);
try {
rs=pstat.executeUpdate();
} catch (SQLException e) {
System.out.println("创建语句对象失败");
} finally {
close();
}
return rs;
}
/**
* 释放资源
*/
private void close(){
try {
if (null!=rs)
rs.close();
if (null!=stat)
stat.close();
if (null!=pstat)
pstat.close();
if (null!=conn)
conn.close();
} catch (SQLException e) {
System.out.println("资源释放异常"+e.getMessage());
}
}
private void initConn(){
try {
conn=DriverManager.getConnection(url,username,password);
} catch (SQLException e) {
System.out.println("获取数据库链接失败");
}
}
/**
* 数据库连接对象
*/
private Connection conn;
/**
* 操作简单sql语句对象
*/
private Statement stat;
/**
* 预编译对象
*/
private PreparedStatement pstat;
/**
* 结果集对象
*/
private ResultSet rs;
}
4.测试JDBC,下面只测试了查询,在Test包下面创建一个测试类DbTest
package com.by;
import com.by.db.DbTools;
import com.by.db.PageBean;
import junit.framework.TestCase;
public class DbTest extends TestCase {
/**
* 测试查询
*/
public void testQuery(){
int page=1;
int pageSize=2;
PageBean bean= DbTools.getInstance().queryForPage("select * from user where status=?",new Object[]{2},page,pageSize);
System.out.println("------");
}
}