文档章节

MyBatis 相关总结

k
 kunping
发布于 2017/04/14 10:37
字数 1553
阅读 39
收藏 1

1、优先选择#{},而${}无法避免SQL注入,#可以用$替代(注意:字符串需手动添加'')

2、SQL片段中的参数变量只能用#

<select id="selectBlog" parameterType="map" resultType="com.model.Blog">
		select id, title from ${table_name} where id = #{id} 
		${condSQL}
</select>
        Map<String, Object> params = new HashMap<String, Object>();
		params.put("id", 1);
		params.put("table_name", "t_blog");
		params.put("condSQL", " union all select id, title from t_blog where title = #{title} ");//只能用#
		params.put("title", "002");
		List<Blog> blogs = sqlSession.selectList("com.cmb.mapper.IBlogMapper.selectBlog", params);

 

3、statementType:STATEMENT,PREPARED 或 CALLABLE 的一个。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED。

<select id="selectPerson" parameterType="int" resultType="hashmap" statementType="PREPARED">
  SELECT * FROM PERSON WHERE ID = #{id}
</select>

4、statementType为STATEMENT时,不能使用#{},而${}可以在任何statementType中使用

5、传入动态表名、字段名、子查询语句等使用STATEMENT,使用${}

6、parameterType:将要传入语句的参数的完全限定类名或别名。这个属性是可选的,因为 MyBatis 可以通过 TypeHandler 推断出具体传入语句的参数,默认值为 unset。

7、resultType与resultMap不能同时使用

8、MyBatis会对插入的列为null的时,可能会报“无效的列类型”,可使用以下方式:

    a. 增加配置,如指定为varchar,这是全局指定

<!-- mybatis-config.xml -->
<settings>
  <setting name="jdbcTypeForNull" value="VARCHAR" />
</settings>

    b. 可能为空的列名指定 jdbcType,如

#{mayBeNullColumn,jdbcType=VARCHAR}

    c. 指定一个特殊的类型处理器类(或别名)

#{age,javaType=int,jdbcType=NUMERIC,typeHandler=MyTypeHandler}

9、返回的类型为Map时,若是列的为null值的字段则不会返回,正常返回则需增加如下配置

<settings>
		<setting name="callSettersOnNulls" value="true" />
</settings>	

10、自定义类型处理器

  a. typeHandler编写

     实现 org.apache.ibatis.type.TypeHandler 接口,或继承类 org.apache.ibatis.type.BaseTypeHandler

     然后可以选择性地将它映射到一个 JDBC 类型。比如:

// ExampleTypeHandler.java
@MappedJdbcTypes(JdbcType.VARCHAR)
public class ExampleTypeHandler extends BaseTypeHandler<String> {

  @Override
  public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
    ps.setString(i, parameter);
  }

  @Override
  public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
    return rs.getString(columnName);
  }

  @Override
  public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
    return rs.getString(columnIndex);
  }

  @Override
  public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
    return cs.getString(columnIndex);
  }
}

  b. 注册类型处理器

<!-- mybatis-config.xml -->
<typeHandlers>
  <typeHandler handler="org.mybatis.example.ExampleTypeHandler"/>
</typeHandlers>

   c. 使用说明

1) 使用这个的类型处理器将会覆盖已经存在的处理 Java 的 String 类型属性和 VARCHAR 参数及结果的类型处理器。 
    要注意 MyBatis 不会窥探数据库元信息来决定使用哪种类型,所以你必须在参数和结果映射中指明那是 VARCHAR 
    类型的字段, 以使其能够绑定到正确的类型处理器上。 这是因为:MyBatis 直到语句被执行才清楚数据类型。

2) 通过类型处理器的泛型,MyBatis 可以得知该类型处理器处理的 Java 类型,不过这种行为可以通过两种方法改变:
    在类型处理器的配置元素(typeHandler element)上增加一个 javaType 属性(比如:javaType="String");
    在类型处理器的类上(TypeHandler class)增加一个 @MappedTypes 注解来指定与其关联的 Java 类型列表。 
	如果在 javaType 属性中也同时指定,则注解方式将被忽略。

   可以通过两种方式来指定被关联的 JDBC 类型:
    在类型处理器的配置元素上增加一个 jdbcType 属性(比如:jdbcType="VARCHAR");
    在类型处理器的类上(TypeHandler class)增加一个 @MappedJdbcTypes 注解来指定与其关联的 JDBC 类型列表。 
      如果在 jdbcType 属性中也同时指定,则注解方式将被忽略。

3) 当决定在ResultMap中使用某一TypeHandler时,此时java类型是已知的(从结果类型中获得),但是JDBC类型是未知的。 
    因此Mybatis使用javaType=[TheJavaType], jdbcType=null的组合来选择一个TypeHandler。 这意味着使用@MappedJdbcTypes
    注解可以限制TypeHandler的范围,同时除非显示的设置,否则TypeHandler在ResultMap中将是无效的。 如果希望在ResultMap
    中使用TypeHandler,那么设置@MappedJdbcTypes注解的includeNullJdbcType=true即可。 然而从Mybatis 3.4.0开始,
    如果只有一个注册的TypeHandler来处理Java类型,那么它将是ResultMap使用Java类型时的默认值(即使没有includeNullJdbcType=true)。 

4) 最后,可以让 MyBatis 为你查找类型处理器:
	<!-- mybatis-config.xml -->
	<typeHandlers>
	  <package name="org.mybatis.example"/>
	</typeHandlers>

 EnumTypeHandler 和 EnumOrdinalTypeHandler 都是泛型类型处理器(generic TypeHandlers)

11、 对于数值类型,还有一个小数保留位数的设置,来确定小数点后保留的位数。

#{height,javaType=double,jdbcType=NUMERIC,numericScale=2}

12、useGeneratedKeys:(仅对 insert 和 update 有用)这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系数据库管理系统的自动递增字段),默认值:false。

13、keyProperty:(仅对 insert 和 update 有用)唯一标记一个属性,MyBatis 会通过 getGeneratedKeys 的返回值或者通过 insert 语句的 selectKey 子元素设置它的键值,默认:unset。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。

14、主键生成样例

    a. 如果你的数据库支持自动生成主键的字段(比如 MySQL 和 SQL Server),那么你可以设置 useGeneratedKeys=”true”,然后再把 keyProperty 设置到目标属性上就OK了。例如,如果上面的 Author 表已经对 id 使用了自动生成的列类型,那么语句可以修改为:

<insert id="insertAuthor" useGeneratedKeys="true"
    keyProperty="id">
  insert into Author (username, password, email, bio) values
  <foreach item="item" collection="list" separator=",">
    (#{item.username}, #{item.password}, #{item.email}, #{item.bio})
  </foreach>
</insert>

    b. 对于不支持自动生成类型的数据库或可能不支持自动生成主键 JDBC 驱动来说,MyBatis 有另外一种方法来生成主键。(不建议使用)

<insert id="insertAuthor">
  <selectKey keyProperty="id" resultType="int" order="BEFORE">
    select CAST(RANDOM()*1000000 as INTEGER) a from SYSIBM.SYSDUMMY1
  </selectKey>
  insert into Author
    (id, username, password, email,bio, favourite_section)
  values
    (#{id}, #{username}, #{password}, #{email}, #{bio}, #{favouriteSection,jdbcType=VARCHAR})
</insert>

15、日志的配置

<!-- In mybatis-config.xml file -->
<configuration>
  <settings>
    ...
    <setting name="logImpl" value="LOG4J"/>
    ...
  </settings>
</configuration>

logImpl可选的值有:SLF4J、LOG4J、LOG4J2、JDK_LOGGING、COMMONS_LOGGING、STDOUT_LOGGING、NO_LOGGING 或者是实现了接口org.apache.ibatis.logging.Log的类的完全限定类名, 并且这个类的构造函数需要是以一个字符串(String类型)为参数的。 (可以参考org.apache.ibatis.logging.slf4j.Slf4jImpl.java的实现)

16、数据库的字段类型要与查询的值类型一致,不然不会走索引。如ID:VARCHAR(32), 若查询时ID=123,则不会走索引。

 

 

© 著作权归作者所有

k
粉丝 3
博文 61
码字总数 29867
作品 0
深圳
私信 提问
MyBatis与MySQL交互

MyBatis是我接触到的第一个框架,下面谈一谈我第一次使用MyBatis时的感悟。 首先是一些准备工作 下载相关的jar包。到GitHub上就行,上面有全面和完整的jar文件 在eclipse上安装MyBatis Gener...

郭璞
2016/04/25
0
0
springboot+mybatis

很久没写写东西了,去年底开始在做微服务改造,玩spring boot还有spring cloud。总结一下,免得脑子不好使,忘记事情。 springboot和spring jpa有很好的天然集成,但是如果要用mybatis的话,...

李不言
2017/05/14
0
0
回顾一下MyBatis逆向工程——自动生成代码

⭐⭐⭐⭐⭐最最最最最重要的事情: 我自己总结的Java学习的系统知识点以及面试问题,目前已经开源,会一直完善下去,欢迎建议和指导欢迎Star: https://github.com/Snailclimb/Java-Guide 我...

snailclimb
2018/07/12
0
0
MyBatis入门学习教程 MyBatis快速入门1-8(2)

上一章:http://my.oschina.net/u/2608629/admin/edit-blog?blog=715422 上一篇MyBatis学习总结(一)——MyBatis快速入门中我们讲了如何使用Mybatis查询users表中的数据,算是对MyBatis有一个...

筱飞
2016/07/21
92
0
【Java框架】 Hibernate与Mybatis对比

Hibernate与Mybatis对比 今天同事跟我说现在的小规模公司很少用hibernate,大部分都用mybatis。平时也经常接触这两方面,正好最近不怎么忙,查看网上其他相关技术文档 ,梳理下Mybatis和Hib...

林元煌
2017/07/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

nginx学习笔记

中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。 是连接两个独立应用程序或独立系统的软件。 web请求通过中间件可以直接调用操作系统,也可以经过中间件把请求分发到多...

码农实战
今天
5
0
Spring Security 实战干货:玩转自定义登录

1. 前言 前面的关于 Spring Security 相关的文章只是一个预热。为了接下来更好的实战,如果你错过了请从 Spring Security 实战系列 开始。安全访问的第一步就是认证(Authentication),认证...

码农小胖哥
今天
11
0
JAVA 实现雪花算法生成唯一订单号工具类

import lombok.SneakyThrows;import lombok.extern.slf4j.Slf4j;import java.util.Calendar;/** * Default distributed primary key generator. * * <p> * Use snowflake......

huangkejie
昨天
12
0
PhotoShop 色调:RGB/CMYK 颜色模式

一·、 RGB : 三原色:红绿蓝 1.通道:通道中的红绿蓝通道分别对应的是红绿蓝三种原色(RGB)的显示范围 1.差值模式能模拟三种原色叠加之后的效果 2.添加-颜色曲线:调整图像RGB颜色----R色增强...

东方墨天
昨天
11
1
将博客搬至CSDN

将博客搬至CSDN

算法与编程之美
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部