带条件查询及分页

1.思路分析

2.代码编写

JSP 动作元素:

jsp:forward

把请求转到一个新的页面

 

Index.jsp进入servlet

<body>

  <jsp:forward page="bookServlet.do" />

</body>

 

在每个页面跳转到Servlet添加一个变量(choose),根据操作的不同传递不同的值,来区分用户的操作

 

Index.jsp

add.jsp

Servlet

  • 编写查询

需求:

  1. 在booklist.jsp页面需要显示所有图书类型

    1.需要查询全部图书类型

Booklist.jsp

<style type="text/css">

  div{ width: 800px; height: 600px; margin: 0px auto; border: 1px solid red;}

 

</style>

</head>

<body>

<div>

<h1 style="text-align: center;">图书借阅系统</h1>

<form action="bookServlet.do" method="post" style="text-align: center;" >

   图书分类<select name="booktypeid">

     <option value="0">全部</option>

   </select>&nbsp;

   图书名称<input type="text" name="bookname">&nbsp;

   是否借阅<select name="borrow">

   <option value="-1">请选择</option>

    <option value="0">未借阅</option>

    <option value="1">已借阅</option>

   </select>&nbsp;

   <input type="hidden" name="choose"  value="1">

<input type="hidden" name="pageno"  value="1">

   <input type="submit" value="查询">

  

 

</form>

</div>

</body>

 

Servlet中查询的代码编写

  查询图书类型

    /**

     * 查询图书类型

     * @param request

     * @param response

     * @throws ServletException

     * @throws IOException

     */

    protected void queryBookType(HttpServletRequest request, HttpServletResponse response)

           throws ServletException, IOException {

       //调用service层的方法

    List<BookType> bookTypes=   bookTypeService.queryAll();

    //

    HttpSession  session=request.getSession();

     session.setAttribute("bookTypes",bookTypes );

      

    }

 

三层编写

public class BookTypeDaoImpl implements BookTypeDao {

 

    private  QueryRunner  queryRunner=C3P0Util.getQueryRunner();

   

    @Override

    public List<BookType> queryAll() {

       String sql="SELECT  * from book_type";

       List<BookType> bookTypes=null

    try {

       bookTypes= queryRunner.query(sql,new BeanListHandler<BookType>(BookType.class));

    } catch (SQLException e) {

       // TODO Auto-generated catch block

       e.printStackTrace();

    }

       return bookTypes;

    }

 

}

 

  • 页面是带3个条件的分页的动态查询

 在servlet中需要获取到3个参数及当前页码数

 参数:

图书分类

图书名称

是否借阅

当前页码数

 

分析:

页面 需要显示当前页码数 和总页数

最终页面要显示的数据:

            图书的集合

            当前页码数

            总页数

            选择图书类型及按图书名称和状态查询后 在对应的位置参数要回显

 

#7行数数据  如果每页显示3行--》3页

#总页数=总记录数/每页显示的行数 (总记录数%每页显示的行数==0)

#总页数=总记录数/每页显示的行数+1 (总记录数%每页显示的行数!=0)

 

#第一页

SELECT  * from  book_info  LIMIT 0,3

#第二页

SELECT  * from  book_info  LIMIT 3,3

#第三页

SELECT  * from  book_info  LIMIT 6,3

#第一个参数与当前页码数的关系  (当前页码数-1)*每页显示的行数

 

--》将分页需要的参数 封装成javaBean

/**

 *  属性设置的顺序:1.pageSize(每页显示的行数) 2.rows(总行数) 3. pageNo(当前页码数)

 * @author Administrator

 *

 * @param <T>

 */

public class PageBean<T> {

 

    private List<T> lists;// 存放当前页面 数据的集合

    private Integer pageNo = 1;// 当前页码数

    private Integer pageSize = 4; // 每页显示的行数

    private Integer totalPage;// 总页数

    private Integer rows;// 总行数

 

    public List<T> getLists() {

       return lists;

    }

 

    public void setLists(List<T> lists) {

       this.lists = lists;

    }

 

   

 

    public Integer getPageNo() {

       return pageNo;

    }

 

    public void setPageNo(Integer pageNo) {

       if (null == pageNo) {

           this.pageNo = 1;

           // 当前页码数 一直点击下一页 变成了 5  但是数据库查询出来的总页数 只有3

           // 这种情况 当前页码数=总页数(3)

            //如果在进行上述计算的时候  查询总页数的代码有问题 导致总页数=0

           //这个时候当前页码数=0

       } else if (pageNo > this.totalPage&&this.totalPage>0) { // --totalPage有值--pageSize(rows) 要预防多条件查询 总记录数为0 导致当前页码数为0 limit第一个参数为负数

           this.pageNo = this.totalPage;

       } else if(pageNo<=0){

           this.pageNo = 1;

       }else{

           this.pageNo=pageNo;

       }

    }

 

    public Integer getPageSize() {

       return pageSize;

    }

 

    public void setPageSize(Integer pageSize) {

       this.pageSize = pageSize;

    }

 

    public Integer getTotalPage() {

       return totalPage;

    }

 

   

 

    public Integer getRows() {

       return rows;

    }

 

    public void setRows(Integer rows) {

       this.rows = rows;

       //自动计算出总页数

       this.totalPage=rows%this.pageSize==0?rows/this.pageSize:rows/this.pageSize+1; 

    }

 

}

 

 

动态条件查询分页代码编写:

分页动态查询Servlet

    protected void queryBook(HttpServletRequest request, HttpServletResponse response)

           throws ServletException, IOException {

       // 取调存转

       String booktypeid = request.getParameter("booktypeid");

       String bookname = request.getParameter("bookname");

       String borrow = request.getParameter("borrow");

       String pageno = request.getParameter("pageno");

 

       // 查询总行数

       int count = bookService.bookCount(Integer.parseInt(booktypeid), bookname, Integer.parseInt(borrow));

       // 创建分页工具类的对象

       PageBean<Book> pageBean = new PageBean<Book>();

       pageBean.setPageSize(3);// 每页显示的行数

       pageBean.setRows(count);

       // null 注意 pageno要检测是否为null null NumberFromatException

       pageBean.setPageNo(Integer.parseInt(pageno));

       // 获取分页的第一个参数

       int first = (pageBean.getPageNo() - 1) * pageBean.getPageSize();

       // 调用service 查询的条件及 limit2个参数传递过去

    List<Book> books= bookService.queryBook(Integer.parseInt(booktypeid), bookname, Integer.parseInt(borrow), first,

              pageBean.getPageSize());

 

    }

 

Service

public class BookServiceImpl implements BookService {

 

    private BookDao bookdao = new BookDaoImpl();

 

    @Override

    public int addBook(Book book) {

 

       return bookdao.addBook(book);

    }

 

    @Override

    public List<Book> queryBook(int booktype, String bookname, int borrow, int frist, int end) {

       // TODO Auto-generated method stub

       return bookdao.queryBook(booktype, bookname, borrow, frist, end);

    }

 

    @Override

    public int bookCount(int booktype, String bookname, int borrow) {

       // TODO Auto-generated method stub

       return 0;

    }

 

}

 

 

Dao

public interface BookDao {

 

    int addBook(Book  book);

   

    int bookCount(int booktype,String bookname, int borrow);

    /**

     *  动态条件分页查询

     * @param booktype  图书类型id  0代码查询全部

     * @param bookname  图书名称

     * @param borrow    是否借阅  -1代码不按状态查询

     * @param frist    分页参数1

     * @param end      分页参数2

     * @return

     */

    List<Book>  queryBook(int booktype,String bookname, int borrow,int frist,int end);

}

 

public class BookDaoImpl implements BookDao {

 

    private QueryRunner queryRunner = C3P0Util.getQueryRunner();

 

    @Override

    public int addBook(Book book) {

       String sql = "insert into book_info(book_code,book_name,book_type,book_author,publish_press,publish_date,is_borrow) VALUES(?,?,?,?,?,?,?) ";

       int num = 0;

       try {

           num = queryRunner.update(sql, book.getBook_code(), book.getBook_name(), book.getBook_type(),

                  book.getBook_author(), book.getPublish_press(), book.getPublish_date(), book.getIs_borrow());

       } catch (SQLException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }

 

       return num;

    }

 

    @SuppressWarnings({ "unchecked", "rawtypes", "null" })

    @Override

    public List<Book> queryBook(int booktype, String bookname, int borrow, int frist, int end) {

       StringBuffer sb = new StringBuffer();

       List par = new ArrayList();

       List<Book> books = null;

       sb.append(

              "SELECT book_info.book_id,book_info.book_code,book_info.book_name,book_info.book_type,book_info.book_author,book_info.publish_press,book_info.publish_date,book_info.is_borrow,book_info.path, book_type.type_name FROM  book_info INNER JOIN book_type ON book_info.book_type = book_type.id  where  1=1");

       if (booktype != 0) {

           sb.append(" and  book_type=? ");

           par.add(booktype);

       }

       if (bookname != null && !"".equals(bookname)) {

 

           sb.append("  and book_name like ?");

           par.add("%" + bookname + "%");

       }

       if (borrow != -1) {

           sb.append("  and  is_borrow=?");

           par.add(borrow);

       }

       sb.append("  limit ?,?");

       par.add(frist);

       par.add(end);

       try {

           books = queryRunner.query(sb.toString(), new BeanListHandler<Book>(Book.class), par.toArray());

       } catch (SQLException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }

       return books;

    }

 

    @SuppressWarnings({ "rawtypes", "unchecked" })

    @Override

    public int bookCount(int booktype, String bookname, int borrow) {

       StringBuffer sb = new StringBuffer();

       sb.append("select  COUNT(*) from book_info where  1=1 ");

       List par = new ArrayList();

       Long count = 0l;

       if (booktype != 0) {

           sb.append(" and  book_type=? ");

           par.add(booktype);

       }

       if (bookname != null && !"".equals(bookname)) {

 

           sb.append("   and book_name like ?");

           par.add("%" + bookname + "%");

       }

       if (borrow != -1) {

           sb.append("   and  is_borrow=?");

           par.add(borrow);

       }

 

        try {

           count = (Long) queryRunner.query(sb.toString(), new ScalarHandler(1), par.toArray());

       } catch (SQLException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }

 

       return count.intValue();

    }

 

}

 

 

 

测试

public class TestServlet {

    public static void main(String[] args) {

 

       BookService bookService = new BookServiceImpl();

       // 取调存转

       String booktypeid = "1";

       String bookname = "";

       String borrow = "0";

       String pageno = "1";

 

       // 查询总行数

       int count = bookService.bookCount(Integer.parseInt(booktypeid), bookname, Integer.parseInt(borrow));

       // 创建分页工具类的对象

       PageBean<Book> pageBean = new PageBean<Book>();

       pageBean.setPageSize(3);// 每页显示的行数

       pageBean.setRows(count);

       // null 注意 pageno要检测是否为null null NumberFromatException

       pageBean.setPageNo(Integer.parseInt(pageno));

       // 获取分页的第一个参数

       int first = (pageBean.getPageNo() - 1) * pageBean.getPageSize();

       // 调用service 查询的条件及 limit2个参数传递过去

       List<Book> books = bookService.queryBook(Integer.parseInt(booktypeid), bookname, Integer.parseInt(borrow),

              first, pageBean.getPageSize());

 

       for (Book book : books) {

           System.out.println(book);

       }

    }

}

 

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在Spring Boot中,你可以使用Spring Data JPA和Spring Data的分页支持来实现条件分页查询。下面是一个示例代码,演示了如何使用条件查询分页查询: ```java import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.domain.Specification; // 假设你有一个实体类User,拥有name和age属性 public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> { } public class UserService { @Autowired private UserRepository userRepository; public Page<User> findUsersWithCondition(String name, int age, int page, int size) { // 创建条件查询规范 Specification<User> spec = (root, query, criteriaBuilder) -> { List<Predicate> predicates = new ArrayList<>(); if (name != null) { predicates.add(criteriaBuilder.equal(root.get("name"), name)); } predicates.add(criteriaBuilder.equal(root.get("age"), age)); return criteriaBuilder.and(predicates.toArray(new Predicate[0])); }; // 创建分页请求 Pageable pageable = PageRequest.of(page, size); // 执行条件分页查询 return userRepository.findAll(spec, pageable); } } ``` 在上面的示例中,我们定义了一个`UserRepository`接口继承`JpaRepository`和`JpaSpecificationExecutor`,这使得我们可以使用Spring Data JPA提供的条件查询分页查询功能。 然后,在`UserService`类中,我们注入了`UserRepository`,并编写了一个`findUsersWithCondition`方法来执行条件分页查询。该方法接收名字、年龄、页码和每页大小作为参数,并使用`Specification`对象创建了一个条件查询规范。然后,我们使用`PageRequest`对象创建了一个分页请求,并将条件查询规范和分页请求传递给`userRepository.findAll()`方法来执行查询。 这样你就可以使用条件分页查询来检索符合特定条件的数据了。记得在你的项目中配置好Spring Data JPA和数据库连接信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值