`

Mybatis使用:Sql Annotation

 
阅读更多

Mybatis使用:Sql Annotation

 

上节我们学习了Mybatis的入门,能够实现简单的CRUD操作,这个算是基本技能了。另外Mybatis提供了SqlAnnotation形式来控制CRUD操作,我们对于数据库的操作也就不外乎这些操作。对于简单的Sql,或者功能简单的Sql来说,将方法和Sql对应起来最为直观,不用根据IdMapper.xml中查找,出问题后还得各种分析。而能够做到这点的就是Annotation操作。

 

下面我们来看下SqlAnnotation操作CRUD

方法还使用上节Mybatis入门时的UserDao操作,将UserDaoMapper.xml中的Sql语句全部删除,只保留基本格式就行。

我们先看下Insert的操作:

@Insert("insert into user(userId,userName,password,comment) values(#{userId},#{userName},#{password},#{comment})")
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
public int insert ( User user );

这个操作有没有和Mapper.xml中的Sql很相似,没错注解@Insert就是干这样的事。

注意@Insert注解中Value的值是个数组,那么下面这个Insert注解也是合法的:

@Insert(value={"insert into user(userId,userName,password,comment) "," values(#{userId},#{userName},#{password},#{comment})"})
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
public int insert ( User user );

mybatis生成Sql语句时,会将数组拼接,生成最终的Sql,不过貌似这个功能不应该这么鸡肋,大家可以仔细思考下这个功能点究竟在什么地方。

@Options注解中的工作就比较有意思,我们在插入记录时,一般是定义主键自增(auto_increment),但是在某些情况下,我们插入一条记录后,还想得到这条记录的自增主键IDuseGeneratedKeys=true就是定义数据库返回主键ID的。

Options中,定义了不少的属性:

  boolean useCache() default true;
  boolean flushCache() default false;
  ResultSetType resultSetType() default ResultSetType.FORWARD_ONLY;
  StatementType statementType() default StatementType.PREPARED;
  int fetchSize() default -1;
  int timeout() default -1;
  boolean useGeneratedKeys() default false;
  String keyProperty() default "id";
  String keyColumn() default "";

对于这些属性,还是比较好理解的,如useCacheflushCachetimeout等。其中跟主键返回功能相关的属性就是useGeneratedKeyskeyPropertykeyColumn这三个。这个功能在某种情况下还是比较有用的。

对于Options的使用,根据官方文档有个特别重要的注意点:

once you engage the Options annotation, your statement is subject to all of the default values.

如果你使用了这个属性,SQL的执行就会使用Options的默认值,如果你没有重新定义的话。仔细看下keyColumn的默认值是空,这个如果和你数据库设定不一致的话,就会出问题;所以一旦决定使用主键返回功能,推荐同时使用useGeneratedKeyskeyPropertykeyColumn这三个属性,即使是冗余也没有关系。

 

下面看下删除操作:

@Delete("delete from user where userName = #{userName}")
public int delete ( String userName );

这个没有什么特殊的操作,理解了Insert操作之后这个delete操作就比较简单了。

 

更新操作也没有什么问题:

@Update("update user set userId=#{userId},password=#{password},comment=#{comment} where userName=#{userName}")
public int update ( User user );

 

我们现在操作的是对象User,如果User属性比较多,我们只是更新User的单个属性,难道我们再重新生成一个User传进去?

No,我们可以使用下面这种形式的update

@Update("update user set  userName=#{userName} where userId=#{userId}")
public int updateUser(@Param("userName")String userName,@Param("userId")String userId);

我们使用@Param参数,只是传递我们感兴趣的参数即可。

有人可能会有疑问,@Param参数貌似没有什么用,这个参数本身就可以获取的。没错,看下面这种格式的update

@Update("update user set  userName=#{name} where userId=#{Id}")
public int updateUser ( @Param("name") String userName, @Param("Id") String userId );

传入的参数是userName,而在@Param中被重新定义成name,那么在Sql中就可以通过${name}直接使用了,这个实际上是解决函数参数和Sql参数的阻抗不匹配情况。

 

最后我们再看下数据库和POJO阻抗不匹配时的解决方法:

@Select("select * from user order by id asc")
// @Results(value = {
  // @Result(property="userId",column="userId",javaType=Integer.class,jdbcType=JdbcType.VARCHAR,typeHandler=UnknownTypeHandler.class),
  // @Result(property="name", column="userName"),
  // @Result(property="psword", column="password"),
  // @Result(property="comment", column="comment")
// })
public List<User> selectAll ();

@Results能够重新定义数据库和POJO之间字段的对应关系,其中每一个属性对应都由Result重新定义,和上面代码中注掉的地方一样。

那么Result能够重新定义哪些字段呢?注意上文代码中注掉的代码仅供演示使用,并无真正实际映射的必要。如JDBCVarchar本身就被映射为String类型。

  boolean id() default false;
  String column() default "";
  String property() default "";
  Class<?> javaType() default void.class;
  JdbcType jdbcType() default JdbcType.UNDEFINED;
  Class<? extends TypeHandler<?>> typeHandler() default UnknownTypeHandler.class;
  One one() default @One;
  Many many() default @Many;

其中比较好理解的是columnpropertyjavaTypejdbcType这四个,typeHandler是重新定义JdbcTypejavaType的映射处理handlerTypeHandler的应以和使用参考这里:http://www.mybatis.org/core/zh/configuration.html

The one attribute is for single associations, similar to <association>, and the many attribute is for collections, similar to <collection>. They are named as they are to avoid class naming conflicts.

OneMany属性就是定义字段的对应关系。

 

在注解中还有这四个Provider,他们有什么用呢?

@InsertProvider 
@UpdateProvider 
@DeleteProvider 
@SelectProvider 

Mybatis本身提供了SQL Builder功能,SQL Builder功能的介绍参考这里:http://www.mybatis.org/core/statement-builders.html

这四个Provider是用来提供SQL Builder的配置的,会将Sql按照类功能描述的形式表示出来,Provider将这些SQL提供给CRUD执行。

再简单的说,Provider提供了类SQLSQL之间的转换,并提供最终生成的执行SQL

 

这些注解已经能够提供普通SQL语句的替换功能了,如果你的需求比这个还要复杂,那还是使用xml配置为最好。真正能控制SQL和功能之间的协调关系的还是直接写SQL为宜,将SQL统一管理放置也是通用的做法。

 

还有一点:AnnotationXml配置可以同时存在,这个也是必须的。我们有些Sql特别长且功能比较复杂,写在代码里非常不容易管理,因此提供统一的xml管理还是很有必要的。

 

注意本文的注解是mybatis本身提供的,和SpringAOPIoC特性没有关系,我们现在做的就是单独使用mybatis来进行开发。至于mybatisSpring的结合,其实就是将mybatisSqlSessionFactory委托为Spring管理,再加上IoC特性,能在使用时节省不少的代码量。

 

本次的内容就到这里。

 

分享到:
评论

相关推荐

    springboot-mybatis-annotation-master.rar

    Springboot+Mybatis+pagehelper,无前端页面。包含数据库sql文件。

    mybatis-mate-examples-master.zip

    Mybatis-Mate为 MyBatis-Plus 企业级模块,支持分库分表、数据审计、字段加密、数据绑定、数据权限、表结构自动生成 SQL 维护等高级特性。 介绍: mybatis-plus 企业(数据优雅处理)模块 营造良好的软件生态,合规...

    mybatis-plus所有依赖包

    适用于无maven的spring项目使用。包含以下依赖包: jsqlparser-4.3.jar ...mybatis-plus-annotation-3.5.1.jar mybatis-plus-core-3.5.1.jar mybatis-plus-extension-3.5.1.jar mybatis-spring-2.0.6.jar

    day01_eesy_02mybatis_annotation.zip

    把IUserDao.xml移除,在dao接口的方法上使用@Select注解,并且指定SQL语句 同时需要在SqlMapConfig.xml中的mapper配置时,使用class属性指定dao接口的全限定类名。 明确: 我们在实际开发中,都是越简便越好,...

    mybatis 样例,包含xml和annotation方式、关联映射、动态SQL等内容.zip

    mybatis动态sql 1.什么是动态SQL? Mabits是一个Java持久化框架,它提供了动态SQL的功能。动态SQL是一种根据不同条件动态生成SQL语句的技术。在Mabits中,动态SQL通常是通过使用一组特殊的标签和代码块来实现的,...

    springmybatis

    mybatis实战教程mybatis in action之九mybatis 代码生成工具的使用 mybatis SqlSessionDaoSupport的使用附代码下载 转自:http://www.yihaomen.com/article/java/302.htm (读者注:其实这个应该叫做很基础的入门...

    MyBatis-3.61.zip

    Plugin for Mybatis. Plugin was rewritten from scratch with new architecture to make it more stable and bringing many ...Annotation support. Spring support. Spring Boot support. Mybatis generator support.

    fluent-mybatis, mybatis语法增强框架

    fluent-mybatis, mybatis语法增强框架, 综合了mybatis plus, danymic sql, jpa等框架特性和优点, 利用annotation processor生成代码

    MyBatis 3 开发指南(中文版)

    MyBatis是一个支持普通SQL查询、存储过程和高级映射的优秀的持久层框架,它消除了几乎所有的JDBC代码、对参数的手工设置以及对结果集繁琐的处理,使用简单的XML或注解(annotation)用于配置和映射,将接口和POJO...

    数据库面试题触发器SQL优化

    使用AbstractRoutingDataSource+aop+annotation在dao层决定数据源。 如果采用了mybatis, 可以将读写分离放在ORM层,比如mybatis可以通过mybatis plugin拦截sql语句,所有的insert/update/delete都访问master库,...

    java8集合源码分析-mybatis-test:教你一周精通mybatis(调试版本:3.5.3)从整体到局部,最后再回到整体,从全局把控m

    ├─annotation 注解模拟SQL操作 │ │ └─demo_sql │ └─mybatis │ ├─entity │ ├─foundationsupportlayer │ │ ├─jdbc JDBC操作 │ │ │ └─cases │ │ │ └─prepare │ │ ├─parser XPath-DTD-...

    SpringBootMybatisGetStart:Mybatis + H2

    SpringBoot MyBatis入门参考: 请在/ resources文件夹中分配一个sql以自动运行,Mapper将在此处,而无需@Autowire 我们可以使用xml / annotation进行配置,这是使用注释/ domain,模型/映射器/ init,自动连线/注入...

    kellerMapper.jar

    annotation:注解相关 FieldAttribute.java:字段注解,标示成员变量为数据库字段,并设置相应的约束信息,如:长度、非空、查询字段、索引字段等 KeyAttribute.java:主键注解,标示成员变量为主键,支持标注为...

    java8源码-simple-ibatis:手写mybatis框架---思路变成实践

    耗时3周左右,基本满足了一些常用的Sql操作本项目所涉及的代码都是个人所写,没有一句copy,肯定不是很完善,大家理解下,后续有时间会一直更新。如果你对源码感兴趣,也可以加入一起,将自己的理解转为代码真的会...

    simple demo web project, it covers below techical topics:

    2. mybatis annotation 3. spring security 4. bootstrap 5. jquery 6. html5, css 7. mysql 8. gradle 9. rest api (to be involved) 10. junit (to be involved) Reference: 1. ...

    jar 包(1)

    各类Java 所需jar 包 。 包含dbcp dom4j hibernate hibernate-annotation jspsmartupload jstl log4j mybatis mysql oracle poi spring sqlserver struts2

    各类Java 所需jar 包 (3)

    各类Java 所需jar 包 。 包含dbcp dom4j hibernate hibernate-annotation jspsmartupload jstl log4j mybatis mysql oracle poi spring sqlserver struts2

    jar包 (2)

    各类Java 所需jar 包 。 包含dbcp dom4j hibernate hibernate-annotation jspsmartupload jstl log4j mybatis mysql oracle poi spring sqlserver struts2

    Java版水果管理系统源码-java:Java

    一套使用Annotation+ASM实现hibernate + mybatis优势功能的ORM框架. 自动封装, 一条SQL多种用途: 单值查询, 区间查询, 分页查询(支持字段排序), 其实ORM也可以很轻量. obase-jedis: 谈不上框架, 就是对JedisPool资源...

    各类Java 所需jar 包(4)

    各类Java 所需jar 包 。 包含dbcp dom4j hibernate hibernate-annotation jspsmartupload jstl log4j mybatis mysql oracle poi spring sqlserver struts2

Global site tag (gtag.js) - Google Analytics