MyBatis提供了多个注解如:@InsertProvider,@UpdateProvider,@DeleteProvider和@SelectProvider,这些都是创建动态语言和让MyBatis执行这些语言。html
如今让咱们来看一下如何使用@ SelectProvider来建立简单的SELECT映射的例子。建立一个TutorDynaSqlProvider.java类,带有findTutorByIdSql()的方法。java
PS: mysql数据进行batch处理的时候,数据库连接必定要修改增长rewriteBatchedStatements=truemysql
package com.owen.mybatis.sqlproviders; import org.apache.ibatis.jdbc.SQL; public class TutorDynaSqlProvider { public String findTutorByIdSql(int tutorId) { return "SELECT TUTOR_ID AS tutorId, NAME, EMAIL FROM TUTORS WHERE TUTOR_ID="+tutorId; } }
建立接口类TutorMapper.java.sql
@SelectProvider(type=TutorDynaSqlProvider.class, method="findTutorByIdSql") Tutor findTutorById(int tutorId);
这里咱们声明了@ SelectProvider去声明类和方法名,这个将会在SQL声明中执行。可是会用String来构造查询语句时,是困难的,也是容易出错了。因此MyBatis提供了SQL公用方法构造方法,不须要写出完整的String语句。让咱们来看一下如何使用org.apache.ibatis.jdbc.SQL的公用方法。数据库
package com.owen.mybatis.sqlproviders; import org.apache.ibatis.jdbc.SQL; public class TutorDynaSqlProvider { public String findTutorByIdSql(final int tutorId) { return new SQL() {{ SELECT("tutor_id as tutorId, name, email"); FROM("tutors"); WHERE("tutor_id="+tutorId); }}.toString(); } }
在SQL公用的函数中,咱们须要构造适当的前缀和须要 的后缀。动态语句的SQL方法能够包含下面的任一参数:apache
1) 没有参数mybatis
2) 与同类型的接口方法的参数同样app
3) java.util.Mapide
若是SQL的查询不可以提供所依赖的参数,你可使用无参的SQL方法。函数
public String findTutorByIdSql() { return new SQL() {{ SELECT("tutor_id as tutorId, name, email"); FROM("tutors"); WHERE("tutor_id = #{tutorId}"); }}.toString(); }
这里咱们并无在咱们的方法中定义参数,因此是一个无参的方法。
若是一个映射的接口方法只有一个参数,咱们能够以下定义SQL的方法:
这里的findTutorById(int)的方法拥有一个输入的参数是int的类型。咱们能够把findTutorBySql(int)方法做为SQL提供的方法。
public String findTutorByIdSql(final int tutorId) { return new SQL() {{ SELECT("tutor_id as tutorId, name, email"); FROM("tutors"); WHERE("tutor_id="+tutorId); }}.toString(); }
若是Mapper的接口拥有多个参数,咱们能够运用java.util.Map的参数类型做为SQL方法提供。因此全部输入的参数都必须是map的类型,而且带有param一、param2等做为key的值,而输入的参数是value的值。你也能够输入的参数为0,1,2,3等做为key值。
@SelectProvider(type=TutorDynaSqlProvider.class, method="findTutorByNameAndEmailSql") Tutor findTutorByNameAndEmail(String name, String email); public String findTutorByNameAndEmailSql(Map<String, Object> map) { String name = (String) map.get("param1"); String email = (String) map.get("param2"); //you can also get those values using 0,1 keys //String name = (String) map.get("0"); //String email = (String) map.get("1"); return new SQL() {{ SELECT("tutor_id as tutorId, name, email"); FROM("tutors"); WHERE("name=#{name} AND email=#{email}"); }}.toString(); }
SQL公用的方法也提供了多样的方法,如JOINS,ORDER_BY,GROUP_BY等。让咱们来看一下使用LEFT_OUTER_JOIN的例子:
public class TutorDynaSqlProvider { public String selectTutorById(){ return new SQL() {{ SELECT("t.tutor_id, t.name as tutor_name, email"); SELECT("a.addr_id, street, city, state, zip, country"); SELECT("course_id, c.name as course_name, description,start_date, end_date"); FROM("TUTORS t"); LEFT_OUTER_JOIN("addresses a on t.addr_id=a.addr_id"); LEFT_OUTER_JOIN("courses c on t.tutor_id=c.tutor_id"); WHERE("t.TUTOR_ID = #{id}"); }}.toString(); } } public interface TutorMapper { @SelectProvider(type=TutorDynaSqlProvider.class, method="selectTutorById") @ResultMap("com.owen.mybatis.mappers.TutorMapper.TutorResult") Tutor selectTutorById(int tutorId); }
这里并无使用一对多的注解,咱们能够基于XML来配置<resultMap>和映射@ResultMap.
<mapper namespace="com.owen.mybatis.mappers.TutorMapper"> <resultMap type="Address" id="AddressResult"> <id property="id" column="addr_id"/> <result property="street" column="street"/> <result property="city" column="city"/> <result property="state" column="state"/> <result property="zip" column="zip"/> <result property="country" column="country"/> </resultMap> <resultMap type="Course" id="CourseResult"> <id column="course_id" property="id"/> <result column="course_name" property="name"/> <result column="description" property="description"/> <result column="start_date" property="startDate"/> <result column="end_date" property="endDate"/> </resultMap> <resultMap type="Tutor" id="TutorResult"> <id column="tutor_id" property="id"/> <result column="tutor_name" property="name"/> <result column="email" property="email"/> <association property="address" resultMap="AddressResult"/> <collection property="courses" resultMap="CourseResult"></collection> </resultMap> </mapper>
使用这个动态的SQL语句,将会查找到教师的信息连带着教师的地址和教授的课程信息。
咱们能够建立动态的INSERT查询,使用@Insertprovider.
public class TutorDynaSqlProvider { public String insertTutor(final Tutor tutor) { return new SQL() {{ INSERT_INTO("TUTORS"); if (tutor.getName() != null) { VALUES("NAME", "#{name}"); } if (tutor.getEmail() != null) { VALUES("EMAIL", "#{email}"); } }}.toString(); } } public interface TutorMapper { @InsertProvider(type=TutorDynaSqlProvider.class, method="insertTutor") @Options(useGeneratedKeys=true, keyProperty="tutorId") int insertTutor(Tutor tutor); }
咱们能够建立动态的UPDATE语句使用@UpdateProvider。
public class TutorDynaSqlProvider { public String updateTutor(final Tutor tutor) { return new SQL() {{ UPDATE("TUTORS"); if (tutor.getName() != null) { SET("NAME = #{name}"); } if (tutor.getEmail() != null) { SET("EMAIL = #{email}"); } WHERE("TUTOR_ID = #{tutorId}"); }}.toString(); } } public interface TutorMapper { @UpdateProvider(type=TutorDynaSqlProvider.class, method="updateTutor") int updateTutor(Tutor tutor); }
咱们能够建立DELETEf动态语句,使用@DeleProvider
public class TutorDynaSqlProvider { public String deleteTutor(int tutorId) { return new SQL() {{ DELETE_FROM("TUTORS"); WHERE("TUTOR_ID = #{tutorId}"); }}.toString(); } } public interface TutorMapper { @DeleteProvider(type=TutorDynaSqlProvider.class, method="deleteTutor") int deleteTutor(int tutorId); }
mybatis中enum类型数据注解的处理方式
1、使用参数构造器的方式来解决
@ConstructorArgs({ @Arg(column="id",javaType=Integer.class), @Arg(column="name",javaType=String.class), @Arg(column="enum1",javaType= enum1.class,typeHandler=EnumOrdinalTypeHandler.class) }) @Select(value="select id,name,enum1 from test1 where id=#{id}") Zhyonk queryTest(int id);
2、使用结果集映射注解来解决
@Results({ @Result(property = "enum1", column = "enum1", typeHandler = EnumOrdinalTypeHandler.class) }) @Select(value = "select id,name,enum1 from test1 where id=#{id}") Zhyonk queryTest2(int id);
3、采用@TypeDiscriminator类型鉴别器
@TypeDiscriminator( column = "enum1",javaType = enum1.class,typeHandler=EnumOrdinalTypeHandler.class, cases={ @Case(value="zhyonk",type=Zhyonk.class,results={@Result(property="enum1",column="enum1",typeHandler=EnumOrdinalTypeHandler.class)}) ,@Case(value="success",type=Success.class,results={@Result(property="enum1",column="enum1",typeHandler=EnumOrdinalTypeHandler.class)}) }) @Select(value="select id,name,enum1 from test1 where id=#{id}") Zhyonk queryTest3(int id);