目录
一.概述
1.简介
2.maven构建
二.相关概念
1.Mapper接口
2.ORM思想
三.映射配置文件
1.文件结构
2.映射配置文件标签详解
3.SQL语句中参数的获取
(1)获取方式
(2)参数类型
4.各种SQL操作
5.处理表字段和实体类属性名不一致的情况
6.多对一映射关系的处理
7.一对多映射关系的处理
8.分布查询的优点
9.动态SQL
四.核心配置文件
1.文件结构
2.核心配置文件详解
(1)标签顺序
(2)标签详解
五.相关API
1.Resources
2.SqlSessionFactoryBuilder
3.SqlSessionFactory
4.SqlSession
5.最佳实践
六.缓存
1.一级缓存
2.二级缓存
3.缓存的查询顺序
将MyBatis相关依赖导入项目,pom.xml添加如下配置
<span style="background-color:#f8f8f8"><span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>org.mybatis<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>mybatis<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>3.5.7<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span></span>
将Mysql相关依赖导入
<span style="background-color:#f8f8f8"><span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>mysql<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>mysql-connector-java<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>5.1.37<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span></span>
将Junit相关依赖代入
<span style="background-color:#f8f8f8"><span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>junit<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>junit<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>4.12<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">scope</span><span style="color:#117700">></span>test<span style="color:#117700"></</span><span style="color:#117700">scope</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span></span>
将log4j相关依赖导入
<span style="background-color:#f8f8f8"><span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>log4j<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>log4j<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>1.2.17<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span></span>
log4j的配置文件名为log4j.xml,存放的位置是src/main/resources目录下:
<span style="background-color:#f8f8f8"><span style="color:#555555"><?xml</span> <span style="color:#555555">version="1.0" encoding="UTF-8" ?></span>
<span style="color:#555555"><!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"></span>
<span style="color:#117700"><</span><span style="color:#117700">log4j:configuration</span> <span style="color:#0000cc">xmlns:log4j</span>=<span style="color:#aa1111">"http://jakarta.apache.org/log4j/"</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">appender</span> <span style="color:#0000cc">name</span>=<span style="color:#aa1111">"STDOUT"</span> <span style="color:#0000cc">class</span>=<span style="color:#aa1111">"org.apache.log4j.ConsoleAppender"</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">param</span> <span style="color:#0000cc">name</span>=<span style="color:#aa1111">"Encoding"</span> <span style="color:#0000cc">value</span>=<span style="color:#aa1111">"UTF-8"</span> <span style="color:#117700">/></span>
<span style="color:#117700"><</span><span style="color:#117700">layout</span> <span style="color:#0000cc">class</span>=<span style="color:#aa1111">"org.apache.log4j.PatternLayout"</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">param</span> <span style="color:#0000cc">name</span>=<span style="color:#aa1111">"ConversionPattern"</span> <span style="color:#0000cc">value</span>=<span style="color:#aa1111">"%-5p %d{MM-dd HH:mm:ss,SSS}%m (%F:%L) \n"</span> <span style="color:#117700">/></span>
<span style="color:#117700"></</span><span style="color:#117700">layout</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">appender</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">logger</span> <span style="color:#0000cc">name</span>=<span style="color:#aa1111">"java.sql"</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">level</span> <span style="color:#0000cc">value</span>=<span style="color:#aa1111">"debug"</span> <span style="color:#117700">/></span>
<span style="color:#117700"></</span><span style="color:#117700">logger</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">logger</span> <span style="color:#0000cc">name</span>=<span style="color:#aa1111">"org.apache.ibatis"</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">level</span> <span style="color:#0000cc">value</span>=<span style="color:#aa1111">"info"</span> <span style="color:#117700">/></span>
<span style="color:#117700"></</span><span style="color:#117700">logger</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">root</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">level</span> <span style="color:#0000cc">value</span>=<span style="color:#aa1111">"debug"</span> <span style="color:#117700">/></span>
<span style="color:#117700"><</span><span style="color:#117700">appender-ref</span> <span style="color:#0000cc">ref</span>=<span style="color:#aa1111">"STDOUT"</span> <span style="color:#117700">/></span>
<span style="color:#117700"></</span><span style="color:#117700">root</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">log4j:configuration</span><span style="color:#117700">></span></span>
MyBatis中的mapper接口相当于以前的dao。但是区别在于,mapper仅仅是接口,我们不需要提供实现类。
Mapper接口的取名应该是和映射文件名保持一致
比如,某个实体类User,它的Mapper接口如下:
<span style="background-color:#f8f8f8"><span style="color:#770088">public</span> <span style="color:#770088">interface</span> <span style="color:#0000ff">UserMapper</span>{
<span style="color:#008855">int</span> <span style="color:#000000">insert</span>();
}</span>
在Mapper接口中可以提供一些抽象方法,用于增删改查
命名规则:数据库表对应的类名+Mapper.xml
一个映射文件对应一个实体类,对应一个表中的操作
映射文件主要用于编写SQL、访问以及操作表中的数据
映射文件存放位置是maven工程下的src/main/resources/mappers目录下
映射配置文件要保证两个一致
映射文件的简易结构如下
<span style="background-color:#f8f8f8"><span style="color:#555555"><?xml</span> <span style="color:#555555">version="1.0" encoding="UTF-8" ?></span>
<span style="color:#aa5500"><!--DTD约束--></span>
<span style="color:#555555"><!DOCTYPE mapper</span>
<span style="color:#555555">PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"</span>
<span style="color:#555555">"http://mybatis.org/dtd/mybatis-3-mapper.dtd"></span>
<span style="color:#117700"><</span><span style="color:#117700">mapper</span> <span style="color:#0000cc">namespace</span>=<span style="color:#aa1111">"Mapper接口全类名"</span><span style="color:#117700">></span>
<span style="color:#aa5500"><!--映射语句--></span>
<span style="color:#117700"><</span><span style="color:#117700">insert</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"Mapper接口方法名"</span><span style="color:#117700">></span>
SQL语句
<span style="color:#117700"></</span><span style="color:#117700">insert</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">mapper</span><span style="color:#117700">></span></span>
<insert>标签
<span style="background-color:#f8f8f8"><span style="color:#117700"><</span><span style="color:#117700">insert</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"insertUser"</span><span style="color:#117700">></span>
SQL语句
<span style="color:#117700"></</span><span style="color:#117700">insert</span><span style="color:#117700">></span></span>
<delete>标签
<span style="background-color:#f8f8f8"><span style="color:#117700"><</span><span style="color:#117700">delete</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"deleteUser"</span><span style="color:#117700">></span>
SQL语句
<span style="color:#117700"></</span><span style="color:#117700">delete</span><span style="color:#117700">></span></span>
<update>标签
<span style="background-color:#f8f8f8"><span style="color:#117700"><</span><span style="color:#117700">update</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"updateUser"</span><span style="color:#117700">></span>
SQL语句
<span style="color:#117700"></</span><span style="color:#117700">update</span><span style="color:#117700">></span></span>
<select>标签
<span style="background-color:#f8f8f8"><span style="color:#117700"><</span><span style="color:#117700">select</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"getUserById"</span> <span style="color:#0000cc">resultType</span>=<span style="color:#aa1111">"com.lxq.pojo.User"</span><span style="color:#117700">></span>
SQL语句
<span style="color:#117700"></</span><span style="color:#117700">select</span><span style="color:#117700">></span></span>
查询多条数据到List集合:
<span style="background-color:#f8f8f8"><span style="color:#117700"><</span><span style="color:#117700">select</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"getUserList"</span> <span style="color:#0000cc">resultType</span>=<span style="color:#aa1111">"com.lxq.pojo.User"</span><span style="color:#117700">></span>
SQL语句
<span style="color:#117700"></</span><span style="color:#117700">select</span><span style="color:#117700">></span></span>
MyBatis获取参数值的两种方式:${}和#{}
${}的本质是字符串拼接,#{}的本质是占位符赋值
${}方式会将参数原原本本拼接入SQL语句中,如果参数是字符串类型的需要手动加上引号
<span style="background-color:#f8f8f8">`${参数}`</span>
#{}的方式会自动加上引号,如果是字符串类型的参数无需手动加上引号
<span style="background-color:#f8f8f8">#{参数}</span>
单个字面量类型的参数
<span style="background-color:#f8f8f8"><select id="getUserByUsername" resultType="User">
select * from t_user where username=#{username}
</select></span>
多个字面量类型的参数
arg0,arg1...
为map中的键,参数值为map中的值;还有param1,param2...
为map中的键,参数值为map值的值
<span style="background-color:#f8f8f8"><span style="color:#aa5500"><!--arg的方式--></span>
<span style="color:#117700"><</span><span style="color:#117700">select</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"checkLogin"</span> <span style="color:#0000cc">resultType</span>=<span style="color:#aa1111">"User"</span><span style="color:#117700">></span>
select * from t_user where username = #{arg0} and password = #{arg1}
<span style="color:#117700"></</span><span style="color:#117700">select</span><span style="color:#117700">></span>
<span style="color:#aa5500"><!--param的方式--></span>
<span style="color:#117700"><</span><span style="color:#117700">select</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"checkLogin"</span> <span style="color:#0000cc">resultType</span>=<span style="color:#aa1111">"User"</span><span style="color:#117700">></span>
select * from t_user where username = #{param1} and password = #{param2}
<span style="color:#117700"></</span><span style="color:#117700">select</span><span style="color:#117700">></span></span>
map集合类型的参数
{("username","参数值"),("password","参数值")}
<span style="background-color:#f8f8f8"><span style="color:#117700"><</span><span style="color:#117700">select</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"checkLoginByMap"</span> <span style="color:#0000cc">resultType</span>=<span style="color:#aa1111">"User"</span><span style="color:#117700">></span>
select * from t_user where username = #{username} and password = #{password}
<span style="color:#117700"></</span><span style="color:#117700">select</span><span style="color:#117700">></span></span>
使用@Param注解标识的参数
<span style="background-color:#f8f8f8"><span style="color:#000000">User</span> <span style="color:#0000ff">getUserByParam</span>(<span style="color:#555555">@Param</span>(<span style="color:#aa1111">"username"</span>) <span style="color:#008855">String</span> <span style="color:#000000">username</span>,<span style="color:#555555">@Param</span>(<span style="color:#aa1111">"password"</span>) <span style="color:#008855">String</span> <span style="color:#000000">password</span>);</span>
<span style="background-color:#f8f8f8"><span style="color:#117700"><</span><span style="color:#117700">select</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"checkLoginByParam"</span> <span style="color:#0000cc">resultType</span>=<span style="color:#aa1111">"User"</span><span style="color:#117700">></span>
select * from t_user where username = #{username} and password = #{password}
<span style="color:#117700"></</span><span style="color:#117700">select</span><span style="color:#117700">></span></span>
实体类型的参数
<span style="background-color:#f8f8f8"><span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">User</span> {
<span style="color:#770088">private</span> <span style="color:#008855">Integer</span> <span style="color:#000000">id</span>;
<span style="color:#770088">private</span> <span style="color:#008855">String</span> <span style="color:#000000">username</span>;
<span style="color:#770088">private</span> <span style="color:#008855">String</span> <span style="color:#000000">password</span>;
<span style="color:#770088">private</span> <span style="color:#008855">Integer</span> <span style="color:#000000">age</span>;
<span style="color:#770088">private</span> <span style="color:#008855">String</span> <span style="color:#000000">gender</span>;
<span style="color:#770088">private</span> <span style="color:#008855">String</span> <span style="color:#000000">email</span>;
<span style="color:#aa5500">//省略有参、无参构造方法以及toString()方法</span>
<span style="color:#770088">public</span> <span style="color:#008855">Integer</span> <span style="color:#000000">getId</span>() {
<span style="color:#770088">return</span> <span style="color:#000000">id</span>;
}
<span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#000000">setId</span>(<span style="color:#008855">Integer</span> <span style="color:#000000">id</span>) {
<span style="color:#770088">this</span>.<span style="color:#000000">id</span> <span style="color:#981a1a">=</span> <span style="color:#000000">id</span>;
}
<span style="color:#770088">public</span> <span style="color:#008855">String</span> <span style="color:#000000">getUsername</span>() {
<span style="color:#770088">return</span> <span style="color:#000000">username</span>;
}
<span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#000000">setUsername</span>(<span style="color:#008855">String</span> <span style="color:#000000">username</span>) {
<span style="color:#770088">this</span>.<span style="color:#000000">username</span> <span style="color:#981a1a">=</span> <span style="color:#000000">username</span>;
}
<span style="color:#770088">public</span> <span style="color:#008855">String</span> <span style="color:#000000">getPassword</span>() {
<span style="color:#770088">return</span> <span style="color:#000000">password</span>;
}
<span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#000000">setPassword</span>(<span style="color:#008855">String</span> <span style="color:#000000">password</span>) {
<span style="color:#770088">this</span>.<span style="color:#000000">password</span> <span style="color:#981a1a">=</span> <span style="color:#000000">password</span>;
}
<span style="color:#770088">public</span> <span style="color:#008855">Integer</span> <span style="color:#000000">getAge</span>() {
<span style="color:#770088">return</span> <span style="color:#000000">age</span>;
}
<span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#000000">setAge</span>(<span style="color:#008855">Integer</span> <span style="color:#000000">age</span>) {
<span style="color:#770088">this</span>.<span style="color:#000000">age</span> <span style="color:#981a1a">=</span> <span style="color:#000000">age</span>;
}
<span style="color:#770088">public</span> <span style="color:#008855">String</span> <span style="color:#000000">getGender</span>() {
<span style="color:#770088">return</span> <span style="color:#000000">gender</span>;
}
<span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#000000">setGender</span>(<span style="color:#008855">String</span> <span style="color:#000000">gender</span>) {
<span style="color:#770088">this</span>.<span style="color:#000000">gender</span> <span style="color:#981a1a">=</span> <span style="color:#000000">gender</span>;
}
<span style="color:#770088">public</span> <span style="color:#008855">String</span> <span style="color:#000000">getEmail</span>() {
<span style="color:#770088">return</span> <span style="color:#000000">email</span>;
}
<span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#000000">setEmail</span>(<span style="color:#008855">String</span> <span style="color:#000000">email</span>) {
<span style="color:#770088">this</span>.<span style="color:#000000">email</span> <span style="color:#981a1a">=</span> <span style="color:#000000">email</span>;
}
}</span>
<span style="background-color:#f8f8f8"><span style="color:#117700"><</span><span style="color:#117700">insert</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"insertUser"</span><span style="color:#117700">></span>
insert into t_user value(null,#{username},#{password},#{age},#{gender},#{email})
<span style="color:#117700"></</span><span style="color:#117700">insert</span><span style="color:#117700">></span></span>
总结
查询一个实体类对象
映射方法:
<span style="background-color:#f8f8f8"><span style="color:#000000">User</span> <span style="color:#0000ff">getUserById</span>(<span style="color:#555555">@Param</span>(<span style="color:#aa1111">"id"</span>) <span style="color:#008855">int</span> <span style="color:#000000">id</span>);</span>
映射文件:
<span style="background-color:#f8f8f8"><span style="color:#117700"><</span><span style="color:#117700">select</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"getUserById"</span> <span style="color:#0000cc">resultType</span>=<span style="color:#aa1111">"User"</span><span style="color:#117700">></span>
select * from t_user where id = #{id}
<span style="color:#117700"></</span><span style="color:#117700">select</span><span style="color:#117700">></span></span>
查询一个List集合
映射方法:
<span style="background-color:#f8f8f8"><span style="color:#000000">List</span><span style="color:#981a1a"><</span><span style="color:#000000">User</span><span style="color:#981a1a">></span> <span style="color:#0000ff">getAllUser</span>();</span>
映射文件:
<span style="background-color:#f8f8f8"><span style="color:#117700"><</span><span style="color:#117700">select</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"getAllUser"</span> <span style="color:#0000cc">resultType</span>=<span style="color:#aa1111">"User"</span><span style="color:#117700">></span>
select * from t_user
<span style="color:#117700"></</span><span style="color:#117700">select</span><span style="color:#117700">></span></span>
注意:当查询的数据为多条时,不能使用实体类作为返回值,否则会抛出异常 TooManyResultsException;但是若查询的数据只有一条,可以使用实体类或集合作为返回值
查询单个数据
映射方法:
<span style="background-color:#f8f8f8"><span style="color:#008855">int</span> <span style="color:#0000ff">getCount</span>();</span>
映射文件:
<span style="background-color:#f8f8f8"><span style="color:#117700"><</span><span style="color:#117700">select</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"getCount"</span> <span style="color:#0000cc">resultType</span>=<span style="color:#aa1111">"java.lang.Integer"</span><span style="color:#117700">></span>
select count(id) from t_user
<span style="color:#117700"></</span><span style="color:#117700">select</span><span style="color:#117700">></span></span>
查询一条数据到map集合
映射方法:
<span style="background-color:#f8f8f8"><span style="color:#000000">Map</span><span style="color:#981a1a"><</span><span style="color:#008855">String</span>,<span style="color:#008855">Object</span><span style="color:#981a1a">></span> <span style="color:#0000ff">getUserToMap</span>(<span style="color:#555555">@Param</span>(<span style="color:#aa1111">"id"</span>) <span style="color:#008855">int</span> <span style="color:#000000">id</span>);</span>
映射文件:
<span style="background-color:#f8f8f8"><span style="color:#117700"><</span><span style="color:#117700">select</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"getUserToMap"</span> <span style="color:#0000cc">resultType</span>=<span style="color:#aa1111">"java.util.Map"</span><span style="color:#117700">></span>
select * from t_user where id = #{id}
<span style="color:#117700"></</span><span style="color:#117700">select</span><span style="color:#117700">></span></span>
注意:将一条数据查询到map集合中时,map的键是表中的字段名,map的值是表中数据
查询多条数据到map集合
<span style="background-color:#f8f8f8">{
1={password=123456, sex=男, id=1, age=23, username=admin},
2={password=123456, sex=男, id=2, age=23, username=张三},
3={password=123456, sex=男, id=3, age=23, username=张三}
}</span>
<span style="background-color:#f8f8f8"><span style="color:#000000">List</span><span style="color:#981a1a"><</span><span style="color:#000000">Map</span><span style="color:#981a1a"><</span><span style="color:#008855">String</span>,<span style="color:#008855">Object</span><span style="color:#981a1a">>></span> <span style="color:#0000ff">getAllUserToMap</span>();</span>
映射文件:
<span style="background-color:#f8f8f8"><span style="color:#117700"><</span><span style="color:#117700">select</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"getAllUserToMap"</span> <span style="color:#0000cc">resultType</span>=<span style="color:#aa1111">"java.util.Map"</span><span style="color:#117700">></span>
select * from t_user
<span style="color:#117700"></</span><span style="color:#117700">select</span><span style="color:#117700">></span></span>
<span style="background-color:#f8f8f8"><span style="color:#555555">@MapKey</span>(<span style="color:#aa1111">"id"</span>)
<span style="color:#000000">Map</span><span style="color:#981a1a"><</span><span style="color:#008855">String</span>,<span style="color:#008855">Object</span><span style="color:#981a1a">></span> <span style="color:#0000ff">getAllUserToMap</span>();</span>
映射文件:
<span style="background-color:#f8f8f8"><span style="color:#117700"><</span><span style="color:#117700">select</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"getAllUserToMap"</span> <span style="color:#0000cc">resultType</span>=<span style="color:#aa1111">"java.util.Map"</span><span style="color:#117700">></span>
select * from t_user
<span style="color:#117700"></</span><span style="color:#117700">select</span><span style="color:#117700">></span></span>
模糊查询
映射方法:
<span style="background-color:#f8f8f8"><span style="color:#000000">List</span><span style="color:#981a1a"><</span><span style="color:#000000">User</span><span style="color:#981a1a">></span> <span style="color:#0000ff">getUserByLike</span>(<span style="color:#555555">@Param</span>(<span style="color:#aa1111">"mohu"</span>) <span style="color:#008855">String</span> <span style="color:#000000">mohu</span>);</span>
映射文件:
<span style="background-color:#f8f8f8"><span style="color:#117700"><</span><span style="color:#117700">select</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"getUserByLike"</span> <span style="color:#0000cc">resultType</span>=<span style="color:#aa1111">"User"</span><span style="color:#117700">></span>
<span style="color:#aa5500"><!--方式1--></span>
select * from t_user where username like '%${mohu}%'
<span style="color:#aa5500"><!--方式2--></span>
select * from t_user where username like concat("%",#{mohu},"%")
<span style="color:#aa5500"><!--方式3--></span>
select * from t_user where username like "%"#{mohu}"%"
<span style="color:#117700"></</span><span style="color:#117700">select</span><span style="color:#117700">></span></span>
注意:不能使用like '%#{mohu}%'
的方式,因为#{}会被解析成?,这个问号会被当成字符串的一部分造成参数获取失败
批量删除
映射方法:
<span style="background-color:#f8f8f8"><span style="color:#008855">void</span> <span style="color:#0000ff">deleteSomeUser</span>(<span style="color:#555555">@Param</span>(<span style="color:#aa1111">"ids"</span>) <span style="color:#008855">String</span> <span style="color:#000000">ids</span>);</span>
映射文件:
<span style="background-color:#f8f8f8"><span style="color:#117700"><</span><span style="color:#117700">delete</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"deleteSomeUser"</span><span style="color:#117700">></span>
delete from t_user where id in(${ids})
<span style="color:#117700"></</span><span style="color:#117700">delete</span><span style="color:#117700">></span></span>
注意:这里获取参数的方式是${},因为#{}会自动添加引号,如果使用#{}的方式会造成SQL语句解析成delete from t_user where id in('ids')
从而报错
动态设置表名
映射方法:
<span style="background-color:#f8f8f8"><span style="color:#000000">List</span><span style="color:#981a1a"><</span><span style="color:#000000">User</span><span style="color:#981a1a">></span> <span style="color:#0000ff">getUserList</span>(<span style="color:#555555">@Param</span>(<span style="color:#aa1111">"table"</span>) <span style="color:#008855">String</span> <span style="color:#000000">table</span>);</span>
映射文件:
<span style="background-color:#f8f8f8"><span style="color:#117700"><</span><span style="color:#117700">select</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"getUserList"</span> <span style="color:#0000cc">resultType</span>=<span style="color:#aa1111">"User"</span><span style="color:#117700">></span>
select * from ${table}
<span style="color:#117700"></</span><span style="color:#117700">select</span><span style="color:#117700">></span></span>
注意:这里使用${}是因为使用#{}时会自动添加引号,而表名不允许添加表名
执行添加功能时获取自增的主键
映射方法:
<span style="background-color:#f8f8f8"><span style="color:#008855">void</span> <span style="color:#0000ff">insertUser</span>(<span style="color:#000000">User</span> <span style="color:#000000">user</span>);</span>
映射文件:
<span style="background-color:#f8f8f8"><span style="color:#117700"><</span><span style="color:#117700">insert</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"insertUser"</span> <span style="color:#0000cc">useGeneratedKeys</span>=<span style="color:#aa1111">"true"</span> <span style="color:#0000cc">keyProperty</span>=<span style="color:#aa1111">"id"</span><span style="color:#117700">></span>
insert into t_user values(null,#{username},#{password},#{age},#{gender},#{email})
<span style="color:#117700"></</span><span style="color:#117700">insert</span><span style="color:#117700">></span></span>
测试方法:
<span style="background-color:#f8f8f8"><span style="color:#555555">@Test</span>
<span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#0000ff">testInsertUser</span>(){
<span style="color:#000000">SqlSession</span> <span style="color:#000000">sqlSession</span> <span style="color:#981a1a">=</span> <span style="color:#000000">SqlSessionUtil</span>.<span style="color:#000000">getSqlSession</span>();
<span style="color:#000000">SpecialSQLMapper</span> <span style="color:#000000">mapper</span> <span style="color:#981a1a">=</span> <span style="color:#000000">sqlSession</span>.<span style="color:#000000">getMapper</span>(<span style="color:#000000">SpecialSQLMapper</span>.<span style="color:#770088">class</span>);
<span style="color:#000000">User</span> <span style="color:#000000">user</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">User</span>(<span style="color:#221199">null</span>,<span style="color:#aa1111">"李晨"</span>,<span style="color:#aa1111">"1234567"</span>,<span style="color:#116644">46</span>,<span style="color:#aa1111">"男"</span>,<span style="color:#aa1111">"lichen@qq.com"</span>);
<span style="color:#000000">mapper</span>.<span style="color:#000000">insertUser</span>(<span style="color:#000000">user</span>);
<span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#000000">user</span>);<span style="color:#aa5500">//在这一步中打印出的User对象中可以看到自增的id,如果配置文件中不使用useGeneratedKeys和keyProperty,则id仍然是null</span>
}</span>
注意:这里的useGeneratedKeys设置使用自增主键为true,keyProperty是将获取的主键值赋给实体对象中的某个属性。这样,在添加这个实体对象后,自增的主键也能在实体对象中获得,而不需要进行查询
方式一:给字段名取别名
方式二:在核心配置文件中配置驼峰映射
<span style="background-color:#f8f8f8"><span style="color:#117700"><</span><span style="color:#117700">settings</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">setting</span> <span style="color:#0000cc">name</span>=<span style="color:#aa1111">"mapUnderscoreToCamelCase"</span> <span style="color:#0000cc">value</span>=<span style="color:#aa1111">"true"</span> <span style="color:#117700">/></span>
<span style="color:#117700"></</span><span style="color:#117700">settings</span><span style="color:#117700">></span></span>
方式三:在映射配置文件中使用<resultMap>标签自定义映射
<span style="background-color:#f8f8f8"><span style="color:#117700"><</span><span style="color:#117700">resultMap</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"empResultMap"</span> <span style="color:#0000cc">type</span>=<span style="color:#aa1111">"Emp"</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">id</span> <span style="color:#0000cc">column</span>=<span style="color:#aa1111">"emp_id"</span> <span style="color:#0000cc">property</span>=<span style="color:#aa1111">"empId"</span><span style="color:#117700">></</span><span style="color:#117700">id</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">result</span> <span style="color:#0000cc">column</span>=<span style="color:#aa1111">"emp_name"</span> <span style="color:#0000cc">property</span>=<span style="color:#aa1111">"empName"</span><span style="color:#117700">></</span><span style="color:#117700">result</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">result</span> <span style="color:#0000cc">column</span>=<span style="color:#aa1111">"age"</span> <span style="color:#0000cc">property</span>=<span style="color:#aa1111">"age"</span><span style="color:#117700">></</span><span style="color:#117700">result</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">result</span> <span style="color:#0000cc">column</span>=<span style="color:#aa1111">"gender"</span> <span style="color:#0000cc">property</span>=<span style="color:#aa1111">"gender"</span><span style="color:#117700">></</span><span style="color:#117700">result</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">resultMap</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">select</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"getEmpByEmpId"</span> <span style="color:#0000cc">resultType</span>=<span style="color:#aa1111">"Emp"</span> <span style="color:#0000cc">resultMap</span>=<span style="color:#aa1111">"empResultMap"</span><span style="color:#117700">></span>
select * from t_emp where emp_id = #{empId}
<span style="color:#117700"></</span><span style="color:#117700">select</span><span style="color:#117700">></span></span>
这里多对一是指实体类中某个属性是以表中多个字段为属性构成的实体类,如员工类的部门属性,部门属性的类型是部门类,这个部门类有部门id,部门名称
方式一:使用级联
<span style="background-color:#f8f8f8"><span style="color:#117700"><</span><span style="color:#117700">resultMap</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"getEmpAndDeptByEmpIdResultMap"</span> <span style="color:#0000cc">type</span>=<span style="color:#aa1111">"Emp"</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">id</span> <span style="color:#0000cc">column</span>=<span style="color:#aa1111">"emp_id"</span> <span style="color:#0000cc">property</span>=<span style="color:#aa1111">"empId"</span><span style="color:#117700">></</span><span style="color:#117700">id</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">result</span> <span style="color:#0000cc">column</span>=<span style="color:#aa1111">"emp_name"</span> <span style="color:#0000cc">property</span>=<span style="color:#aa1111">"empName"</span><span style="color:#117700">></</span><span style="color:#117700">result</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">result</span> <span style="color:#0000cc">column</span>=<span style="color:#aa1111">"age"</span> <span style="color:#0000cc">property</span>=<span style="color:#aa1111">"age"</span><span style="color:#117700">></</span><span style="color:#117700">result</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">result</span> <span style="color:#0000cc">column</span>=<span style="color:#aa1111">"gender"</span> <span style="color:#0000cc">property</span>=<span style="color:#aa1111">"gender"</span><span style="color:#117700">></</span><span style="color:#117700">result</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">result</span> <span style="color:#0000cc">column</span>=<span style="color:#aa1111">"dept_id"</span> <span style="color:#0000cc">property</span>=<span style="color:#aa1111">"dept.deptId"</span><span style="color:#117700">></</span><span style="color:#117700">result</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">result</span> <span style="color:#0000cc">column</span>=<span style="color:#aa1111">"dept_name"</span> <span style="color:#0000cc">property</span>=<span style="color:#aa1111">"dept.deptName"</span><span style="color:#117700">></</span><span style="color:#117700">result</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">resultMap</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">select</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"getEmpAndDeptByEmpId"</span> <span style="color:#0000cc">resultMap</span>=<span style="color:#aa1111">"getEmpAndDeptByEmpIdResultMap"</span><span style="color:#117700">></span>
select emp_id,emp_name,age,gender,t_dept.dept_id,dept_name
from t_emp left join t_dept
on t_emp.dept_id = t_dept.dept_id where emp_id = #{empId}
<span style="color:#117700"></</span><span style="color:#117700">select</span><span style="color:#117700">></span></span>
方式二:使用<association>标签
注意:association标签中property属性是指映射实体类中属性的名称,javaType是它的类型,而association标签下的id标签和result标签中的property属性是指javaType指定的类中的属性名称,column属性指表中的字段名
<span style="background-color:#f8f8f8"><span style="color:#117700"><</span><span style="color:#117700">resultMap</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"getEmpAndDeptByEmpIdResultMap"</span> <span style="color:#0000cc">type</span>=<span style="color:#aa1111">"Emp"</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">id</span> <span style="color:#0000cc">column</span>=<span style="color:#aa1111">"emp_id"</span> <span style="color:#0000cc">property</span>=<span style="color:#aa1111">"empId"</span><span style="color:#117700">></</span><span style="color:#117700">id</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">result</span> <span style="color:#0000cc">column</span>=<span style="color:#aa1111">"emp_name"</span> <span style="color:#0000cc">property</span>=<span style="color:#aa1111">"empName"</span><span style="color:#117700">></</span><span style="color:#117700">result</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">result</span> <span style="color:#0000cc">column</span>=<span style="color:#aa1111">"age"</span> <span style="color:#0000cc">property</span>=<span style="color:#aa1111">"age"</span><span style="color:#117700">></</span><span style="color:#117700">result</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">result</span> <span style="color:#0000cc">column</span>=<span style="color:#aa1111">"gender"</span> <span style="color:#0000cc">property</span>=<span style="color:#aa1111">"gender"</span><span style="color:#117700">></</span><span style="color:#117700">result</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">association</span> <span style="color:#0000cc">property</span>=<span style="color:#aa1111">"dept"</span> <span style="color:#0000cc">javaType</span>=<span style="color:#aa1111">"Dept"</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">id</span> <span style="color:#0000cc">column</span>=<span style="color:#aa1111">"dept_id"</span> <span style="color:#0000cc">property</span>=<span style="color:#aa1111">"deptId"</span><span style="color:#117700">></</span><span style="color:#117700">id</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">result</span> <span style="color:#0000cc">column</span>=<span style="color:#aa1111">"dept_name"</span> <span style="color:#0000cc">property</span>=<span style="color:#aa1111">"deptName"</span><span style="color:#117700">></</span><span style="color:#117700">result</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">association</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">resultMap</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">select</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"getEmpAndDeptByEmpId"</span> <span style="color:#0000cc">resultMap</span>=<span style="color:#aa1111">"getEmpAndDeptByEmpIdResultMap"</span><span style="color:#117700">></span>
select emp_id,emp_name,age,gender,t_dept.dept_id,dept_name
from t_emp left join t_dept
on t_emp.dept_id = t_dept.dept_id where emp_id = #{empId}
<span style="color:#117700"></</span><span style="color:#117700">select</span><span style="color:#117700">></span></span>
方式三:使用分步查询
<span style="background-color:#f8f8f8"><span style="color:#117700"><</span><span style="color:#117700">resultMap</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"getEmpAndDeptByEmpIdResultMap"</span> <span style="color:#0000cc">type</span>=<span style="color:#aa1111">"Emp"</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">id</span> <span style="color:#0000cc">column</span>=<span style="color:#aa1111">"emp_id"</span> <span style="color:#0000cc">property</span>=<span style="color:#aa1111">"empId"</span><span style="color:#117700">></</span><span style="color:#117700">id</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">result</span> <span style="color:#0000cc">column</span>=<span style="color:#aa1111">"emp_name"</span> <span style="color:#0000cc">property</span>=<span style="color:#aa1111">"empName"</span><span style="color:#117700">></</span><span style="color:#117700">result</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">result</span> <span style="color:#0000cc">column</span>=<span style="color:#aa1111">"age"</span> <span style="color:#0000cc">property</span>=<span style="color:#aa1111">"age"</span><span style="color:#117700">></</span><span style="color:#117700">result</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">result</span> <span style="color:#0000cc">column</span>=<span style="color:#aa1111">"gender"</span> <span style="color:#0000cc">property</span>=<span style="color:#aa1111">"gender"</span><span style="color:#117700">></</span><span style="color:#117700">result</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">association</span>
<span style="color:#0000cc">property</span>=<span style="color:#aa1111">"dept"</span>
<span style="color:#0000cc">select</span>=<span style="color:#aa1111">"com.liaoxiangqian.mapper.DeptMapper.getDeptByDeptId"</span>
<span style="color:#0000cc">column</span>=<span style="color:#aa1111">"dept_id"</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">association</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">resultMap</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">select</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"getEmpAndDeptByEmpId"</span> <span style="color:#0000cc">resultMap</span>=<span style="color:#aa1111">"getEmpAndDeptByEmpIdResultMap"</span><span style="color:#117700">></span>
select * from t_emp where emp_id = #{empId}
<span style="color:#117700"></</span><span style="color:#117700">select</span><span style="color:#117700">></span></span>
根据员工的部门id查询部门信息
<span style="background-color:#f8f8f8"><span style="color:#117700"><</span><span style="color:#117700">resultMap</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"getDeptByDeptIdResultMap"</span> <span style="color:#0000cc">type</span>=<span style="color:#aa1111">"Dept"</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">id</span> <span style="color:#0000cc">column</span>=<span style="color:#aa1111">"dept_id"</span> <span style="color:#0000cc">property</span>=<span style="color:#aa1111">"deptId"</span><span style="color:#117700">></</span><span style="color:#117700">id</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">result</span> <span style="color:#0000cc">column</span>=<span style="color:#aa1111">"dept_name"</span> <span style="color:#0000cc">property</span>=<span style="color:#aa1111">"deptName"</span><span style="color:#117700">></</span><span style="color:#117700">result</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">resultMap</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">select</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"getDeptByDeptId"</span> <span style="color:#0000cc">resultMap</span>=<span style="color:#aa1111">"getDeptByDeptIdResultMap"</span><span style="color:#117700">></span>
select * from t_dept where dept_id = #{deptId}
<span style="color:#117700"></</span><span style="color:#117700">select</span><span style="color:#117700">></span></span>
这里一对多是指实体类中某个属性是由许多实体类构成的集合,如部门类中员工属性是一个List集合
方式一:使用<collection>标签
<span style="background-color:#f8f8f8"><span style="color:#117700"><</span><span style="color:#117700">resultMap</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"getDeptAndEmpByDeptIdResultMap"</span> <span style="color:#0000cc">type</span>=<span style="color:#aa1111">"Dept"</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">id</span> <span style="color:#0000cc">column</span>=<span style="color:#aa1111">"dept_id"</span> <span style="color:#0000cc">property</span>=<span style="color:#aa1111">"deptId"</span><span style="color:#117700">></</span><span style="color:#117700">id</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">result</span> <span style="color:#0000cc">column</span>=<span style="color:#aa1111">"dept_name"</span> <span style="color:#0000cc">property</span>=<span style="color:#aa1111">"deptName"</span><span style="color:#117700">></</span><span style="color:#117700">result</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">collection</span> <span style="color:#0000cc">property</span>=<span style="color:#aa1111">"emps"</span> <span style="color:#0000cc">ofType</span>=<span style="color:#aa1111">"Emp"</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">id</span> <span style="color:#0000cc">column</span>=<span style="color:#aa1111">"emp_id"</span> <span style="color:#0000cc">property</span>=<span style="color:#aa1111">"empId"</span><span style="color:#117700">></</span><span style="color:#117700">id</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">result</span> <span style="color:#0000cc">column</span>=<span style="color:#aa1111">"emp_name"</span> <span style="color:#0000cc">property</span>=<span style="color:#aa1111">"empName"</span><span style="color:#117700">></</span><span style="color:#117700">result</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">result</span> <span style="color:#0000cc">column</span>=<span style="color:#aa1111">"age"</span> <span style="color:#0000cc">property</span>=<span style="color:#aa1111">"age"</span><span style="color:#117700">></</span><span style="color:#117700">result</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">result</span> <span style="color:#0000cc">column</span>=<span style="color:#aa1111">"gender"</span> <span style="color:#0000cc">property</span>=<span style="color:#aa1111">"gender"</span><span style="color:#117700">></</span><span style="color:#117700">result</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">collection</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">resultMap</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">select</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"getDeptAndEmpByDeptId"</span> <span style="color:#0000cc">resultMap</span>=<span style="color:#aa1111">"getDeptAndEmpByDeptIdResultMap"</span><span style="color:#117700">></span>
select *
from t_dept left join t_emp
on t_dept.dept_id = t_emp.dept_id
where t_dept.dept_id = #{deptId}
<span style="color:#117700"></</span><span style="color:#117700">select</span><span style="color:#117700">></span></span>
方式二:使用分步查询
<span style="background-color:#f8f8f8"><span style="color:#117700"><</span><span style="color:#117700">resultMap</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"getDeptAndEmpByDeptIdResultMap"</span> <span style="color:#0000cc">type</span>=<span style="color:#aa1111">"Dept"</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">id</span> <span style="color:#0000cc">column</span>=<span style="color:#aa1111">"dept_id"</span> <span style="color:#0000cc">property</span>=<span style="color:#aa1111">"deptId"</span><span style="color:#117700">></</span><span style="color:#117700">id</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">result</span> <span style="color:#0000cc">column</span>=<span style="color:#aa1111">"dept_name"</span> <span style="color:#0000cc">property</span>=<span style="color:#aa1111">"deptName"</span><span style="color:#117700">></</span><span style="color:#117700">result</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">collection</span> <span style="color:#0000cc">property</span>=<span style="color:#aa1111">"emps"</span>
<span style="color:#0000cc">select</span>=<span style="color:#aa1111">"com.liaoxiangqian.mapper.EmpMapper.getEmpByDeptId"</span>
<span style="color:#0000cc">column</span>=<span style="color:#aa1111">"dept_id"</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">collection</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">resultMap</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">select</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"getDeptAndEmpByDeptId"</span> <span style="color:#0000cc">resultMap</span>=<span style="color:#aa1111">"getDeptAndEmpByDeptIdResultMap"</span><span style="color:#117700">></span>
select * from t_dept where dept_id = #{deptId}
<span style="color:#117700"></</span><span style="color:#117700">select</span><span style="color:#117700">></span></span>
根据部门id查询员工信息
<span style="background-color:#f8f8f8"><span style="color:#117700"><</span><span style="color:#117700">resultMap</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"getEmpByDeptIdResultMap"</span> <span style="color:#0000cc">type</span>=<span style="color:#aa1111">"Emp"</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">id</span> <span style="color:#0000cc">column</span>=<span style="color:#aa1111">"emp_id"</span> <span style="color:#0000cc">property</span>=<span style="color:#aa1111">"empId"</span><span style="color:#117700">></</span><span style="color:#117700">id</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">result</span> <span style="color:#0000cc">column</span>=<span style="color:#aa1111">"emp_name"</span> <span style="color:#0000cc">property</span>=<span style="color:#aa1111">"empName"</span><span style="color:#117700">></</span><span style="color:#117700">result</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">result</span> <span style="color:#0000cc">column</span>=<span style="color:#aa1111">"age"</span> <span style="color:#0000cc">property</span>=<span style="color:#aa1111">"age"</span><span style="color:#117700">></</span><span style="color:#117700">result</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">result</span> <span style="color:#0000cc">column</span>=<span style="color:#aa1111">"gender"</span> <span style="color:#0000cc">property</span>=<span style="color:#aa1111">"gender"</span><span style="color:#117700">></</span><span style="color:#117700">result</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">resultMap</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">select</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"getEmpByDeptId"</span> <span style="color:#0000cc">resultMap</span>=<span style="color:#aa1111">"getEmpByDeptIdResultMap"</span><span style="color:#117700">></span>
select * from t_emp where dept_id = #{deptId}
<span style="color:#117700"></</span><span style="color:#117700">select</span><span style="color:#117700">></span></span>
分布查询的优点是可以实现延迟加载
延迟加载可以避免在分步查询中执行所有的SQL语句,节省资源,实现按需加载
需要在核心配置文件中添加如下的配置信息
<span style="background-color:#f8f8f8"><span style="color:#117700"><</span><span style="color:#117700">settings</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">setting</span> <span style="color:#0000cc">name</span>=<span style="color:#aa1111">"lazyLoadingEnabled"</span> <span style="color:#0000cc">value</span>=<span style="color:#aa1111">"true"</span><span style="color:#117700">/></span>
<span style="color:#117700"><</span><span style="color:#117700">setting</span> <span style="color:#0000cc">name</span>=<span style="color:#aa1111">"aggressiveLazyLoading"</span> <span style="color:#0000cc">value</span>=<span style="color:#aa1111">"false"</span><span style="color:#117700">/></span>
<span style="color:#117700"></</span><span style="color:#117700">settings</span><span style="color:#117700">></span></span>
lazyLoadingEnabled表示全局的延迟加载开关,true表示所有关联对象都会延迟加载,false表示关闭
aggressiveLazyLoading表示是否加载该对象的所有属性,如果开启则任何方法的调用会加载这个对象的所有属性,如果关闭则是按需加载
由于这个配置是在核心配置文件中设定的,所以所有的分步查询都会实现延迟加载,而如果某个查询不需要延迟加载,可以在collection标签或者association标签中的fetchType属性设置是否使用延迟加载,属性值lazy表示延迟加载,属性值eager表示立即加载
if标签
<span style="background-color:#f8f8f8"><span style="color:#117700"><</span><span style="color:#117700">select</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"getEmpByCondition"</span> <span style="color:#0000cc">resultType</span>=<span style="color:#aa1111">"Emp"</span><span style="color:#117700">></span>
select * from t_emp where
<span style="color:#117700"><</span><span style="color:#117700">if</span> <span style="color:#0000cc">test</span>=<span style="color:#aa1111">"empName != null and empName != ''"</span><span style="color:#117700">></span>
emp_name = #{empName}
<span style="color:#117700"></</span><span style="color:#117700">if</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">if</span> <span style="color:#0000cc">test</span>=<span style="color:#aa1111">"age != null and age != ''"</span><span style="color:#117700">></span>
and age = #{age}
<span style="color:#117700"></</span><span style="color:#117700">if</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">if</span> <span style="color:#0000cc">test</span>=<span style="color:#aa1111">"gender != null and gender != ''"</span><span style="color:#117700">></span>
and gender = #{gender}
<span style="color:#117700"></</span><span style="color:#117700">if</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">select</span><span style="color:#117700">></span></span>
where标签
<span style="background-color:#f8f8f8"><span style="color:#117700"><</span><span style="color:#117700">select</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"getEmpByCondition"</span> <span style="color:#0000cc">resultType</span>=<span style="color:#aa1111">"Emp"</span><span style="color:#117700">></span>
select * from t_emp
<span style="color:#117700"><</span><span style="color:#117700">where</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">if</span> <span style="color:#0000cc">test</span>=<span style="color:#aa1111">"empName != null and empName != ''"</span><span style="color:#117700">></span>
emp_name = #{empName}
<span style="color:#117700"></</span><span style="color:#117700">if</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">if</span> <span style="color:#0000cc">test</span>=<span style="color:#aa1111">"age != null and age != ''"</span><span style="color:#117700">></span>
and age = #{age}
<span style="color:#117700"></</span><span style="color:#117700">if</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">if</span> <span style="color:#0000cc">test</span>=<span style="color:#aa1111">"gender != null and gender != ''"</span><span style="color:#117700">></span>
and gender = #{gender}
<span style="color:#117700"></</span><span style="color:#117700">if</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">where</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">select</span><span style="color:#117700">></span></span>
trim标签
<span style="background-color:#f8f8f8"><span style="color:#117700"><</span><span style="color:#117700">select</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"getEmpByCondition"</span> <span style="color:#0000cc">resultType</span>=<span style="color:#aa1111">"Emp"</span><span style="color:#117700">></span>
select * from t_emp
<span style="color:#117700"><</span><span style="color:#117700">trim</span> <span style="color:#0000cc">prefix</span>=<span style="color:#aa1111">"where"</span> <span style="color:#0000cc">prefixOverrides</span>=<span style="color:#aa1111">"and"</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">if</span> <span style="color:#0000cc">test</span>=<span style="color:#aa1111">"empName != null and empName != ''"</span><span style="color:#117700">></span>
emp_name = #{empName}
<span style="color:#117700"></</span><span style="color:#117700">if</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">if</span> <span style="color:#0000cc">test</span>=<span style="color:#aa1111">"age != null and age != ''"</span><span style="color:#117700">></span>
and age = #{age}
<span style="color:#117700"></</span><span style="color:#117700">if</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">if</span> <span style="color:#0000cc">test</span>=<span style="color:#aa1111">"gender != null and gender != ''"</span><span style="color:#117700">></span>
and gender = #{gender}
<span style="color:#117700"></</span><span style="color:#117700">if</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">trim</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">select</span><span style="color:#117700">></span></span>
choose、when、otherwise标签
<span style="background-color:#f8f8f8"><span style="color:#117700"><</span><span style="color:#117700">select</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"getEmpByCondition"</span> <span style="color:#0000cc">resultType</span>=<span style="color:#aa1111">"Emp"</span><span style="color:#117700">></span>
select * from t_emp where gender = #{gender}
<span style="color:#117700"><</span><span style="color:#117700">choose</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">when</span> <span style="color:#0000cc">test</span>=<span style="color:#aa1111">"empName != null and empName != ''"</span><span style="color:#117700">></span>
and emp_name = #{empName}
<span style="color:#117700"></</span><span style="color:#117700">when</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">when</span> <span style="color:#0000cc">test</span>=<span style="color:#aa1111">"age != null and age != ''"</span><span style="color:#117700">></span>
and age = #{age}
<span style="color:#117700"></</span><span style="color:#117700">when</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">choose</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">select</span><span style="color:#117700">></span></span>
foreach标签
<span style="background-color:#f8f8f8"><span style="color:#117700"><</span><span style="color:#117700">insert</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"addMoreEmp"</span><span style="color:#117700">></span>
insert into t_emp values
<span style="color:#117700"><</span><span style="color:#117700">foreach</span> <span style="color:#0000cc">collection</span>=<span style="color:#aa1111">"list"</span> <span style="color:#0000cc">separator</span>=<span style="color:#aa1111">","</span> <span style="color:#0000cc">item</span>=<span style="color:#aa1111">"emp"</span><span style="color:#117700">></span>
(null,#{emp.empName},#{emp.age},#{emp.gender},null)
<span style="color:#117700"></</span><span style="color:#117700">foreach</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">insert</span><span style="color:#117700">></span></span>
<span style="background-color:#f8f8f8"><span style="color:#117700"><</span><span style="color:#117700">delete</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"deleteMoreEmp"</span><span style="color:#117700">></span>
delete from t_emp where emp_id in
<span style="color:#117700"><</span><span style="color:#117700">foreach</span> <span style="color:#0000cc">collection</span>=<span style="color:#aa1111">"array"</span> <span style="color:#0000cc">item</span>=<span style="color:#aa1111">"empId"</span> <span style="color:#0000cc">separator</span>=<span style="color:#aa1111">","</span> <span style="color:#0000cc">open</span>=<span style="color:#aa1111">"("</span> <span style="color:#0000cc">close</span>=<span style="color:#aa1111">")"</span><span style="color:#117700">></span>
#{empId}
<span style="color:#117700"></</span><span style="color:#117700">foreach</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">delete</span><span style="color:#117700">></span></span>
sql标签
<span style="background-color:#f8f8f8"><span style="color:#117700"><</span><span style="color:#117700">sql</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"item"</span><span style="color:#117700">></span>
emp_id,emp_name,age,gender,dept_id
<span style="color:#117700"></</span><span style="color:#117700">sql</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">select</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"getEmpByEmpId"</span> <span style="color:#0000cc">resultType</span>=<span style="color:#aa1111">"Emp"</span><span style="color:#117700">></span>
select <span style="color:#117700"><</span><span style="color:#117700">include</span> <span style="color:#0000cc">refid</span>=<span style="color:#aa1111">"item"</span><span style="color:#117700">></</span><span style="color:#117700">include</span><span style="color:#117700">></span>
from t_emp
where emp_id = #{empId}
<span style="color:#117700"></</span><span style="color:#117700">select</span><span style="color:#117700">></span></span>
核心配置文件命名建议是mybatis-config.xml,无强制要求
核心配置文件主要用于配置连接数据库的环境以及MyBatis的全局配置信息
核心配置文件存放的位置是maven工程下的src/main/resources目录下
简易结构如下,核心配置文件的标签不止这几个
<span style="background-color:#f8f8f8"><span style="color:#555555"><?xml</span> <span style="color:#555555">version="1.0" encoding="UTF-8" ?></span>
<span style="color:#aa5500"><!--DTD约束--></span>
<span style="color:#555555"><!DOCTYPE configuration</span>
<span style="color:#555555">PUBLIC "-//mybatis.org//DTD Config 3.0//EN"</span>
<span style="color:#555555">"http://mybatis.org/dtd/mybatis-3-config.dtd"></span>
<span style="color:#117700"><</span><span style="color:#117700">configuration</span><span style="color:#117700">></span>
<span style="color:#aa5500"><!--</span>
<span style="color:#aa5500">1.environments配置数据库的环境,环境可以有多个</span>
<span style="color:#aa5500">2.default属性指定使用的环境</span>
<span style="color:#aa5500">--></span>
<span style="color:#117700"><</span><span style="color:#117700">environments</span> <span style="color:#0000cc">default</span>=<span style="color:#aa1111">"development"</span><span style="color:#117700">></span>
<span style="color:#aa5500"><!--</span>
<span style="color:#aa5500">1.environment配置具体某个数据库的环境</span>
<span style="color:#aa5500">2.id属性唯一标识这个环境</span>
<span style="color:#aa5500">--></span>
<span style="color:#117700"><</span><span style="color:#117700">environment</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"development"</span><span style="color:#117700">></span>
<span style="color:#aa5500"><!--</span>
<span style="color:#aa5500">1.transactionManager设置事务管理方式</span>
<span style="color:#aa5500">2.type属性取值有“JDBC|MANAGED”</span>
<span style="color:#aa5500">3.JDBC指当前环境中使用的是JDBC中原生的事务管理方式,事务的提交或回滚需要手动处理</span>
<span style="color:#aa5500">4.MANAGED指被管理,例如Spring中</span>
<span style="color:#aa5500">--></span>
<span style="color:#117700"><</span><span style="color:#117700">transactionManager</span> <span style="color:#0000cc">type</span>=<span style="color:#aa1111">"JDBC"</span><span style="color:#117700">/></span>
<span style="color:#aa5500"><!--</span>
<span style="color:#aa5500">1.dataSource配置数据源</span>
<span style="color:#aa5500">2.取值有"POOLED|UNPOOLED|JNDI"</span>
<span style="color:#aa5500">3.POOLED表示使用数据库连接池缓存数据库连接</span>
<span style="color:#aa5500">4.UNPOOLED:表示不使用数据库连接池</span>
<span style="color:#aa5500">5.JNDI表示使用上下文中的数据源</span>
<span style="color:#aa5500">--></span>
<span style="color:#117700"><</span><span style="color:#117700">dataSource</span> <span style="color:#0000cc">type</span>=<span style="color:#aa1111">"POOLED"</span><span style="color:#117700">></span>
<span style="color:#aa5500"><!--设置链接数据库的驱动--></span>
<span style="color:#117700"><</span><span style="color:#117700">property</span> <span style="color:#0000cc">name</span>=<span style="color:#aa1111">"driver"</span> <span style="color:#0000cc">value</span>=<span style="color:#aa1111">"com.mysql.jdbc.Driver"</span><span style="color:#117700">/></span>
<span style="color:#aa5500"><!--设置连接数据库的地址--></span>
<span style="color:#117700"><</span><span style="color:#117700">property</span> <span style="color:#0000cc">name</span>=<span style="color:#aa1111">"url"</span> <span style="color:#0000cc">value</span>=<span style="color:#aa1111">"jdbc:mysql://localhost:3306/ssm"</span><span style="color:#117700">/></span>
<span style="color:#aa5500"><!--设置连接数据库的用户名--></span>
<span style="color:#117700"><</span><span style="color:#117700">property</span> <span style="color:#0000cc">name</span>=<span style="color:#aa1111">"username"</span> <span style="color:#0000cc">value</span>=<span style="color:#aa1111">"root"</span><span style="color:#117700">/></span>
<span style="color:#aa5500"><!--设置连接数据库的密码--></span>
<span style="color:#117700"><</span><span style="color:#117700">property</span> <span style="color:#0000cc">name</span>=<span style="color:#aa1111">"password"</span> <span style="color:#0000cc">value</span>=<span style="color:#aa1111">"lxq"</span><span style="color:#117700">/></span>
<span style="color:#117700"></</span><span style="color:#117700">dataSource</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">environment</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">environments</span><span style="color:#117700">></span>
<span style="color:#aa5500"><!--mappers用于引入映射的配置文件--></span>
<span style="color:#117700"><</span><span style="color:#117700">mappers</span><span style="color:#117700">></span>
<span style="color:#aa5500"><!--mapper用于指定某个映射文件,resource属性指定文件路径--></span>
<span style="color:#117700"><</span><span style="color:#117700">mapper</span> <span style="color:#0000cc">resource</span>=<span style="color:#aa1111">"mappers/UserMapper.xml"</span><span style="color:#117700">/></span>
<span style="color:#117700"></</span><span style="color:#117700">mappers</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">configuration</span><span style="color:#117700">></span></span>
<properties>标签
<span style="background-color:#f8f8f8"><properties resource="jdbc.properties" /></span>
<typeAliases>标签
<span style="background-color:#f8f8f8"><typeAliases>
<typeAlias type="com.lxq.pojo.User" alias="User"></typeAlias>
<package name="com.lxq.pojo"></package>
</typeAliases></span>
<property>标签
<span style="background-color:#f8f8f8"><property name="driver" value="com.mysql.jdbc.Driver" /></span>
<span style="background-color:#f8f8f8"><property name="driver" value="${jdbc.driver}" /></span>
其中配置文件的内容是
<span style="background-color:#f8f8f8">jdbc.driver=com.mysql.jdbc.Driver</span>
注意:这里使用jdbc.driver来给键命名是因为核心配置文件中可能会引入其他的配置文件,如果使用driver来命名键的话有可能会跟其他配置文件中的键同名而产生冲突
<mappers>标签
<span style="background-color:#f8f8f8"><mappers>
<mapper resource="mappers/UserMapper.xml" />
<package name="com.lxq.mapper" />
</mappers></span>
注意:使用包的形式引入映射文件需要满足两个条件,1.mapper接口所在的包和映射文件所在的包要一致;2.mapper接口名和映射文件名要相同
InputStream getResourceAsStream(String filepath)
,注意这是一个静态方法
SqlSessionFactory build(InputStream is)
,该方法通过一个输入流返回了SqlSessionFactory对象
SqlSession openSession()
和SqlSession openSession(boolean autoCommit)
,这两个方法都用于获取SqlSession对象,如果使用有参数的可以指定是否自动提交事务,没有指定参数的默认是不自动提交事务
SqlSessionFactoryBuilder
这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。因此 SqlSessionFactoryBuilder 实例的最佳范围是方法范围(也就是局部方法变量)。你可以重用 SqlSessionFactoryBuilder 来创建多个 SqlSessionFactory 实例,但是最好还是不要让其一直存在以保证所有的 XML 解析资源开放给更重要的事情
SqlSessionFactory
SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由对它进行清除或重建。使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次,多次重建 SqlSessionFactory 被视为一种代码“坏味道(bad smell)”。因此 SqlSessionFactory 的最佳范围是应用范围。有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式
SqlSession
每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的范围是请求或方法范围。绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。也绝不能将 SqlSession 实例的引用放在任何类型的管理范围中,比如 Serlvet 架构中的 HttpSession。如果你现在正在使用一种 Web 框架,要考虑 SqlSession 放在一个和 HTTP 请求对象相似的范围中。换句话说,每次收到的 HTTP 请求,就可以打开一个 SqlSession,返回一个响应,就关闭它。这个关闭操作是很重要的,你应该把这个关闭操作放到 finally 块中以确保每次都能执行关闭
工具类
<span style="background-color:#f8f8f8">public class SqlSessionUtil {
private static SqlSessionFactory sqlSessionFactory;
static{
try {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession(true);
}
}
</span>
clearCache()
方法