9 使用注解开发
对于一些简单的SQL语句,使用注解可以简化代码
比如现在dao只需要一个接口UserMapping,里面有一个方法getUserById(),通过添加注解就可以实现对数据库的操作
public interface UserMapping {
@Select("SELECT user_id user, user_name name,user_pwd pwd" +
" FROM user WHERE user_id = #{id}")
User getUserById(int id);
}
当然,现在不需要UserMapping.xml,我们需要在mybatis-config.xml中配置一下这个接口的映射器Mapper
<mappers>
<mapper class="com.cap.dao.UserMapping" />
</mappers>
这样的话,就可以实现对数据库的查询了,非常的简洁,不过,在官方文档也提到了:
The annotations are a lot cleaner for simple statements, however, Java Annotations are both limited and messier for more complicated statements. Therefore, if you have to do anything complicated, you’re better off with XML mapped statements.
对于简单的语句,使用注解会更加的简洁,但是,对于稍微复杂一点的语句,注解就显得力不从心,并且使你本就复杂的代码更加混乱。因此,如果你需要做一些复杂的操作,最好使用XML配置文件。
延伸一下:
@Param
使用注解开发时,利用该注解可以命名参数,比如
@Select("SELECT user_id user, user_name name,user_pwd pwd" +
" FROM user WHERE user_id = #{id} AND user_name = #{name}")
User getUserByIdAndName(@Param("id")int id,@Param("name") String name);
如果你不加该注解的话,比如
@Select("SELECT user_id user, user_name name,user_pwd pwd" +
" FROM user WHERE user_id = #{id} AND user_name = #{name}")
User getUserByIdAndName(int id,String name);
那么会报下面这个错误
org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: org.apache.ibatis.binding.BindingException: Parameter 'id' not found. Available parameters are [arg1, arg0, param1, param2]
### Cause: org.apache.ibatis.binding.BindingException: Parameter 'id' not found. Available parameters are [arg1, arg0, param1, param2]
使用该注解的其他注意事项
- 基本类型、
String
需要该注解 - 引用类型的话不需要
- 只有一个基本类型或者只有一个
String
类型的话可以省略该注解
#{}
和${}
的区别
#{}
是预编译处理,MyBatis处理#{}
时,将其当做?
,并调用PreparedStatement
的set()
方法来赋值,可以防止SQL注入${}
是字符串替换,MyBatis处理${}
,直接将其把${}
内的值替换成SQL语句的一部分,无法防止SQL注入