Mybatis学习总结
注解提示:
@RestController,@Controller
@RequestParam, @RequestBody, @PathVariable
最近需要使用Mybatis提供Restful形式的接口,这里做一点自己的总结,随时修改。
1. URL参数注解
@RequestParam, @RequestBody, @PathVariable
三种注解可以提供url参数
@RequestParam, @RequestBody 都POST请求时用的参数,
@PathVariable是从URL中获取参数
代码:
- 这是@PathVariable作为参数的例子
//访问url为:http://xxx/task/preview/USER_TABLE --这里USER_TABLE为传入的参数,
//{tableName:.+} 目的是为了满足传入参数可能带有点(.),保证可以正确解析
@RequestMapping(value="/task/preview/{tableName:.+}",method=RequestMethod.GET)
public JsonResponse<Map<String, Object>>previewTaskResult(@PathVariable String tableName){
if(Strings.isNullOrEmpty(tableName)){
return new JsonResponse<Map<String, Object>>(false, "wrong");
}
...
}
- 这是@RequestBody作为参数的例子
//我理解的当传入参数为Map或非基本类型时,使用@RequestBody参数
@RequestMapping(value="/form/index",method=RequestMethod.POST)
public JsonResponse<String> index(@RequestBody Map<String, Object> paramMap){
if(!paramMap.containsKey("key")){
return new JsonResponse<String>(false,null,"empty");
}
...
}
- //这里在添加一个@RequestParam的例子
//我理解,当传入参数为基本数据类型的时候,使用@RequestParam
2. Controller注解
@RestController 与 @Controller的区别
我理解的是:
@RestController 相当于 @Controller + @ResponseBody 结合在一起
//这里为code
注意:
- @Controller
- 如果controller的@RequestMapping方法中有需要范围jsp或html页面,需要使用
@Controller
来注解Controller,这样可以配合视图解析器InternalResourceViewResolve解析页面; - 如果方法中还有需要返回Json、Xml或自定义type内容,需要在对应的方法上添加
@ResponseBody
注解即可;
- 如果controller的@RequestMapping方法中有需要范围jsp或html页面,需要使用
- @RestController
- 返回的就是return的内容,不能返回映射的html内容;
3. Mapper文件
在编写Mapping文件
时,需要注意
默认情况下,Mapper文件名于Map接口名一样,一般以
*Mapper.xml
结尾Mapper文件中,
<mapper namespace="xxx"> //要检查xxx是否与xml文件坐在package包名一样
Mapper文件中的SQL语句中,
id
要与Mapper接口文件中的方法名一样parameterType
是参数的类型,一个参数时可以如果要指定,需要与方法中参数的数据类型一直,可以省略不写SQL语法中传入的参数要与方法中参数名一样,如:
// applyId是方法参数中的参数名称,这里要一致 <select id="getTaskID" parameterType="String"> select business_id from apply where id=#{applyId} </select>
一般如果需要对传入的参数做判断,String !=null and String !=”, Number !=null 即可
//这是一个update操作 <!--update apply set apply_status=? where id=?--> <update id="updateApplyStatus"> update apply <set> <if test="applyStatus!=null"> //判断传入的数字参数applyStatus是否为null apply_status=#{applyStatus,jdbcType=DECIMAL} </if> </set> <where> <if test="applyId !=null and applyId!=''"> //String类型的,判断!=null,!="" id=#{applyId,jdbcType=VARCHAR} </if> </where> </update>
4. Mybatis运行报错
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.yo....
运行时遇到上面的错误,找到了下面的内容,一般也就按照下面的提示内容检查
首先,给定的异常提示信息并不精准,有多个错误原因都会抛出该异常。mybatis出现这个问题,通常是由Mapper interface和对应的xml文件的定义对应不上引起的,这时就需要仔细检查对比包名、xml中的namespace、接口中的方法名称等是否对应。我之前就因为称忘记在xml标签的id属性中添加方法名或写错方法名而出现这个错误。
出现这个错误时,按以下步骤检查一般就会解决问题:
1:检查xml文件所在package名称是否和Mapper interface所在的包名一一对应;
2:检查xml的namespace是否和xml文件的package名称一一对应;
3:检查方法名称是否对应;
4:去除xml文件中的中文注释;
5:随意在xml文件中加一个空格或者空行然后保存。
参考内容
学习的过程中参考了下面的博客内容,
附上地址链接:
http://blog.csdn.net/yzllz001/article/details/54312929
http://www.cnblogs.com/softidea/p/5884772.html
http://www.jianshu.com/p/800fe918cc7a