mybatis 图书检索的模糊查询实现方式

图书检索的模糊查询思路:

1.在未输入检索关键字时展示全部的图书列表
2.输入相应的关键字例如“西游记”或“西”能出现相应的图书列表

一、mybatis相关配置

1.mybatis-cfg.xml

详细配置教程在另一篇文章中有详细解释mybatis-config.xml配置详解

//将相关的映射文件引入到配置文件中
<mappers>
//resource后面填写路径
        <mapper resource="book/dao/UserMapper.xml"></mapper>
        <mapper resource="book/dao/BookMapper.xml"></mapper>
</mappers>

2.映射文件,以BookMapper.xml为例

//namespace 命名空间后面为相关的dao(Mapper)
<mapper namespace="cn.kgc.kb07.dao.BookMapper">

二、接口方法及sql语句

1.编写一个book实体类

//编写相应的属性,最好与数据库中的字段名保持一致
public class Book {
 	private int book_id; //图书编号
    private String book_name; //图书名称
    private double price; //价格
    private int store; //库存
    private String des; //描述
    private int book_type; // 图书类型
    private int borrow_id; // 借阅人编号
    private int buy_id; // 购买者编号
    private String type_name; // 图书类型
    //篇幅原因,省略getter/setter方法
    }

2.BookMapper接口内方法定义

public interface BookMapper {
//在接口内定义一个获得图书列表的方法,这里将参数设为map,优势为可以将多个参数以键值对的形式传入map中,实现多个条件检索的方式(此外,也可将参数设置为book对象)
    List<Book> getBookList(Map map);
}

3.BookMapper.xml 动态语句编写

//id为相应的接口方法名称   parameterType参数类型为map  resultType返回值类型为Book,与前面的接口方法相对应
<select id="getBookList" resultType="Book" parameterType="map">
        select bk.*,bt.type_name,bt.default_date,bt.delay_money_per_day from tb_book bk join
        tb_book_type bt  on bk.book_type=bt.type_id
        //如果检索时有借阅人的名字时,将与借阅表进行连接
        <if test="user_name!=null and user_name !=''">
          join tb_borrow bw on bk.book_id=bw.book_id
            join tb_user u on bw.borrow_id=u.user_id
        </if>
        //where条件判断。添加1=1防止拼接语句时,where后面为and导致sql语句报错
        where 1=1
        //如果检索图书名字时,将图书名字作为条件(%表示匹配任意字符)
        <if test="book_name!=null and book_name !=''">
            and book_name like concat("%",#{book_name},"%")
        </if>
         //如果检索借阅人名字时,将借阅人名字作为条件(%表示匹配任意字符)
        <if test="user_name!=null and user_name !=''">
            and user_name like concat("%",#{user_name},"%")
        </if>
            //如果检索图书类型时,将图书类型作为条件(%表示匹配任意字符)
        <if test="type_name!=null and type_name!='' ">
            and type_name like concat("%",#{type_name},"%")
        </if>
        ;
    </select>

三、 业务层及selvert层方法编写

1.编写创建SqlSession的类(使用单例模式)

public class MapperConfig {
    //声明一个私有的静态SqlSessionFactory类
    private static SqlSessionFactory factory;
    //将构造方法设置为私有
    private MapperConfig(){};
    //static代码块在加载的时候只执行一次,保证factory只创建一次。因为SqlSessionFactory一旦被创建,
    在应用执行期间都存在,因此在应用运行期间不要重复创建多次,
    static{
        SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
        InputStream is= null;
        try {
        //读取mybatis配置文件
            is = Resources.getResourceAsStream("mybatis-cfg.xml");
            factory=builder.build(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //编写获取SqlSession的方法
public static SqlSession getSession(boolean autoCommit){
        return factory.openSession(autoCommit);
}

2.BookService接口方法定义

public interface BookService {
//参数列表为前端页面传入的数据
    List<Book> getBookList(String book_name,String type_name,String user_name);
}

3.BookServiceImpl实现类方法实现

public List<Book> getBookList(String book_name,String type_name,String user_name) {
        SqlSession session=MapperConfig.getSession(true);
        //在之前的BookMapper定义的方法参数为map,因此这边将相应的参数放入map中
        Map map=new HashMap();
        map.put("book_name",book_name);
        map.put("user_name",user_name);
        map.put("type_name",type_name);
        //通过反射方式来调用BookMapper中的方法
        List<Book> bookList= session.getMapper(BookMapper.class).getBookList(map);
        //SqlSession使用结束后就要进行关闭
        session.close();
        return bookList;
    }

4.servlet层方法重写

//继承HttpServlet类,因为HttpServlet已经实现了servlet中所有方法,而且不需要再去覆写相应的生命周期等方法,同时HttpServlet遵循HTTP协议,因此response、request等不需要再转为http类型(记得在web.xml中对servlet进行配置)
public class BookListServlet extends HttpServlet {
//重写service方法,只要servlet被请求时,都会调用service方法
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //防止中文乱码
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        //从前端页面获取数据
        String book_name=req.getParameter("book_name");
        String user_name=req.getParameter("user_name");
        String type_name=req.getParameter("type_name");
        //创建 BookServiceImpl对象,调用getBookList的方法
        BookService service=new BookServiceImpl();
        List<Book> bookList=service.getBookList(book_name,type_name,user_name);
        //将获取到的图书列表塞入到session中,并重定向到bookList.jsp页面中
        req.getSession().setAttribute("bookList",bookList);
        resp.sendRedirect("bookList.jsp");
    }
}

四、前端页面的展示

1.编写bookList.jsp

//引入c标签
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
//建表单,向后端传递相应的检索数据
<form action="bookList.do" method="post">
    图书名称:<input type="text" name="book_name">
    借阅人:<input type="text" name="user_name">
    图书类型<input type="text" name="type_name">
    <input type="submit" value="搜索">
</form>
<table border="1">
    <tr>
        <th>图书编号</th>
        <th>图书名称</th>
        <th>价格</th>
        <th>库存</th>
        <th>描述</th>
        <th>图书类型</th>
        <th>借阅记录</th>
        <th>操作</th>
    </tr>
    <c:if test="${bookList!=null}">
    //使用遍历的方式展示图书列表
    <c:forEach items="${bookList}" var="book">
        <tr>
            <th>${book.book_id}</th>
            <th>${book.book_name}</th>
            <th>${book.price}</th>
            <th>${book.store}</th>
            <th>${book.des}</th>
            <th>${book.type_name}</th>
            <th><a href="bookBorrow.jsp">借阅记录</a></th>
            <th><a href="borrow.do">借阅</a>&nbsp;&nbsp;
                <a href="back.do">归还</a>&nbsp;&nbsp;<a href="buy.do">购买</a></th>
        </tr>
    </c:forEach>
    </c:if>
    //session使用完记得销毁
    <%session.invalidate();%>
</table>

猜你喜欢

转载自blog.csdn.net/weixin_43992185/article/details/106771119