----------动态sql-foreach-mysql下foreach 批量插入的两种方式 -------------
<!--批量保存-->
<!--MySql下批量保存,可以foreach遍历 mysql支持 VALUES (),(),()语法-->
<!-- public void addEmps(@Param("emps") List<Employee> emps);-->
<!-- <insert id="addEmps">
INSERT INTO tbl_employee(lastname,email,gender,d_id)
VALUES
<foreach collection="emps" item="emp" separator=",">
(#{emp.lastName},#{emp.email},#{emp.gender},#{emp.dept.id})
</foreach>
</insert>-->
<!--需要数据库的连接属性allowMultiQueries=true 的支持
这种分号分隔的多个sql可以用于其他的批量操作(批量删除,批量修改)-->
<insert id="addEmps">
<foreach collection="emps" item="emp" separator=";">
INSERT INTO tbl_employee(lastname,email,gender,d_id)
VALUES (#{emp.lastName},#{emp.email},#{emp.gender},#{emp.dept.id})
</foreach>
</insert>
/*测试批量插入*/
@Test
public void testBatchSave() throws IOException {
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
SqlSession openSession = sqlSessionFactory.openSession();
try{
EmployeeMapperDynamicSql mapper = openSession.getMapper(EmployeeMapperDynamicSql.class);
List<Employee> emps=new ArrayList<>();
emps.add(new Employee(null,"smith","smith@123","1",new Department(1)));
emps.add(new Employee(null,"allen","allen@123","1",new Department(1)));
mapper.addEmps(emps);
openSession.commit();
}finally {
openSession.close();
}
}
----------------- 动态sql-内置参数–Parameter&_databaseId -------------------
<!--两个内置参数
不只是方法传递过来的参数可以用来判断,取值....
myBatis默认还有两个内置参数
_parameter:代表整个参数
单个参数:_parameter就是这个参数
多个参数:参数会被封装为一个map,_parameter就是代表这个map
_databaseId:如果配置了DataBaseIdProvider标签,
_databaseId就是代表当前数据库的别名。
-->
<!--public List<Employee> getEmpsTestInnerParameter(Employee employee);-->
<select id="getEmpsTestInnerParameter" resultType="employee">
<if test="_databaseId=='mysql'">
select * from tbl_employee
<if test="_parameter!=null">
where lastname=#{_parameter.lastName}
</if>
</if>
<if test="_databaseId=='sqlserver'">
select * from tbl_employee
</if>
</select>
/*测试内置参数*/
@Test
public void testInnerParam() throws IOException {
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
SqlSession openSession = sqlSessionFactory.openSession();
try {
EmployeeMapperDynamicSql mapper = openSession.getMapper(EmployeeMapperDynamicSql.class);
List<Employee> list = mapper.getEmpsTestInnerParameter(null);
for (Employee employee : list) {
System.out.println(employee);
}
}finally {
openSession.close();
}
}
---------------------------- 动态sql-bind-绑定-----------------------------------------
<select id="getEmpsTestInnerParameter" resultType="employee">
<!--bind:可以将OGNL表达式的值绑定到一个变量当中,方便后来引用这个变量-->
<bind name="_lastName" value="'%'+lastName+'%'"/>
<if test="_databaseId=='mysql'">
select * from tbl_employee
<if test="_parameter!=null">
where lastname like #{_lastName}
<!-- where lastname like '%${_parameter.lastName}%'-->
<!-- where lastname like #{_parameter.lastName}-->
</if>
</if>
<if test="_databaseId=='sqlserver'">
select * from tbl_employee
</if>
</select>
------------------------动态sql-sql-抽取可重用的sql------------------------------
<!--抽取可重用的sql片段,方便后面引用
1.经常将要查询的列的列名或者插入用的列名抽取出来,方便引用
2.include 来引用已经抽取的标签
3.include 还可以自定义一些 property,sql标签内部就能使用自定义的属性
取值的正确方式:使用${prop},不能使用#{}-->
<sql id="insertColumn">
<if test="_databaseId=='mysql'">
lastname,email,gender,d_id
</if>
<if test="_databaseId=='sqlserver'">
</if>
</sql>
<insert id="addEmps">
<foreach collection="emps" item="emp" separator=";">
INSERT INTO tbl_employee(
<!--引用外部定义的SQL-->
<include refid="insertColumn"></include>
)
VALUES (#{emp.lastName},#{emp.email},#{emp.gender},#{emp.dept.id})
</foreach>
</insert>
------------------------------------缓存-缓存介绍-缓存机制--------------------------
提高系统的运行速度。
一级缓存和二级缓存
1.默认情况下,只有一级缓存(SqlSession级别的缓存,也称为本地缓存)
2.二级缓存需要手动开启和配置,它是基于namespace级别的缓存
3.为了提供扩展性,MyBatis定义了缓存接口Cache。我们可以通过Cache定义二级缓存。