MyBatis有两种配置文件:全局配置文件和映射文件。
全局配置文件:配置了数据源、事务等运行环境,并在mapper属性中给出了每个映射文件的路径.
名称不固定,由SqlSessionFactoryBuilder从指定文件路径加载构建出SqlSessionFactory的实例。
一个典型的全局配置文件mybatis-config.xml如下:
properties resource="jdbc.properties" 指出了属性资源文件的路径
typeAliases设置了类型别名,类型别名是为 Java 类型设置一个短的名字。它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。
environments中配置了环境,事务管理器使用JDBC,数据源类型为POOLED。
数据库的连接属性如driver、username等使用了动态配置的属性值,实际值会从jdbc.properties中取得。
mappers中设置了映射文件的路径,告诉MyBatis到哪里去找到这些包含SQL映射语句的配置文件
配置文件包含的属性设置项详见http://mybatis.org/mybatis-3/zh/configuration.html#
映射文件:配置sql映射语句
insert – 映射插入语句
update – 映射更新语句
delete – 映射删除语句
select – 映射查询语句
insert中的useGeneratedKeys、keyProperty属性用于获取插入记录的主键值。
useGeneratedKeys :(仅对 insert 和 update 有用)这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系数据库管理系统的自动递增字段),默认值:false。
keyProperty :(仅对 insert 和 update 有用)唯一标记一个属性,MyBatis 会通过 getGeneratedKeys 的返回值或者通过 insert 语句的 selectKey 子元素设置它的键值,默认:unset。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。
详细参数可参考:http://mybatis.org/mybatis-3/zh/sqlmap-xml.html
choose (when, otherwise)
trim (where, set)
foreach
动态SQL详见:http://mybatis.org/mybatis-3/zh/dynamic-sql.html
全局配置文件:配置了数据源、事务等运行环境,并在mapper属性中给出了每个映射文件的路径.
名称不固定,由SqlSessionFactoryBuilder从指定文件路径加载构建出SqlSessionFactory的实例。
一个典型的全局配置文件mybatis-config.xml如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="jdbc.properties" />
<typeAliases>
<typeAlias alias="Article" type="com.dianping.lx.domain.Article"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${database.driver}"/>
<property name="url" value="${database.url}"/>
<property name="username" value="${database.username}"/>
<property name="password" value="${database.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="sqlmap/article.xml"/>
</mappers>
</configuration>
jdbc.properties文件内容如下:
database.driver = com.mysql.jdbc.Driver
database.url = jdbc:mysql://localhost:3306/test
database.username = app
database.password = app
该配置文件使用了mybatis-3-config.dtd约束properties resource="jdbc.properties" 指出了属性资源文件的路径
typeAliases设置了类型别名,类型别名是为 Java 类型设置一个短的名字。它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。
environments中配置了环境,事务管理器使用JDBC,数据源类型为POOLED。
数据库的连接属性如driver、username等使用了动态配置的属性值,实际值会从jdbc.properties中取得。
mappers中设置了映射文件的路径,告诉MyBatis到哪里去找到这些包含SQL映射语句的配置文件
配置文件包含的属性设置项详见http://mybatis.org/mybatis-3/zh/configuration.html#
映射文件:配置sql映射语句
典型配置文件如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dianping.lx.dao.ArticleDAO">
<resultMap id="Article_Map" type="Article">
<id property="id" column="id"/>
<id property="title" column="title"/>
<id property="body" column="body"/>
<id property="pageView" column="page_view"/>
<id property="isVisible" column="is_visible"/>
<id property="canComment" column="can_comment"/>
<id property="updateTime" column="update_time"/>
</resultMap>
<select id="getArticleById" parameterType="int" resultMap="Article_Map" >
select * from article where id=#{id}
</select>
<insert id="addArticle" parameterType="Article" useGeneratedKeys="true" keyProperty="id">
insert into article(title,body,is_visible) values(#{title},#{body},#{isVisible})
</insert>
<update id="updateArticle" parameterType="Article">
update article set title=#{title},body=#{body},is_visible=#{isVisible},can_comment=#{canComment} where id=#{id}
</update>
<delete id="deleteArticleById" parameterType="int">
delete from article where id=#{id}
</delete>
</mapper>
风格的参数映射
sql – 可被其他语句引用的可重用语句块。insert – 映射插入语句
update – 映射更新语句
delete – 映射删除语句
select – 映射查询语句
select中的parameterType是输入参数,表示接收1个int类型的参数,resultMap表示sql执行结果的返回类型,此处是Article_Map,和resultMap属性中id为的Article_Map的相对应,由于其关联的是type是Article这个类,因此sql查询结果会根据resultMap设定的一一对应关系把数据库查询结果对应字段的值设置到Article类的相应成员,完成了ResultSet到POJO类的映射。注意:如果POJO类的成员变量字段名称和数据库中列字段名称完全一致即精确匹配的情况下,也可以直接使用resultType为Article,如果不完全匹配也可以利用sql的别名使其匹配从而免去使用resultMap,如下所示。
<select id="getArticleById" parameterType="int" resultType="Article" >
select
id,
title,
body,
page_view as pageView,
is_visible as isVisible,
can_comment as canComment,
update_time as updateTime
from article where id=#{id}
</select>
sql语句中的#{id}是一个预处理参数,等价于使用JDBC方式用PreparedStatement中的?占位符insert中的useGeneratedKeys、keyProperty属性用于获取插入记录的主键值。
useGeneratedKeys :(仅对 insert 和 update 有用)这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系数据库管理系统的自动递增字段),默认值:false。
keyProperty :(仅对 insert 和 update 有用)唯一标记一个属性,MyBatis 会通过 getGeneratedKeys 的返回值或者通过 insert 语句的 selectKey 子元素设置它的键值,默认:unset。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。
详细参数可参考:http://mybatis.org/mybatis-3/zh/sqlmap-xml.html
动态SQL
MyBatis的强大特性之一便是它的动态SQL。如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦。拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。MyBatis 采用功能强大的基于 OGNL 的表达式来消除其他元素。
ifchoose (when, otherwise)
trim (where, set)
foreach
动态SQL详见:http://mybatis.org/mybatis-3/zh/dynamic-sql.html