映射器的配置:
元素名称 | 描述 |
select | 查询语句 |
insert | 插入语句 |
update | 更新语句 |
delete | 删除语句 |
sql | 允许定义一部分SQL,然后各个地方引用 |
resultMap | 用于定义结果集 |
cache | 给定命名控件的缓存配置 |
cache-ref | 其它命名控件缓存配置的引用 |
select
mapUnderscoreToCamelCase
数据库字段名一般采用下划线命名规则,而java中的字段名用的是驼峰命名规则:
JavaBean | 数据库 |
id | id |
roleName | role_name |
note | note |
isGirl | is_girl |
1 | <settings> |
MyBatis就会自动将数据库字段名转换为JavaBean的字段名,比如:
1 | <select id="getRole" parameterType="long" resultType="role"> |
如果不将mapUnderscoreToCamelCase设置为true,则select元素必须指明字段别名:
1 | <select id="getRole" parameterType="long" resultType="role"> |
否则没有对应上的字段值为null。
传递多个参数
1.使用Map传参
定义一个抽象方法:
1 | public List<Role> getRole(Map<String,String> params); |
映射文件中配置select:
1 | <resultMap type="role" id="roleList"> |
测试:
1 | ... |
输出:
1 | 雏田 is a girl:true |
2.使用注解传参
修改抽象方法:
1 | public List<Role> getRole(@Param("roleName")String roleName, |
测试:
1 | ... |
输出:
1 | 雏田 is a girl:true |
3.使用JavaBean传参
定义一个传递参数JavaBean:
1 | public class RoleParams { |
修改抽象方法:
1 | public List<Role> getRole(RoleParams params); |
测试:
1 | ... |
输出:
1 | 鸣人 is a girl:false |
insert
主键回填和自定义
开发中有时候需要获取到插入行的主键值,MyBatis的主键回填可以完成这个功能。
定义一个createRole抽象方法:
1 | public int createRole(Role role); |
映射:
1 | <insert id="createRole" parameterType="role" useGeneratedKeys="true" |
useGeneratedKeys会使MyBatis使用JDBC的getGeneratedKeys方法来获取出由数据库内部生成的主键,keyProperty表示以哪个列为属性的主键。
测试获取主键:
1 | ... |
页面输出 7,查询数据库:
1 | mysql> select * from t_role; |
假如数据库主键没有设置自增,我们的要求是:如果表t_role没有记录,则id设置为1,否则我们取最大id加2。这时候我们可以对映射文件的insert标签稍作修改:
1 | <insert id="createRole" parameterType="role" useGeneratedKeys="true" |
测试:
1 | ... |
输出9和我们预期的一致,查询数据库:
1 | mysql> select * from t_role; |
update & delete
update和delete较为简单,一个简单的更新和删除例子:
1 | <update id="updateRole" parameterType="role"> |
参数
参数配置
参数除了可以指定javaType,jdbcType和typeHandler外,还可以对数值类型的参数设置精度:
1 | #{price,javaType=double,jdbcType=NUMERIC,numericScale=2} |
$与井
#{}的值被作为sql的参数,而${}则会被当作sql的一部分。
sql元素
sql元素的作用是可以定义sql语句的一部分,然后导出引用:
1 | <sql id="t_role_column"> |
上述代码定义了一个id为t_role_column的sql,然后在select元素中使用include元素引用了它,从而达到了重用的功能。
还可以在sql元素中指定标签:
1 | <sql id="t_role_column"> |
这个功能在使用关联查询的时候较为方便。