Mybatis使用:Sql Annotation
上节我们学习了Mybatis的入门,能够实现简单的CRUD操作,这个算是基本技能了。另外Mybatis提供了Sql的Annotation形式来控制CRUD操作,我们对于数据库的操作也就不外乎这些操作。对于简单的Sql,或者功能简单的Sql来说,将方法和Sql对应起来最为直观,不用根据Id去Mapper.xml中查找,出问题后还得各种分析。而能够做到这点的就是Annotation操作。
下面我们来看下Sql的Annotation操作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),但是在某些情况下,我们插入一条记录后,还想得到这条记录的自增主键ID,useGeneratedKeys=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 "";
对于这些属性,还是比较好理解的,如useCache、flushCache、timeout等。其中跟主键返回功能相关的属性就是useGeneratedKeys、keyProperty、keyColumn这三个。这个功能在某种情况下还是比较有用的。
对于Options的使用,根据官方文档有个特别重要的注意点:
once you engage the Options annotation, your statement is subject to all of the default values.
如果你使用了这个属性,SQL的执行就会使用Options的默认值,如果你没有重新定义的话。仔细看下keyColumn的默认值是空,这个如果和你数据库设定不一致的话,就会出问题;所以一旦决定使用主键返回功能,推荐同时使用useGeneratedKeys、keyProperty、keyColumn这三个属性,即使是冗余也没有关系。
下面看下删除操作:
@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能够重新定义哪些字段呢?注意上文代码中注掉的代码仅供演示使用,并无真正实际映射的必要。如JDBC的Varchar本身就被映射为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;
其中比较好理解的是column、property、javaType、jdbcType这四个,typeHandler是重新定义JdbcType和javaType的映射处理handler。TypeHandler的应以和使用参考这里: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.
而One和Many属性就是定义字段的对应关系。
在注解中还有这四个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提供了类SQL和SQL之间的转换,并提供最终生成的执行SQL。
这些注解已经能够提供普通SQL语句的替换功能了,如果你的需求比这个还要复杂,那还是使用xml配置为最好。真正能控制SQL和功能之间的协调关系的还是直接写SQL为宜,将SQL统一管理放置也是通用的做法。
还有一点:Annotation和Xml配置可以同时存在,这个也是必须的。我们有些Sql特别长且功能比较复杂,写在代码里非常不容易管理,因此提供统一的xml管理还是很有必要的。
注意本文的注解是mybatis本身提供的,和Spring的AOP、IoC特性没有关系,我们现在做的就是单独使用mybatis来进行开发。至于mybatis和Spring的结合,其实就是将mybatis的SqlSessionFactory委托为Spring管理,再加上IoC特性,能在使用时节省不少的代码量。
本次的内容就到这里。
相关推荐
MyBatis SQL Mapper.Annotation 是 Java 注解的方式,用于替代 SQL Mapper XML 配置文件。 MyBatis 和 Spring Boot 整合 MyBatis 可以与 Spring Boot 整合,使用 Spring Boot 提供的自动配置功能来简化 MyBatis 的...
Springboot+Mybatis+pagehelper,无前端页面。包含数据库sql文件。
* 使用 Ehcache 的 annotation 来标注缓存对象。 * 使用 Ehcache 的 API 来编程式地管理缓存。 结论 Mybatis 框架的使用可以提高应用程序的性能和可维护性。Mybatis 提供了多种机制来提高应用程序的性能,包括延迟...
Mybatis-Mate为 MyBatis-Plus 企业级模块,支持分库分表、数据审计、字段加密、数据绑定、数据权限、表结构自动生成 SQL 维护等高级特性。 介绍: mybatis-plus 企业(数据优雅处理)模块 营造良好的软件生态,合规...
把IUserDao.xml移除,在dao接口的方法上使用@Select注解,并且指定SQL语句 同时需要在SqlMapConfig.xml中的mapper配置时,使用class属性指定dao接口的全限定类名。 明确: 我们在实际开发中,都是越简便越好,...
适用于无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
mybatis动态sql 1.什么是动态SQL? Mabits是一个Java持久化框架,它提供了动态SQL的功能。动态SQL是一种根据不同条件动态生成SQL语句的技术。在Mabits中,动态SQL通常是通过使用一组特殊的标签和代码块来实现的,...
方法三:使用Annotation 使用Annotation可以将Mapper接口自动注册到Spring容器中。例如: ```java @Mapper public interface EmployeeMapper { @Insert("INSERT INTO employee (id, name, email) VALUES (#{id}, #...
mybatis实战教程mybatis in action之九mybatis 代码生成工具的使用 mybatis SqlSessionDaoSupport的使用附代码下载 转自:http://www.yihaomen.com/article/java/302.htm (读者注:其实这个应该叫做很基础的入门...
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语法增强框架, 综合了mybatis plus, danymic sql, jpa等框架特性和优点, 利用annotation processor生成代码
MyBatis 提供了多种配置方式,例如 XML 配置文件、Annotation 配置等。MyBatis 还提供了多种插件,例如 PageHelper、MyBatis-Plus 等。 配置 Log4j 要在 IDEA 中配置 MyBatis 打印 SQL 语句,首先需要在 Maven ...
MyBatis是一个支持普通SQL查询、存储过程和高级映射的优秀的持久层框架,它消除了几乎所有的JDBC代码、对参数的手工设置以及对结果集繁琐的处理,使用简单的XML或注解(annotation)用于配置和映射,将接口和POJO...
使用AbstractRoutingDataSource+aop+annotation在dao层决定数据源。 如果采用了mybatis, 可以将读写分离放在ORM层,比如mybatis可以通过mybatis plugin拦截sql语句,所有的insert/update/delete都访问master库,...
├─annotation 注解模拟SQL操作 │ │ └─demo_sql │ └─mybatis │ ├─entity │ ├─foundationsupportlayer │ │ ├─jdbc JDBC操作 │ │ │ └─cases │ │ │ └─prepare │ │ ├─parser XPath-DTD-...
该项目旨在为开发者提供一个高效、便捷的Mybatis扩展解决方案,综合了Mybatis Plus、Dynamic SQL、JPA等框架特性和优点,利用Annotation Processor生成代码,支持代码自动生成、数据映射、动态SQL等功能,帮助开发者...
SpringBoot MyBatis入门参考: 请在/ resources文件夹中分配一个sql以自动运行,Mapper将在此处,而无需@Autowire 我们可以使用xml / annotation进行配置,这是使用注释/ domain,模型/映射器/ init,自动连线/注入...
在本文中,我们将学习如何使用MyBatis来查询数据库中的数据。 创建数据库和数据表 首先,我们需要创建一个名为`springboot`的数据库,并创建一个名为`t_user`的数据表。使用以下SQL语句可以创建数据库和数据表: `...
Mybatis-Spring模块提供了一个桥接,使得Spring能够管理和初始化Mybatis的SqlSessionFactory和SqlSessionTemplate,这样就可以在Spring的环境下无缝地使用Mybatis。C3P0连接池则用于管理数据库连接,提高资源利用率...
- **扫描Service层和Controller层的包**:使用`<context:component-scan>`标签指定需要扫描的包路径。 - **开启SpringMVC注解驱动**:通过`<mvc:annotation-driven>`启用注解驱动,支持@Controller、@...