1.分页
Java的分页功能通常在Web开发中用于展示数据列表的分页显示。这种场景下,数据量可能非常庞大,如果一次性将所有记录都展示出来,会导致页面加载缓慢,用户体验不佳。
分页功能可以将数据分为多个页面展示,每个页面仅包含一定数量的记录,大大提高了页面加载速度和响应时间,增强了用户体验。此外,分页功能还可以支持用户自行选择每页显示的记录数和跳转到指定页面的功能,更加满足用户的需求。
1.1分页需要的步骤
- 定义每页显示的记录数pageSize和当前页码pageNum。
- 查询总记录数total,并计算总页数pageCount(total/pageSize,若有余数则加1)。
- 计算每页的起始记录位置start((pageNum-1)*pageSize)。
- 编写查询语句时加上LIMIT语句,限制查询结果的起始位置和记录数,如:LIMIT start, pageSize。
- 返回查询结果以及总页数等信息。
我首先用BaseDao
首先建立一个类,分页工具类里面写需要的属性----页码,条目(页大小),总记录数,及写了是否需要分页4个属性,在这个里面写了一个起始下标的方法
package com.sy.utils; /** * 分页工具类 * */ public class PageBean { private int page = 1;// 页码 private int rows = 10;// 页大小 private int total = 0;// 总记录数 private boolean pagination = true;// 是否分页 public PageBean() { super(); } public int getPage() { return page; } public void setPage(int page) { this.page = page; } public int getRows() { return rows; } public void setRows(int rows) { this.rows = rows; } public int getTotal() { return total; } public void setTotal(int total) { this.total = total; } public void setTotal(String total) { this.total = Integer.parseInt(total); } public boolean isPagination() { return pagination; } public void setPagination(boolean pagination) { this.pagination = pagination; } /** * 获得起始记录的下标 * * @return */ public int getStartIndex() { return (this.page - 1) * this.rows; } @Override public String toString() { return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", pagination=" + pagination + "]"; } }
接着在去Dao层写方法:
2.mysql连接类
2.1连接数据库类
package com.sy.utils; 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("数据库连接(关闭)成功"); } }
3.工具(帮助)类
3.1帮助类
StringUtils类
package com.sy.utils; public class StringUtils { // 私有的构造方法,保护此类不能在外部实例化 private StringUtils() { } /** * 如果字符串等于null或去空格后等于"",则返回true,否则返回false * * @param s * @return */ public static boolean isBlank(String s) { boolean b = false; if (null == s || s.trim().equals("")) { b = true; } return b; } /** * 如果字符串不等于null或去空格后不等于"",则返回true,否则返回false * * @param s * @return */ public static boolean isNotBlank(String s) { return !isBlank(s); } }
3.2工具类
PageBean类
package com.sy.utils; /** * 分页工具类 * */ public class PageBean { private int page = 1;// 页码 private int rows = 10;// 页大小 private int total = 0;// 总记录数 private boolean pagination = true;// 是否分页 public PageBean() { super(); } public int getPage() { return page; } public void setPage(int page) { this.page = page; } public int getRows() { return rows; } public void setRows(int rows) { this.rows = rows; } public int getTotal() { return total; } public void setTotal(int total) { this.total = total; } public void setTotal(String total) { this.total = Integer.parseInt(total); } public boolean isPagination() { return pagination; } public void setPagination(boolean pagination) { this.pagination = pagination; } /** * 获得起始记录的下标 * * @return */ public int getStartIndex() { return (this.page - 1) * this.rows; } @Override public String toString() { return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", pagination=" + pagination + "]"; } }
4.实体类
Book类
package com.sy.entity; public class Book { private int bid; private String bname; private float price; @Override public String toString() { return "Book [bid=" + bid + ", bname=" + bname + ", price=" + price + "]"; } public int getBid() { return bid; } public void setBid(int bid) { this.bid = bid; } public String getBname() { return bname; } public void setBname(String bname) { this.bname = bname; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } }
5.数据访问层
package com.sy.Dao; import java.util.ArrayList; import java.util.List; import com.sy.entity.Book; import com.sy.utils.PageBean; import com.sy.utils.StringUtils; /** * dao方法类 * @author 86131 * */ public class BookDao extends BaseDao<Book>{ /** * 查询所有的方法 * @param book * @param pagebean * @return list * @throws Exception */ public List<Book> queryAll(Book book,PageBean pagebean) throws Exception{ //sql语句 //查询所有 String sql="select * from t_mvc_book where 1=1 ";//必然会进来 //根据name属性进行模糊查询 String bname = book.getBname();//获取bname属性 //判断(模糊查询) if(StringUtils.isNotBlank(bname)) {//如果字符串bname不为空就拼接在SQL语句 sql+=" and bname like '%"+bname+"%'"; } return super.executeQuery(Book.class, sql, pagebean); } //测试 public static void main(String[] args) throws Exception { Book book=new Book(); PageBean pagebean =new PageBean(); List<Book> queryAll = new BookDao().queryAll(book, pagebean); for (Book book2 : queryAll) { System.out.println(book2); } } }
输出结果为:
6.单元测试框架Junit分享
6.1什么是Junit
JUnit是Java中最流行的单元测试框架之一,它可以帮助开发者快速编写和运行单元测试,并提供了丰富的断言方法来验证测试结果是否正确。
JUnit的主要特性包括:
- 可以自动发现测试用例,也可以手动指定执行的测试用例。
- 提供了多种运行器(Runner)和断言方法(Assertions)。
- 支持测试结果的记录和报告,可以方便集成到持续构建和集成环境中。
JUnit使用注解来标注测试方法,例如@Test、@RunWith等,可以方便地指定测试用例执行顺序、重复次数、超时时间等。同时,JUnit也提供了各种各样的断言方法来验证测试结果是否符合预期,如assertTrue、assertEquals、assertNotNull等等。
使用JUnit进行单元测试可以有效地提高代码质量和可维护性,可以及早发现代码问题和障碍,并且可以确保代码在整个开发过程中始终保持稳定和可用。同时,JUnit测试用例也可以作为代码文档,方便其他开发者理解代码实现细节和逻辑。
6.2使用Junit的好处
1.测试覆盖率更高:
使用JUnit可以将各个单独的代码段进行测试,以确保代码的每个部分都可以正常工作。这有助于提高测试覆盖率,以确保更高的代码质量。
2.代码可维护性更好:
JUnit测试用例易于编写和维护,这有助于降低资源消耗和提高可维护性。
3.减少检测错误和缺陷的成本:
JUnit测试用例可以快速、自动并且准确地识别代码错误和缺陷,因此可以大大降低由错误导致的成本。
4.提高代码质量:
JUnit测试可以提供反馈,帮助开发人员更加了解代码的弱点和优点,从而可以及时进行改进。
5.促进更好的编程实践:
通过JUnit测试,开发人员可以更好地了解团队中其他成员编写的代码。这有助于更好的编程实践、代码规范和提高代码可读性。
6.3怎么使用
然后就可以去测试了。