发表于: 2020-08-24 23:17:10

1 1438


今天完成的事情

1.mybatis 注解 script 标签

2.@RequestParam @PathParam @PathVariable等注解区别

3.@CookieValue @RequestHeader @RequestMapping 及其属性

4.SQL 过滤数据


收获

1. mybatis script 标签

要在带注解的映射器接口类中使用动态 SQL,可以使用 script 元素。比如:

@Insert(
       "<script>"
       + "insert into t_coffee"
       + "<trim prefix='(' suffixOverrides=',' suffix=', create_time, update_time)'>"
       + "     <if test='name != null'> name, </if>"
       + "     <if test='price != null'> price, </if>"
       + "</trim>"
       + "<trim prefix='values (' suffixOverrides=',' suffix=', now(), now() )'>"
       + "     <if test='name != null'> #{name, jdbcType=VARCHAR}, </if>"
       + "     <if test='price != null'> #{price, jdbcType=BIGINT}, </if>"
       + "</trim>"
       + "</script>"
)
@Options(useGeneratedKeys = true)
int saveSelective(Coffee coffee);

写好 script 标签之后内部的其他标签就和 xml 文件的一样了。

查看了一下 mybatis 的注解包,还有挺多其他的注解的,可以完成 resultSet resultMap 的功能,总之先知道有这个东西,之后慢慢了解。


2. Spring MVC 的部分注解

     

    @RequestParam 从请求内取值,@PathVariable 是从 URL 模板内取值。

    http://example.org/goods?name=apple

     goods 就属于 URL 模板取值(@PathVariable),问号后面的 name 属于请求内的值(@RequestParam

     

    @RequestParam 有如下四个参数:

    • defaultValue 取不到参数或者参数为空则启用默认值
    •  name 绑定本次参数的名称(不加这个属性则默认 URL 上的参数名称与注解的参数名称一致,否则可以使用 name 属性修改)
    •  value name 属性一样。是 name 的一个别名
    •  required 设置为 ture 的时候这个属性是必须有的

     

    @PathVariable 有如下属性

    • name 绑定本次参数的名称(不加这个属性则默认 URL 上的参数名称与注解的参数名称一致,否则可以使用 name 属性修改)
    •  value name 属性一致
    • Required 设置为 ture 的时候这个属性是必须的

     

    @CookieValue 这个注解用于取出对应 cookie 的值绑定到指定方法

    public void cookieValueTest(@CookieValue(value = "JSESSIONID", defaultValue = "") String sessionId)

    在上面这一段代码中,我们把名为 JSESSIONID cookie 取出来放到 sessionId 这个变量中,如果我们没有取到这个 cookie 的话就赋一个默认值  "" sessionId

     

    @RequestHeader 可以把Request请求header部分的值绑定到方法的参数上。

    @RequestMapping("/displayHeaderInfo.do")   
      public void
     displayHeaderInfo(@RequestHeader("Accept-Encoding") String encoding, 
                                     @RequestHeader(
    "Keep-Alive")  long keepAlive)  {   
      } 

    上面的代码,把request header部分的Accept-Encoding的值,绑定到参数encoding上了,  Keep-Alive header的值绑定到参数keepAlive上。

     

    @RequestParam 

    A)常用来处理简单类型的绑定,通过Request.getParameter()获取的String可直接转换为简单类型的情况(  String-->简单类型的转换操作由ConversionService配置的转换器来完成);因为使用request.getParameter()方式获取参数,所以可以处理get方式中queryString的值,也可以处理post方式中 body data的值

    B)用来处理Content-Type:  为application/x-www-form-urlencoded编码的内容,提交方式GET、POST;

    C)该注解有两个属性:value、required;value用来指定要传入值的id名称,required用来指示参数是否必须绑定;

     

    @SessionAttributes 这个注解可以很方便的往请求中添加我们需要的 session 数据

    SessionAttributes是只能注解于类或者接口,@SessionAttributesvalue代表我们需要把什么样的对象放入session,在我们的方法后当我们把对象放入ModelMap这个对象的时候,如果给出的key也会自动放入session

    1. @Controller
    2. @SessionAttributes(value="currentUser")
    1. public class SessionAttributesController {
    1.     @RequestMapping("/session/attributes/{id}/{name}")
    2.           public ModelAndView sessionAttributes(@PathVariable       Integer id,@PathVariable String name){
    3.               ModelAndView mav = new ModelAndView("session");
    4.               mav.addObject("currentUser", new       User(id,name));
    5.               return mav;
    6.           }
    1. }

     

    在这个例子中我们往 ModelAndView 插入的与 注解中同名的对象将会被插入到 session 中。之后再其他的地方我们就可以获取到 session 的内容进行处理。

     

    在下面这个例子中,使用 @SessionSttributes 注解配合 @ModelAttributes 注解写入与获取 session 数据。

    1. @Controller
    2. @SessionAttributes(value={"currentUser","saveTime"},types={User.class,Date.class})
    1. public class SessionAttributesController {
    1. @RequestMapping("/session/attributes/{id}/{name}")
    1. public       ModelAndView sessionAttributes(@PathVariable Integer id,@PathVariable String name){
    1. ModelAndView mav = new ModelAndView("session");
    2. mav.addObject("currentUser", new       User(id,name));
    3. mav.addObject("saveTime", new       Date());
    1. return mav;
    1. }
    1. @RequestMapping("/session/attributes/test")
    1. public       ModelAndView sessionAttributesage(@ModelAttribute("currentUser") User u,@ModelAttribute("saveTime") Date d){
    1. System.out.println(u.getUsername());
    2. System.out.println(d);
    3. ModelAndView       mav = new ModelAndView("session");
    1. return mav;
    1. }
    2. }


3. SQL 过滤数据

在 SELECT 使用 WHERE 子句指定搜索条件进行过滤。

SELECT name, price

FROM goods

WHERE price=3;

仅返回价格为 3 的商品信息。


WHERE 子句部分操作符:

<>                          不等于

!=                           不等于

!<                           不小于

!>                           不大于

BETWEEN AND       在指定的两个值之间

IS NULL                  null 值


检查单个值

SELECT name, price

FROM goods

WHERE price<3;


不匹配检查

SELECT name, price

FROM goods

WHERE price <> 3;


范围值检查

检查值的范围要使用 BETWEEN 操作符

SELECT name, price

FROM goods

WHERE price BETWEEN 3 AND 5;


空值检查

判空在 SQL 中有一个特定的判断符 IS NULL,而不是使用 != NULL

SELECT name, price

FROM goods

WHERE price IS NULL;


通过 WHERE 子句过滤不包含指定值的所有行的时候是没法返回 null 值的行的。

例如以下数据

INSERT INTO goods (name, price) VALUES("apple", null);

SELECT name, price

FROM goods

WHERE price != 3;

这个时候上面插入的这一条数据不会被返回。




返回列表 返回列表
评论

    分享到