Mybatis使用过程:
- 1.创建sql映射文件
- 2.将sql映射文件注册到全局配置文件
- 3.根据全局配置文件得到SqlSessionFactory,使用SqlSession工厂获取到SqlSession对象来执行crud,使用sql id来告诉mybatis执行那个sql
使用mapper接口,推荐使用接口式编程。mapper是个代理对象。获取接口的实现类对象,会为接口自动创建一个代理对象,代理对象执行crud。
mapper = sqlSession.getMapper(xxxMapper.class);
mapper.getEmpById();
mybatis配置文件可以使用properties标签来引入外部properties配置文件的内容,resource:引入类路径下的资源、URL:引入网络路径或磁盘路径下的资源
数据库字段名和JavaBean字段名大小写不匹配时可以设置别名或者开启驼峰命名
<typeAliases>
//typeAlias为某个Javabean的全类名起别名
//type指定要起别名的类型全类名,默认别名是类名小写
//alias可指定新的名字
<typeAlias type="com.mybatis.bean.User" alias="user"/>
//package为某个包下的多个Javabean起别名,默认类名小写
//也可以使用@Alias注解为某个类型指定别名
<package name="com.mybatis.bean"/>
</typeAliases>
Mybatis 多条记录封装成一个map时,可以使用resultMap:
- @MapKey(“id”)加在bean主键上指定封装map时使用哪个属性作为map的key
- 使用resultMap标签自定义某个javabean的封装规则
<resultMap type="com.mybatis.bean.Employee" id="myEmp">
//指定主键列的对应规则
//column="id":指定哪一列是主键列
//property="id":指定user的哪个属性封装id这一列数据
<id property="id" column="id"/>
//普通列
<result property="name" column="last_name"/>
<result property="email" column="email"/>
<result property="gender" column="gender"/>
//支持级联属性封装
<result property="dept.departmentName" column="dept_name"/>
</resultMap>
//查询时使用自己定义的封装规则
<select id="getEmpById" resultMap="myEmp">
</select>
- 也可以使用association定义单个对象的封装规则
<resultMap type="com.mybatis.bean.Employee" id="myEmp">
<id property="id" column="id"/>
<result property="name" column="uName"/>
//property指定哪个属性是联合的对象
//javaType指定这个属性对象的类型
<association property="dept" javaType="com.mybatis.bean.Department">
<id column="did" property="id"/>
<result column="dept_name" property="departmentName"/>
</association>
</resultMap>
- association进行分布查询
1.先按照员工id查询员工信息
2.根据查询员工信息中的d_id值去部门表查出部门信息
3.部门设置到员工中
<resultMap type="com.mybatis.bean.Employee" id="myEmpByStep">
<id column="id" property="id"/>
<result column="last_name" property="lastName"/>
//association定义关联对象的封装规则
//select表明当前属性是调用select指定的方法查出的结果
//column指定将哪一列的值传给这个方法
//流程:使用select指定的方法(传入column指定的这列参数的值)查出对象,并封装给property指定的属性
<association property="dept"
select="com.mybatis.dao.DepartmentMapper.getDeptById"
column="d_id">
</association>
</resultMap>
<select id="getEmpByIdStep" resultMap="MyEmpByStep">
select * from tbl_employee where id = #{id}
</select>
可以使用延迟加载:
Employee包含dept,我们每次查询Employee对象的时候,都将一起查询出来(执行两条sql语句),要想部门信息在我们使用的时候再去查询,则在mybatis配置文件加两个配置
<setting>
//开启懒加载模式,只有在用到的时候才去加载
<setting name="lazyLoadingEnabled" value="true"/>
//将自动全部加载关闭
<setting name="aggressiveLazyLoading" value="false"/>
</setting>
collection定义关联集合类型的属性的封装规则
<resultMap type="com.mybatis.bean.Department" id="myDept">
<id column="did" property="id"/>
<result column="dept_name" property="departmentName"/>
//ofType指定集合里面元素的类型
<collection property="emps" ofType="com.mybatis.bean.Employee">
//定义这个集合中元素的封装规则
<id column="eid" property="id"/>
<result column="last_name" property="lastName">
<result column="email" property="email"/>
</collection>
</resultMap>
//扩展:分布查询将多列的值传递过去:
将多列的值封装map传递:
column="{key1=column1,key2=column2}"
fetchType="lazy":表示使用懒加载
eager:立即加载
<collection property="emps"
select="com.mybatis.dao.EmployeeMapper.getEmpsByDeptId"
column="{deptId=id}" fetchType="lazy">
</collection>