今天学习的还是分页管理,不过是用Java+数据库实现。
在学习的过程中遇到不少的问题,首先就是忘了数据库的密码,花费了一上午的时间百度怎么重置MySQL的密码什么的,结果在下午上课前又想起了。然后就是老师给的连接数据库的驱动和我的数据库不兼容,又搞了一个多小时才发现这个问题。。。
言归正传,用Java+数据库 实现分页管理,我们首先得在数据库中创建一个表,用于存储数据,可以先填充一些数据。
然后根据表定义一个Car类
public class Car {
private int id;
private String name;
private String position;
public Car() {
}
@Override
public String toString() {
return "Car [id=" + id + ", name=" + name + ", position=" + position + "]";
}
public Car(int id, String name, String position) {
super();
this.id = id;
this.name = name;
this.position = position;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPosition() {
return position;
}
public void setPosition(String position) {
this.position = position;
}
}
然后就定义一个DBHelper类封装一些对数据库的操作,如增删改查,这里我们需要的是查这个操作。我们还可以在里面封装获取与数据库的连接的操作和关闭与数据库的连接的操作。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class DBHelper {
private static String DRIVER = "com.mysql.cj.jdbc.Driver";
private static String URL = "jdbc:mysql://localhost:3306/test?" + "useUnicode=true" + "&characterEncoding=utf8"
+ "&serverTimezone=GMT%2B8&useSSL=false";
private static String NAME = "root";
private static String PASSWORD = "mysql";
// 获取连接
public static Connection getConnection() {
Connection conn = null;
try {
Class.forName(DRIVER);
conn = DriverManager.getConnection(URL, NAME, PASSWORD);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
// 关闭数据库
public static void close(Connection conn) {
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
// 查询
public static ResultSet selectAll(Connection conn, String sql, Object... values) {
ResultSet rs = null;
try {
PreparedStatement ps;
ps = conn.prepareStatement(sql);
for (int index = 0; index < values.length; index++) {
ps.setObject((index + 1), values[index]);
}
rs = ps.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
}
return rs;
}
// 增加,删除,修改
public static int executeUpdate(Connection conn, String sql, Object... values) {
int i = -1;
try {
PreparedStatement ps = conn.prepareStatement(sql);
for (int index = 0; index < values.length; index++) {
ps.setObject((index + 1), values[index]);
}
i = ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
return i;
}
}
这样,数据库的操作就封装完成了,以后我们需要调用数据库方法就方便很多。
封装完数据库的操作,接下来就是实现接口,定义一个接口类,在接口类中里面有添加车辆信息、删除停车信息、修改停车信息、查询车辆信息(查看所有的信息)、分页查询车辆信息
import java.util.List;
import com.jiangsan.bean.Car;
public interface CarDAO {
public int insert(Car car);//添加
public int delete(int id);//删除
public int updata(Car car);//修改
public List select();//查询
public List getPage(int pageNum,int pageSize);//查询并分页显示信息
}
定义这些接口,在这里重点讲查询并分页显示,在该方法中,我们首先得声明一个List容器,用于存放查询到的数据。然后获取与数据库的连接,我们直接调用已经封装好的方法DBHelper.getConnection,这样就获取了与数据库的连接。
用一个sql变量存放SQL语句,而且我们得理解SQL语句中的limit,limit后面的第一个数字是从第几行开始查询,第二个数字是查询多少行。比如select * from Customer LIMIT 10; --检索前10行数据,显示1-10条数据
select * from Customer LIMIT 1,10; --检索从第2行开始,累加10条id记录,共显示id为2....11
select * from Customer limit 5,10; --检索从第6行开始向前加10条数据,共显示id为6,7....15
select * from Customer limit 6,10; --检索从第7行开始向前加10条记录,显示id为7,8...16
调用DBHelper中的查询方法selectAll(),返回一个结果集,用rs存储。然后用循环的方式,将结果集中的数据用Car类型保存在list中,返回一个list。
public class CarDAOImpl implements CarDAO {
@Override
public int insert(Car car) {
Connection conn = DBHelper.getConnection();
String sql = "insert into car(`id`,`name`,`position`) values(?,?,?)";
return DBHelper.executeUpdate(conn, sql, car.getId(), car.getName(), car.getPosition());
}
@Override
public int delete(int id) {
Connection conn = DBHelper.getConnection();
String sql = "delete from car where id = ?";
return DBHelper.executeUpdate(conn, sql, id);
}
@Override
public int updata(Car car) {
Connection conn = DBHelper.getConnection();
String sql = "update car set `name` = ?,`position` = ? where `id` = ?";
return DBHelper.executeUpdate(conn, sql, car.getName(), car.getPosition(), car.getId());
}
@Override
public List select() {
List list = new ArrayList();
Connection conn = DBHelper.getConnection();
String sql = "select * from car";
ResultSet rs = DBHelper.selectAll(conn, sql);
try {
while (rs.next()) {
Car car = new Car();
car.setId(rs.getInt(1));
car.setName(rs.getString(2));
car.setPosition(rs.getString(3));
list.add(car);
}
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
public List getPage(int pageNum, int pageSize) {
List list = new ArrayList<>();
Connection conn = DBHelper.getConnection();
String sql = "select * from car limit ? ,?";
ResultSet rs = DBHelper.selectAll(conn, sql, (pageNum - 1) * pageSize, pageSize);
try {
while (rs.next()) {
Car car = new Car();
car.setId(rs.getInt(1));
car.setName(rs.getString(2));
car.setPosition(rs.getString(3));
list.add(car);
}
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
}
用一个main函数测试一下,因为时间的关系,就没有写服务层。但是其他操作也可以用,就像增删改,只是没有去调用他们,有兴趣的话自己去试试。
public class test {
public static void main(String[] args) {
CarDAO productDAO = new CarDAOImpl();
Scanner in = new Scanner(System.in);
while (true) {
System.out.println("请输入页码");
int pageNum = in.nextInt();
System.out.println("请输入需要显示的条数");
int pageSize = in.nextInt();
List list = productDAO.getPage(pageNum, pageSize);
for (Car car : list) {
System.out.println(car);
}
}
}
}