Springmvc RESTful和SQL LEFT JOIN知识盲点总结
2016-01-07 22:57
495 查看
写在这篇小结前的题外话:特别感谢 沉默王二 那特别能让人产生亲切感的博客,让我明白一个最普通不过的程序员都能活出不一样的自己,改变自己。同时也建议大家能抽空去看看他的博客,真的特别真实,不为别的,只让自己有迈出第一步的勇气,再次感谢!
公司最近在重构系统,作为刚进公司不久的代码小白来说是一次很重要经验积累的机会,为了能多了解一些以前不知道的知识点,厚颜无耻的缠着我的技术导师问了很多白痴的问题,现在回想起来都为自己的菜感到无比脸红,这里就写我了解的比较清楚的东西吧,不清不楚的写出来也对不起各位同学。下面是这一段时间在公司做项目的一些小总结,留作笔记,也同时心中有些小期待能帮各位同学解决一些小问题。
Controller层代码:
前台代码:
看完上面这段代码,想必都应该清楚了,当前台使用GET方式访问路径/acl/role/add时,该请求会通过@RequestMapping映射到Controller层的add()方法。该注解有两个参数: value和method
value: 指定请求的地址。它的格式可以有下面三类:
1. 最普通的具体值,如上面的/acl/role/add
2. 带有变量的值,如/{roleId}/update
3. 带有正则表达式的值(这个没写过例子,网上找了个)如:{symbolicName:[a-z-]+}-{version:\d.\d.\d}.{extension:.[a-z]}/update
method: 请求的method,包括PUT, POST, GET, DELETE
controller层:
前台请求:
像这样,当前台请求/acl/role/ + id + /edit时,id作为请求参数传到controller,如果要获取该参数,只需要在定义的参数面前加上@PathVariable(“id”)就行了.
value : 顾名思义表示参数名
required: 该参数是否真的需要传递,true为需要传递,如果没有传递,将抛出错误(默认为true)
Controller层:
前台请求:
像这样,当我想传递selectedNode给Controller时,Controller可以像上面一样在具体某个方法的参数里定义@RequestParam,即可获得(这里required为false,意思是如果前台不传这个参数或者传过来值为空时,不会抛异常)
然后根据返回对象上的数据绑定到Controller层的参数上。这里涉及到两个比较陌生的概念: content-type和HttpMessageConverter。关于content-type,它表示具体请求中的媒体类型信息(更多content-type的介绍请参照这里)。如下图,某次请求的header信息:
这里的content-type为 application/json类型,所以会选择下图的Converter去解析数据:
把解析完的数据对象绑定到Controller的参数上面,达到传参的效果。关于HttpMessageConverter再多说一句:如果使用了< mvc: annotation-driven>配置时,会默认的配置RequestMappingHandlerAdapter,并为它默认配置一系列的HttpMessageConverter,如图:
@ResponseBody 将Controller处理后返回的对象,根据request请求header中的Accept属性的值,找到相应的HttpMessageConverter,把处理后的数据写入到response的body数据区中。如果你返回的不是一个ModelAndView,而是需要返回json或者其他格式的数据时,可以使用该注解。
select column_name from table_left left join table_right on table_left.column = table_right.column。
例如:
现在有一张Person表
另外有一张Order表
现在需要找出所有人的对应的订单号,那么这种情景可以使用左连接方式:
select p.Name, o.OrderNo from Person p LEFT JOIN Order o ON p.Id_P = o.Id_P
查出来的效果如下表:
公司最近在重构系统,作为刚进公司不久的代码小白来说是一次很重要经验积累的机会,为了能多了解一些以前不知道的知识点,厚颜无耻的缠着我的技术导师问了很多白痴的问题,现在回想起来都为自己的菜感到无比脸红,这里就写我了解的比较清楚的东西吧,不清不楚的写出来也对不起各位同学。下面是这一段时间在公司做项目的一些小总结,留作笔记,也同时心中有些小期待能帮各位同学解决一些小问题。
一.SpringMVC RESTful 常用注解
@RequestMapping
在springmvc RESTful 中, @RequestMapping是表示把Web请求映射到Controller的一种注解,请先看下面:Controller层代码:
[code] @RequestMapping(value = "/add", method = RequestMethod.GET) public String add() { return "acl/role/role_add"; }
前台代码:
[code]$('body').on("click",".add-role",function(){ // 这里的xxx.action是公司封的代码,现在就单纯理解为了获得完整的访问路径,如http://localhost:8080/项目映射路径/acl/role/add var url = xxx.action('/acl/role/add'); $.get(url,function(data){ layer.open({ title:"新增角色", content:data, type:1, area:['550px','380px'], btn:["保存","取消"], ...... }); });
看完上面这段代码,想必都应该清楚了,当前台使用GET方式访问路径/acl/role/add时,该请求会通过@RequestMapping映射到Controller层的add()方法。该注解有两个参数: value和method
value: 指定请求的地址。它的格式可以有下面三类:
1. 最普通的具体值,如上面的/acl/role/add
2. 带有变量的值,如/{roleId}/update
3. 带有正则表达式的值(这个没写过例子,网上找了个)如:{symbolicName:[a-z-]+}-{version:\d.\d.\d}.{extension:.[a-z]}/update
method: 请求的method,包括PUT, POST, GET, DELETE
@PathVariable
@PathVariable 用于标记方法上的参数,被标记的参数可以通过前台请求路径传到Controller层,即它能够为Rest风格的URL用占位符的方式传递一个参数。例如:controller层:
[code] @RequestMapping(value = "/{id}/edit", method = RequestMethod.GET) public ModelAndView edit(@PathVariable("id") String id) { Role role = roleService.getRoleById(id); Map<String, Role> param = new HashMap<String, Role>(); param.put("role", role); return new ModelAndView("acl/role/role_edit", param); }
前台请求:
[code]$('body').on("click", ".role_btn_edit", function() { var id = $(this).attr('id'); var url = xxx.action('/acl/role/' + id + '/edit'); $.get(url, function(data) { layer.open({ title : "修改角色", content : data, type : 1, area : ['680px','500px'], ...... }); });
像这样,当前台请求/acl/role/ + id + /edit时,id作为请求参数传到controller,如果要获取该参数,只需要在定义的参数面前加上@PathVariable(“id”)就行了.
@RequestParam
@RequestParam 是另外一种Controller层获取请求参数的一种方式,也可以把前台请求参数传至Controller(其实上面的@PathVariable并非真正意义上的传参,相当于一个占位符). 该注解有两个参数 value和requiredvalue : 顾名思义表示参数名
required: 该参数是否真的需要传递,true为需要传递,如果没有传递,将抛出错误(默认为true)
Controller层:
[code] @RequestMapping(value = "/{id}/{warehouseId}/resource_setting", method = RequestMethod.POST) public @ResponseBody DataMessage saveResourceSetting(@PathVariable("id") String id, @PathVariable("warehouseId") String warehouseId, @RequestParam(value = "selectedNode", required = false) String selectedNode) { roleService.updateRoleResource(id, warehouseId, selectedNode); }
前台请求:
[code]var selectedNode = $('#selectedNode').val(); $.post(url, {"selectedNode" : selectedNode}, function(data){ var o=$.parseJSON(data); if(o.success==true){ .... }
像这样,当我想传递selectedNode给Controller时,Controller可以像上面一样在具体某个方法的参数里定义@RequestParam,即可获得(这里required为false,意思是如果前台不传这个参数或者传过来值为空时,不会抛异常)
@RequestBody和@ResponseBody
@RequestBody注解用于读取Request请求的body数据部分,根据request请求header的content-type类型来选择相应的HttpMessageConverter解析数据,并把结果数据绑定到对象上返回。然后根据返回对象上的数据绑定到Controller层的参数上。这里涉及到两个比较陌生的概念: content-type和HttpMessageConverter。关于content-type,它表示具体请求中的媒体类型信息(更多content-type的介绍请参照这里)。如下图,某次请求的header信息:
这里的content-type为 application/json类型,所以会选择下图的Converter去解析数据:
把解析完的数据对象绑定到Controller的参数上面,达到传参的效果。关于HttpMessageConverter再多说一句:如果使用了< mvc: annotation-driven>配置时,会默认的配置RequestMappingHandlerAdapter,并为它默认配置一系列的HttpMessageConverter,如图:
@ResponseBody 将Controller处理后返回的对象,根据request请求header中的Accept属性的值,找到相应的HttpMessageConverter,把处理后的数据写入到response的body数据区中。如果你返回的不是一个ModelAndView,而是需要返回json或者其他格式的数据时,可以使用该注解。
二. SQL语句之LEFT JOIN的总结
LFEF JOIN 会从左表(table_left)中返回所有的记录,即使在右表(table_right)中没有匹配的记录。基本语法如下:select column_name from table_left left join table_right on table_left.column = table_right.column。
例如:
现在有一张Person表
Id_P | Name | Address | City |
---|---|---|---|
1 | xbc | 深圳南山 | 深圳 |
2 | xbcc | 上海浦东 | 上海 |
3 | xbccc | 北京三里屯 | 北京 |
Id_O | OrderNo | Id_P |
---|---|---|
1 | 1234 | 1 |
2 | 5678 | 1 |
3 | 9012 | 2 |
4 | 9981 | 2 |
5 | 4321 | 10 |
select p.Name, o.OrderNo from Person p LEFT JOIN Order o ON p.Id_P = o.Id_P
查出来的效果如下表:
Name | OrderNo |
---|---|
xbc | 1234 |
xbc | 5678 |
xbcc | 9012 |
xbcc | 9981 |
xbccc |
题外话
第一次写关于技术总结类的东西,在写的过程中自己还去查了各种资料,感觉确实比以前懂了些许。后面还会写出大概1个总结,希望对大家有点用处吧。相关文章推荐
- JAVASE之多线程
- JAVA源码学习-ArrayList
- Java集合---ArrayList的实现原理
- Java与C语法上的区别
- Java 时间服务器demo之NIO实现
- activiti集成spring异常(DbSqlSession)
- JAVASE之多态
- Spring中的设计模式
- 【完善】MyEclipse8.5+Axis2 1.6.2插件安装
- 【JAVA知识】==、hashcode 与 equals()区别?
- JAVASE之String类
- JavaSE之异常
- Java中hashCode的作用
- 【完善】Java操作MySql增删改查
- JDBC之控制层和视图层
- Java 时间服务器demo之线程池
- eclipse 配置JDK
- Java中getResourceAsStream的用法
- RxJava 嵌套回调
- java对象的拷贝