尚硅谷mybatis实战
mybatis-动态sql
1、if的使用(&OGNL):2、choose分支选择:3、set 与if结合的动态更新4、foreach
(1)foreach遍历集合(2)mysql下foreach批量插入的两种方式 5、内置参数:_parameter&_databaseId6、_bind_绑定7、sql标签_抽取可重用的sql片段
• if:判断
• choose (when, otherwise):分支选择;
• trim 字符串截取(where(封装查询条件), set(封装修改条件))
• foreach 遍历集合**
id=#{id} and last_name like #{lastName} and gender=#{gender}
在if查询时,如果某些条件没带可能sql拼装会有问题
(例如出现select * from tbl_employee where and last_name=?这种问题)
解决方案:
(1)给where后加入 1=1永真判断。
select * from tbl_employee
where 1=1
id=#{id}
(2)mybatis使用where标签(封装查询条件)来将所有的查询条件包括在内。
select * from tbl_employee
id=#{id}
where只会去掉第一个多出来的and或者or.拼接后后面可能也会多出and或者or,可以使用trim.
(3)trim自定字符串截取
prefix="" (前缀:trim标签体中是整个字符串拼接后的结果。
prefix给拼串后的整个字符串加一个前缀)
prefixOverrides=" " (前缀覆盖:去掉整个字符串前面多余的字符)
suffix=" " (后缀:给拼串后的整个字符串加一个后缀)
suffixOverrides=" " (后缀覆盖:去掉整个字符串后面多余的字符)
2、choose分支选择:
choose (when,otherwise) :分支选择;带了break的swtich-case,如果带了id就用id查,如果带了Name就用Name查;只会进入其中一个。
select * from tbl_employee
id=#{id}
last_name like #{lastName}
gender =0
3、set 与if结合的动态更新
set(封装修改条件)
4、foreach
(1)foreach遍历集合
(2)mysql下foreach批量插入的两种方式
批量保存
1、
INSERT into tbl_employee(last_name,email,gender,d_id)
VALUES
(#{emp.lastName},#{emp.email},#{emp.gender},#{emp.dept.id})
List emps=new ArrayList<>();
emps.add(new Employee(null,"smith","smith@guigu.com","1",new Department(1)));
emps.add(new Employee(null,"allen","allen@guigu.com","0",new Department(1)));
mapper.addEmps(emps);
openSession.commit();
2、
insert into tbl_employee(last_name,email,gender,d_id)
values (#{emp.lastName},#{emp.email},#{emp.gender},#{emp.dept.id})
5、内置参数:_parameter&_databaseId
不只是方法传递过来的参数可以被用来判断,取值…
mybatis默认还有两个内置参数:
_parameter:代表整个参数
单个参数:_parameter就是这个参数
多个参数:参数会被封装成一个map;_parameter就代表这个map
_databaseId:如果配置了databaseIdProvider标签。
_databaseId就是代表当前数据库的别名(mysql)。
6、_bind_绑定
在模糊查询中可以使用bind标签拼接OGNL表达式,但在实际使用中一般在传参时便拼接好了字符串
EmployeeMapperDynamicSQL mapper = openSession.getMapper(EmployeeMapperDynamicSQL.class);
Employee employee2=new Employee();
employee2.setLastName("%e%");
List list = mapper.getEmpsTestInnerParameter(employee2);
for(Employee employee : list)
{
System.out.println(employee);
}
7、sql标签_抽取可重用的sql片段
last_name,email,gender,d_id
INSERT into tbl_employee(
)
VALUES
(#{emp.lastName},#{emp.email},#{emp.gender},#{emp.dept.id})
DEBUG 02-08 16:14:46,861 ==> Preparing: INSERT into tbl_employee( last_name,email,gender,d_id,*** ) VALUES (?,?,?,?) , (?,?,?,?)



