图书检索的模糊查询思路:
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>
<a href="back.do">归还</a> <a href="buy.do">购买</a></th>
</tr>
</c:forEach>
</c:if>
//session使用完记得销毁
<%session.invalidate();%>
</table>