您的位置:首页 > 编程语言 > Java开发

Springmvc RESTful和SQL LEFT JOIN知识盲点总结

2016-01-07 22:57 495 查看
写在这篇小结前的题外话:特别感谢 沉默王二 那特别能让人产生亲切感的博客,让我明白一个最普通不过的程序员都能活出不一样的自己,改变自己。同时也建议大家能抽空去看看他的博客,真的特别真实,不为别的,只让自己有迈出第一步的勇气,再次感谢!

公司最近在重构系统,作为刚进公司不久的代码小白来说是一次很重要经验积累的机会,为了能多了解一些以前不知道的知识点,厚颜无耻的缠着我的技术导师问了很多白痴的问题,现在回想起来都为自己的菜感到无比脸红,这里就写我了解的比较清楚的东西吧,不清不楚的写出来也对不起各位同学。下面是这一段时间在公司做项目的一些小总结,留作笔记,也同时心中有些小期待能帮各位同学解决一些小问题。



一.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和required

value : 顾名思义表示参数名

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_PNameAddressCity
1xbc深圳南山深圳
2xbcc上海浦东上海
3xbccc北京三里屯北京
另外有一张Order表

Id_OOrderNoId_P
112341
256781
390122
499812
5432110
现在需要找出所有人的对应的订单号,那么这种情景可以使用左连接方式:

select p.Name, o.OrderNo from Person p LEFT JOIN Order o ON p.Id_P = o.Id_P

查出来的效果如下表:

NameOrderNo
xbc1234
xbc5678
xbcc9012
xbcc9981
xbccc

题外话

第一次写关于技术总结类的东西,在写的过程中自己还去查了各种资料,感觉确实比以前懂了些许。后面还会写出大概1个总结,希望对大家有点用处吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: