SSM整合项目总结(二)

三.实现的功能及要点

以findAll方法解释整个框架的方法调用过程:controller中findAll() —> service的findAll() —> dao中findAll(),在dao的方法上加入@Select()注解,()内写相应SQL语句;

(一)产品Product

前提:需要的注解

①首先在Controller类的上方加入@Controller注解,
②加入类成员变量productService,并加入@Autowired注解,
③在对应的ServiceImpl头加入@Service和@Transactional(事务),
④在对应的Service中引入成员变量productDao,加入@Autowired注解,
⑤在Controller类外加入@RequestMapping("/product")注解,这里相当于value="/product",但是只有一个参数,'value='可以省略
⑥在controller的每个方法头都加入对应的@RequestMapping("/methodname.do"),如"save.do"

1.查询所有findAll:
①findAll方法返回一个List

这里借助ModelAndView将这个List的内容显示在jsp页面上

ModelAndView mv = new ModelAndView();
List<Product> ps = productService.findAll();
mv.addObject("productList",ps);//代表jsp页面中的变量名为productList
mv.setViewName("product-list1");//代表结果呈现的jsp页面为product-list1.jsp
return mv;
②权限控制的注解
@RolesAllowed("ADMIN")
public ModelAndView findAll() throws Exception {
2.产品添加save:
①添加信息后要重定向

将要添加的信息存入数据库后,前端页面重新查询所有信息,所以本方法返回值为String,实现重定向到查询所有

return "redirect:findAll.do";
@Insert("insert into product(productNum,productName,cityName,departureTime,productPrice,productDesc,productStatus) values(#{productNum},#{productName},#{cityName},#{departureTime},#{productPrice},#{productDesc},#{productStatus})")
public void save(Product product);
②日期格式转换问题

后端获取到前端输入的内容是字符串格式,Product实体类中日期的Date格式,存在类型转换的问题。这里的解决方法是在实体类中需要进行转换的属性上方加入@DateTimeFormat注解

@DateTimeFormat(pattern="yyyy-MM-dd HH:mm")
private Date departureTime;//出发时间
3.根据id查询产品findById:

这里定义本方法只是为了能根据orders中的外键查询到product

(二)订单Orders

1.查询所有findAll:
①实体类是Product,数据库是外键productId,用@Result

实体类Orders有一个自定义类Product类型的属性,但在数据库中orders表对应的是外键productId,查询时要进行相应的转换,用到@Result注解

//dao层
@Select("select * from orders")
@Results({
        //property是实体类的属性名字,column是数据库的属性名字
        @Result(id=true,property = "id", column = "id"),
        @Result(property = "orderNum", column = "orderNum"),
        @Result(property = "orderTime", column = "orderTime"),
        @Result(property = "orderStatus", column = "orderStatus"),
        @Result(property = "peopleCount", column = "peopleCount"),
        @Result(property = "payType", column = "payType"),
        @Result(property = "orderDesc", column = "orderDesc"),
        @Result(property = "product", column = "productId", javaType = Product.class, one = @One(select = "com.itheima.ssm.dao.IProductDao.findById")),
    })
public List<Orders> findAll() throws Exception;
//controller层
//未分页
@RequestMapping("/findAll.do")
//这里是springsecurity的权限控制注解,这里采用@Secured注解方式,这里的角色名前面需要有ROLE_,采用JSR250注解方式可以不加ROLE
@Secured("ROLE_ADMIN")
public ModelAndView findAll() throws Exception {
②PageHelper的使用
a.集成方法:

本项目采用的集成PageHelper插件的方法是使用Maven,在pom.xml中添加如下依赖

<dependency>
     <groupId>com.github.pagehelper</groupId>
     <artifactId>pagehelper</artifactId>
     <version>5.1.2</version>
</dependency>
b.配置

使用spring的属性配置方式,在在applicationContext.xml的SQLSessionFactory中配置拦截器插件

<!--交给IOC管理SqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
	<!--详见applicationContext.xml中-->
	<property name="plugins"...>	
</bean>
c.使用

· 本项目采用PageHe.startPage静态方法调用,在需要进行分页的MyBatis查询方法前调用PageHelper.startPage静态方法即可,紧跟在这个方法之后的第一个MyBatis查询方法会被进行分页。
· 使用时三处需要进行相应设置

controller层将查询到的List直接赋值给PageInfo对象,注意findAll方法的参数

//controller层
//分页
@RequestMapping("/findAll.do")
//这里是springsecurity的权限控制,此处采用@Secured注解方式,这里的角色名前面需要有ROLE_,采用JSR250注解方式可以不加ROLE
@Secured("ROLE_ADMIN")
//jsp页面中传递了name为page和size的参数,findAll方法中可以使用@RequestParam来获取参数,并对参数进行改名,Integer page中的page可以改为其他想要的任何变量名
public ModelAndView findAll(@RequestParam(name = "page",required = true,defaultValue = "1") Integer page, @RequestParam(name = "size",required = true,defaultValue = "4") Integer size) throws Exception {

   ModelAndView mv = new ModelAndView();
   List<Orders> ordersList = ordersService.findAll(page, size);
   //PageInfo是一个分页Bean,其内部有pageNum、total、nextPage等信息
   PageInfo pageInfo=new PageInfo(ordersList);
   mv.addObject("pageInfo",pageInfo);
   mv.setViewName("orders-page-list");
   return mv;
}

service层调用静态方法

//service层
public List<Orders> findAll(int page, int size) throws Exception {
   //pageNum是页码值,pageSize是每页显示条数
   PageHelper.startPage(page,size);
   return ordersDao.findAll();
}

jsp文件中显示数据部分对pageInfo进行遍历

<c:forEach items="${pageInfo.list}" var="orders">
	<tr>
		<td><input name="ids" type="checkbox"></td>
		<td>${orders.id }</td>
		<td>${orders.orderNum }</td>
		...
	</tr>
</c:forEach>

jsp文件中选择页数部分注意参数传递,page代表第几页,size代表一页的条数

<ul class="pagination">
    <li>
        <a href="${pageContext.request.contextPath}/orders/findAll.do?page=1&size=${pageInfo.pageSize}" aria-label="Previous">首页</a>
    </li>
    <li><a href="${pageContext.request.contextPath}/orders/findAll.do?page=${pageInfo.pageNum-1}&size=${pageInfo.pageSize}">上一页</a></li>
    <c:forEach begin="1" end="${pageInfo.pages}" var="pageNum">
	<li><a href="${pageContext.request.contextPath}/orders/findAll.do?page=${pageNum}&size=${pageInfo.pageSize}">${pageNum}</a></li>
	</c:forEach>

    <li><a href="${pageContext.request.contextPath}/orders/findAll.do?page=${pageInfo.pageNum+1}&size=${pageInfo.pageSize}">下一页</a></li>
    <li>
    <a href="${pageContext.request.contextPath}/orders/findAll.do?page=${pageInfo.pages}&size=${pageInfo.pageSize}" aria-label="Next">尾页</a>
    </li>
</ul>

jsp文件中进行每页条数控制的部分使用了js

<div class="form-group form-inline">
     总共2 页,共14 条数据。 每页
     <select class="form-control" id="changePageSize" onchange="changePageSize()">
     	 ...
         <option>3</option>
         <option>4</option>
         <option>5</option>
      </select></div>

<script>
	function changePageSize() {
		//获取下拉框的值
		var pageSize = $("#changePageSize").val();
		//向服务器发送请求,改变每页显示条数
		location.href = "${pageContext.request.contextPath}/orders/findAll.do?page=1&size="+ pageSize;
}
</script>
2.根据id查询订单findById:
①jsp页面传递参数后获取方法

jsp页面传递了id参数,controller获取时改名为ordersId,注意findById的参数

<button type="button" class="btn bg-olive btn-xs" onclick="location.href='${pageContext.request.contextPath}/orders/findById.do?id=${orders.id}'">详情</button>
//controller层
@RequestMapping("/findById.do")
public ModelAndView findById(@RequestParam(name = "id",required = true) String ordersId) throws Exception{...}
    
②orders和travellers多对多查询

Orders有一个List<Traveller>类型的属性travellers,travellers和orders是多对多关系,此处需要借助中间表查询,即在dao层查询时要进行相应设置

//IOrdersDao中
@Select("select * from orders where id=#{ordersId}")
@Results({
    	//property是实体类的属性名字,column是数据库的属性名字
        @Result(id=true,property = "id", column = "id"),
        @Result(property = "orderNum", column = "orderNum"),
        @Result(property = "orderTime", column = "orderTime"),
        @Result(property = "orderStatus", column = "orderStatus"),
        @Result(property = "peopleCount", column = "peopleCount"),
        @Result(property = "payType", column = "payType"),
        @Result(property = "orderDesc", column = "orderDesc"),
        //两个外键,参考Orders的findAll中的外键解释
        @Result(property = "product", column = "productId", javaType = Product.class, one = @One(select = "com.itheima.ssm.dao.IProductDao.findById")),
        @Result(property = "member", column = "memberId",javaType = Member.class, one=@One(select = "com.itheima.ssm.dao.IMemberDao.findById")),
		//订单和旅客是多对多,需要通过中间表来查询。根据订单号来查询出对应的旅客,所以column是id(订单的id)
        @Result(property = "travellers", column = "id", javaType = java.util.List.class, many = @Many(select = "com.itheima.ssm.dao.ITravellerDao.findByOrdersId"))
})
public Orders findById(String ordersId) throws Exception;
//ITravellerDao中
@Select("select * from traveller where id in (select travellerId from order_traveller where orderId=#{ordersId})")
public List<Traveller> findByOrdersId(String ordersId) throws Exception;

后接总结(三)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值