1.单表增删改查:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mybatis.dao.EmployeeMapper">
<!--
namespace:名称空间;指定为接口的全类名
id:唯一标识,写成接口的方法
resultType:返回值类型
#{id}:从传递过来的参数中取出id值
-->
<!--
public Employee getEmpById(Integer id);
-->
<select id="getEmpById" resultType="mybatis.bean.Employee">
select id,last_name ,email,gender from tbl_employee where id = #{id}
</select>
<!--
//查询:返回的是一个集合
public List<Employee> getEmps(Integer id);
-->
<select id="getEmps" resultType="mybatis.bean.Employee">
select id,last_name ,email,gender from tbl_employee where id > #{id}
</select>
<!--
//查找:根据员工名和id查询员工
public Employee getEmpByIdAndName(Integer id,String last_name);
-->
<select id="getEmpByIdAndName" resultType="mybatis.bean.Employee">
select id,last_name ,email,gender from tbl_employee where id = #{id} AND last_name=#{last_name}
</select>
<!--
//查找:根据map查询员工
public Employee getEmpByMap(Map<String,Object> map);
-->
<select id="getEmpByMap" resultType="mybatis.bean.Employee">
select id,last_name ,email,gender from tbl_employee where id = #{id} AND last_name=#{last_name}
</select>
<!--
public void addEmp(Employee employee);
parameterType:可以省略
-->
<!--
mysql支持自增主键,自增主键值的获取,mybatis也是利用statement.getGenreatedKeys()
useGeneratedKeys="true":使用自增主键获取主键策略
keyProperty:指定对应的主键属性,也就是mybatis获取到主键值以后,将这个值封装给JavaBean哪个属性
-->
<insert id="addEmp" parameterType="mybatis.bean.Employee"
useGeneratedKeys="true" keyProperty="id">
INSERT INTO tbl_employee(last_name,email,gender)VALUE (#{lastName},#{email},#{gender})
</insert>
<!--
//修改:根据传入的员工的id修改指定id员工的信息
public void updateEmp(Employee employee);
-->
<update id="updateEmp" parameterType="mybatis.bean.Employee">
UPDATE tbl_employee
SET last_name =#{lastName},email = #{email},gender = #{gender}
WHERE id = #{id}
</update>
<!--
//删除:通过id删除指定员工
public void deleteEmpById(Integer id);
-->
<delete id="deleteEmpById">
DELETE FROM tbl_employee WHERE id = #{id}
</delete>
<!--
//返回一条记录的map;key就是列名,值就是对应的值
public Map<String,Object> getEmpMap(Integer id);
-->
<select id="getEmpMap" resultType="mybatis.bean.Employee">
select id,last_name ,email,gender from tbl_employee where id = #{id}
</select>
<!--
//多条记录封装成map:Map<Integer,Employee> key是这条的记录的主键 value是这条记录
public Map<Integer,Employee> getEmpsMap(Integer id);
-->
<select id="getEmpsMap" resultType="map">
select id,last_name ,email,gender from tbl_employee where id > #{id}
</select>
</mapper>
<!--
mybatis参数处理:
单个参数:mybatis不会做特殊处理
#{参数名}:取出参数值
多个参数:mybatis会做特殊处理
多个参数会被封装成map
key:param1....paramN,或者参数的索引也可以
value:传入的值
#{}就是从map中获取指定的key的值
命名参数:明确指定封装参数map的key:@Param("id")
多个参数会被封装成一个map,
key:使用@Param注解指定的值
value:传入的值
#{指定的key}获取指定的key的值
POJO:
如果多个参数正好是我们业务逻辑的数据模型,我们就可以直接传入pojo
#{属性名}:取出传入的pojo的属性值
map
如果多个参数不是业务模型的数据,没有对应的pojo,我们也可以传入map(不经常使用)
#{key}:取出map中对应的值
TO
如果多个参数不是业务模型的数据,没有对应的pojo,但是我们经常使用,我们也可以编写TO
参数值的获取:
#{}:可以获取map中或者pojo对象属性的值(预编译的形式中的占位符)
${}:可以获取map中或者pojo对象属性的值(直接拼装在sql中)
#{}:更丰富的用法:
规定参数的一些规则
javaType、jdbcType、mode(存储过程)、numericScale(留几位小数)、
resultMap、typeHandler、jdbcTypeName、expression
jdbcType通常需要在某种特定的条件下被设置:
在我们数据为null的时候,有些数据库可能不能识别mybatis对null的默认处理
-->
2.多表查询一对一(一个员工对应一个部门):
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mybatis.dao.EmployeeMapperPlus">
<!--
//根据员工id查询员工信息
public Employee getEmpById(Integer id);
-->
<!--
resultMap属性:
自定义结果集映射规则
type:自定义规则的java类型
id:唯一id方便引用
-->
<resultMap type="mybatis.bean.Employee" id="MyEmp">
<!--指定主键的封装规则
column:指定哪一列
property:指定对应的javaBean属性
-->
<id column="id" property="id"></id>
<!--指定非主键的封装规则
column:指定哪一列
property:指定对应的javaBean属性
-->
<result column="last_name" property="lastName"></result>
<!--其他不指定的列会自动封装,但是建议都写上-->
<result column="email" property="email"></result>
<result column="gender" property="gender"></result>
</resultMap>
<select id="getEmpById" resultMap="MyEmp">
select id,last_name ,email,gender from tbl_employee where id = #{id}
</select>
<!--
场景一:
查询Employee的同时查询员工对应的部门
Employee==>Dempartment
一个员工有与之对应的部门
//根据员工id查询员工信息和员工所在的部门
public Employee getEmpAndDept(Integer id);
-->
<!--联合查询:级联属性封装数据-->
<resultMap type="mybatis.bean.Employee" id="MyEmpPlus">
<id column="id" property="id"></id>
<result column="last_name" property="lastName"></result>
<result column="email" property="email"></result>
<result column="gender" property="gender"></result>
<result column="did" property="dempartment.id"></result>
<result column="demp_name" property="dempartment.name"></result>
</resultMap>
<!--联合查询:方式二:使用association-->
<resultMap type="mybatis.bean.Employee" id="MyEmpPlusX">
<id column="id" property="id"></id>
<result column="last_name" property="lastName"></result>
<result column="email" property="email"></result>
<result column="gender" property="gender"></result>
<!--association 可以指定javabean的对象
javaType:指定这个属性的类型
-->
<association property="dempartment" javaType="mybatis.bean.Dempartment">
<result column="id" property="id"></result>
<result column="demp_name" property="name"></result>
</association>
</resultMap>
<select id="getEmpAndDept" resultMap="MyEmpPlusX">
select e.id id,e.last_name last_name,e.email email,e.gender gender,e.demp_id demp_id, d.id did,d.dept_name demp_name from tbl_employee e,tbl_dept d
where e.demp_id=d.id AND e.id = #{id}
</select>
<!--
使用association进行分步查询:
先查询出员工信息,在根据员工信息里的demp_id再进行一次部门信息查询
//分布查询员工信息和员工部门信息
public Employee getEmpByIdStep(Integer id);
//按照部门号查询部门信息
public Dempartment getDeptById(Integer id);
-->
<!--
使用association进行分步查询:
1.
-->
<resultMap type="mybatis.bean.Employee" id="MyEmpByStep">
<id column="id" property="id"></id>
<result column="last_name" property="lastName"></result>
<result column="email" property="email"></result>
<result column="gender" property="gender"></result>
<!--
association定义关联对象的封装规则
select:表名当前属性是调用select指定的方法查出的结果
column:指定将哪一列的值传给这个方法
-->
<association property="dempartment"
select="mybatis.dao.DepartmentMapper.getDeptById"
column="demp_id">
</association>
</resultMap>
<select id="getEmpByIdStep" resultMap="MyEmpByStep">
select id,last_name ,email,gender,demp_id from tbl_employee where id = #{id}
</select>
<!--
association可以使用延迟加载
未设置之前,每次查询Employee对象的时候都将一起查询出来
设置之后:部门信息在我们使用的时候再去查询
如何实现:在全局xml文件中加上两个设置:
<setting name="lazyLoadingEnabled" value="true"></setting>
<setting name="aggressiveLazyLoading" value="false"></setting>
-->
<!--
通过部门id查询员工列表
//通过部门号查询员工信息
public List<Employee> getEmpBydept_id(Integer id);
-->
<select id="getEmpBydept_id" resultType="mybatis.bean.Employee">
select id,last_name lastName ,email,gender from tbl_employee where demp_id = #{id}
</select>
</mapper>
3.多表查询一对多(一个部门对应多个员工):
?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mybatis.dao.DepartmentMapper">
<!--
//按照部门号查询部门信息
public Dempartment getDeptById(Integer id);
-->
<select id="getDeptById" resultType="mybatis.bean.Dempartment">
select id,dept_name name from tbl_dept where id = #{id}
</select>
<!--
场景二:
查询部门的时候将部门对应的所有员工信息也查出来
-->
<!--
//按照部门号查询部门信息,并查询该部门的所有员工信息
public Dempartment getDeptByIdPlus(Integer id);
-->
<resultMap type="mybatis.bean.Dempartment" id="MyDept">
<id column="did" property="id"></id>
<result column="name" property="name"></result>
<!--collection标签定义关联集合类型的属性封装规则-->
<collection property="emps" ofType="mybatis.bean.Employee">
<id column="id" property="id"></id>
<result column="lastName" property="lastName"></result>
<result column="email" property="email"></result>
<result column="gender" property="gender"></result>
</collection>
</resultMap>
<select id="getDeptByIdPlus" resultMap="MyDept">
select d.id did,d.dept_name name ,e.id id ,e.last_name lastName,e.gender gender,e.email email,e.demp_id demp_id
FROM tbl_dept d
LEFT JOIN tbl_employee e
ON d.id = demp_id
WHERE d.id = #{id}
</select>
<!--
分步查询实现查询部门信息时查询所有该部门的员工信息
//利用分步查询按照部门号查询部门信息,并查询该部门的所有员工信息
public Dempartment getDeptByIdPlusStep(Integer id);
-->
<resultMap id="MyDeptPlus" type="mybatis.bean.Dempartment">
<id column="did" property="id"></id>
<result column="name" property="name"></result>
<collection property="emps" ofType="mybatis.bean.Employee"
select="mybatis.dao.EmployeeMapperPlus.getEmpBydept_id"
column="did">
</collection>
</resultMap>
<select id="getDeptByIdPlusStep" resultMap="MyDeptPlus">
SELECT id did, dept_name name FROM tbl_dept WHERE id =#{id}
</select>
</mapper>