Java小白的数据库爱情(六)mybatis typeAliases标签
typeAliases标签
使用方法
<typeAliases>
<!--<typeAlias type="com.shsxt.pojo.User" alias="u"/> -->
<!-- <typeAlias type="com.xxxx.pojo.Emp"/>-->
<!--如果 alias="emp"属性省略,默认别名为类名,不区分大小写-->
<package name="com.xxxx.pojo"/>
<!--配置整个包下的所有类型别名默认为类名,不区分大小写-->
</typeAliases>
parameterType入参类型
Map
<select resultType="emp" parameterType="map" id="queryEmpBySalDeptno">
select * from emp where sal>#{sal} and deptno = #{deptno}
<!--{佔位符名字} 匹配參數集合中key的名字-->
</select>
//Map: 根据薪资和部门编号查询员工信息
Map<String,Object> map = new HashMap<>();
map.put("sal",1500);
map.put("deptno",30);
list = session.selectList("com.xxxx.mappers.EmpMapper.queryEmpBySalDeptno",map);
list.forEach(System.out::println);
数组|List
<!--數組|List : 根据多个就员工编号查询员工信息-->
<select resultType="emp" id="queryEmpByArray">
select * from emp where empno in
<!--foreach遍历参数list或者数组 collection="array" 参数类型 array | listitem : 指代每次循环从集合或者数组中拿出的数据(变量名)separator: 每个数据之间额分隔符 open: 所有遍历输出的的数据之前以什么内容开始 close : 所有遍历输出的的数最后以什么结束 -->
<foreach close=")" open="(" separator="," item="item" collection="array">#{item} </foreach>
</select>
String[] arr={"hahaha","zhangsan","lisi"};
List<User> list=session.selectList("com.shsxt.mapper.EmpMapper.queryEmpByArray", arr); list.forEach(System.out::println);
工具类的封装
public class SessionUtils {
//回话工厂 单例
private static SqlSessionFactory factory = null;
static{
try {
factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
} catch (IOException e) {
e.printStackTrace();
}
}
//获取回话
public static SqlSession getSession(){
SqlSession session = null;
if(factory!=null){
session = factory.openSession(false); //参数true->自动提交 默认为false手动提交
}
return session;
}
}
//手动事务的提交与回滚
if(rows>0){
session.commit();
}else{
session.rollback();
}
resultType结果类型
Map
List
对用 多表联查非常实用,没查出的一条数据,返回一个map集合,都作为位集合中的键值对,方便操作
<!--Map: 返回值的结果的字段名 当做key,值当做value,一条数据对应一个Map集合,多条数请返回List<Map>-->
<select resultType="map" parameterType="_int" id="queryMapById">select empno,ename,sal,comm,deptno from emp where empno = #{id} </select>
<!--List<Map> 根据员工名查询员工信息-->
<select resultType="map" id="queryMapByName">
select empno,ename,sal,comm,deptno from emp where ename in (
<foreach separator="," item="item" collection="list">
#{item}
</foreach>
)
</select>
//map
Map<String,Object> map = session.selectOne("com.xxxx.mappers.EmpMapper3.queryMapById",7369);
System.out.println(map);
//List<Map>
List<Map<String,Object>> list2 = session.selectList("com.xxxx.mappers.EmpMapper3.queryMapByName", Arrays.asList("SMITH","feng"));
list2.forEach(System.out::println);
接口绑定方案
创建接口 抽象方法对应sql语句的输入与输出
- xml文件名要与接口名保持一致
- namespace属性值 必须与接口的权限定名
- id属性必须与抽象方法名保持一致
- 返回值类型和参数类型与方法的返回值和参数保持一致
注意:如果抽象方法的参数列表只有一个参数,sql语句的占位符的名字可以任意定义
抽象方法的参数列表有多个参数,sql语句的占位符的名字[arg1, arg0, param1, param2]
//1.获取连接
SqlSession session = SessionUtils.getSession();
//2.获取mybatis提供的接口的实现类对象
//接口多态
DeptMapper mapper = session.getMapper(DeptMapper.class);
List<Dept> list = mapper.queryDeptById(10,30);
list.stream().forEach(System.out::println);
在核心配置文件中扫描接口
-
扫描单个接口,可以使用mapper标签的class属性
-
扫描多个接口,可以简化配置,使用package标签,表示扫描对应包下的 所有接口
<!-- mapper 配置扫描接口 -->
<mappers>
<package name="com.shsxt.mapper"/>
</mappers>
**使用:**在使用时,通过SqlSession的getMapper() 方法,返回接口代理对象,从而调 用以实现的抽象方法
SqlSession session = SessionUtils.getSession();
//2.获取mybatis提供的接口的实现类对象
//接口多态
EmpMapper mapper = session.getMapper(EmpMapper.class);
测试接口CRUD 多参数匹配参数名字问题
//@Param(“deptno1”) 注解: 解决sql中占位符的名字与方法参数不同名问题
List<Dept> queryDeptById(@Param("deptno1") int deptno1, @Param("deptno2") int deptno2);
<select id="queryDeptById" resultType="dept">
select * from dept where deptno in (#{deptno1},#{deptno2})
</select>
批量CRUD
DELETE
<!--批量删除-->
<delete id="deleteDeptByIdSome">
delete from dept where deptno in
<foreach collection="list" item="item" open="(" close=")" separator=",">
#{item}
</foreach>
</delete>
UPDATE
<!--批量修改-->
<update id="updateDeptByIdSome">
<foreach collection="list" item="item" open="begin" close=";end;" separator=";">
update dept set loc = #{item.loc} where deptno = #{item.deptno}
</foreach>
</update>
INSERT
<!--批量插入-->
<!--
insert into dept select 1, 'a', 'b' from dual union select 2, 'c', 'd' from dual
-->
<insert id="insertDept">
insert into dept
<foreach collection="list" item="item" separator="union">
select #{item.deptno}, #{item.dname}, #{item.loc} from dual
</foreach>
</insert>