映射文件指导着MyBatis如何进行数据库增删改查,有着非常重要的意义;
cache –命名空间的二级缓存配置cache-ref – 其他命名空间缓存配置的引用。resultMap – 自定义结果集映射parameterMap – 已废弃!老式风格的参数映射sql –抽取可重用语句块。insert – 映射插入语句update– 映射更新语句delete– 映射删除语句select – 映射查询语句还可以 将insert插入的数据的主键返回到User对象中
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer"> select last_insert_id() </selectKey>mysql的uuid(),实现非自增主键的返回
<selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String"> select uuid() </selectKey> insert into t_user (id,username,birthday,sex,address) values(#{id},#{username},#{birthday},#{sex},#{address}) 而对于不支持自增型主键的数据库(例如Oracle),则可以使用 selectKey 子元素:selectKey 元素将会首先运行,id 会`被设置·,然后插入语句会被调用 <insert id="addEmployee" databaseId="oracle"> <selectKey keyProperty="id" order="BEFORE" resultType="Integer"> select EMPLOYEE_SEQ.nextval from dual </selectKey> <!-- 插入的主键是从序列中获取的 --> insert into employee(id,last_name,age,email) values(#{id},#{lastName},#{age},#{email}) </insert>mybatis不会做特殊处理,#{参数名/任意名}:取出参数值(测试得:真的任意名都可以)
mybatis会做特殊处理,多个参数会被封装成 一个map key:param1...paramN,或者arg0...argN-1
<select id="findUserById" parameterType="int" resultType="com.zyc.entity.User"> select username,DATE_FORMAT(birthday,'%Y-%m-%d')birthday,sex,address from t_user where id=#{id} </select>明确指定封装参数时map的key;@Param("id")
public User findUserByIdAndName(@Param("id")int id, @Param("name")String name);映射文件
<select id="findUserByIdAndName" resultType="com.zyc.entity.User"> select username,DATE_FORMAT(birthday,'%Y-%m-%d')birthday,sex,address from t_user where id=#{id} and username = #{name} </select>如果多个参数正好是我们业务逻辑的数据模型,我们就可以直接传入pojo; #{属性名}:取出传入的pojo的属性值
<select id="findUserByUser" parameterType="com.zyc.entity.User" resultType="com.zyc.entity.User"> select username,DATE_FORMAT(birthday,'%Y-%m-%d')birthday,sex,address from t_user where id=#{id} </select>这个是我们自己传得map,不是上面多参数是mybatis帮我们处理得。所以可以直接通过key来获取
<select id="findUserByMap" resultType="com.zyc.entity.User"> select username,DATE_FORMAT(birthday,'%Y-%m-%d')birthday,sex,address from t_user where id=#{id} </select>#{list[0]},数组就是#{array[0]}
<select id="findUserByList" resultType="com.zyc.entity.User"> select username,DATE_FORMAT(birthday,'%Y-%m-%d')birthday,sex,address from t_user where id=#{list[1]} </select>#{key}:获取参数的值,预编译到SQL中(因为预编译,最好用在where里面,测试发现:在编译之后加了引号)。安全。 ${key}:获取参数的值,拼接到SQL中。有SQL注入问题。
使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。如果查询出来的列名和pojo中的属性名全部不一致,没有创建pojo对象。 只要查询出来的列名和pojo中的属性有一个一致,就会创建pojo对象。(验证通过)
<select id="findUserByMap" resultType="com.zyc.entity.User">没什么区别 Mapper
public List<User> findUserByName(String username);映射文件
<select id="findUserByList" resultType="com.zyc.entity.User">将查询的数据以{表字段名, 对应的值}方式存入到Map中。
Mapper
Map<String, Object> getEmpAsMapById(Integer id);映射文件
<select id="getEmpAsMapById" resultType="map"> select * from t_employee where id = #{id} </select>可以把查询的数据以{表中某一字段名, JavaBean}方式来封装成Map。 mapper
// 查询所有员工的信息,把数据库中的 'id' 字段作为 key,对应的 value 封装成 Employee 对象 // @MapKey 中的值表示用数据库中的哪个字段名作 key @MapKey("id") Map<Integer, Employee> getAllEmpsAsMap();映射文件
<!-- 注意 resultType 返回值类型,不再是 'map',而是 Map 的 value 对应的 JavaBean 类型 --> <select id="getAllEmpsAsMap" resultType="employee"> select * from t_employee </select>全局setting设置
autoMappingBehavior默认是PARTIAL,开启自动映射的功能。唯一的要求是列名和javaBean属性名一致如果autoMappingBehavior设置为null则会取消自动映射数据库字段命名规范,POJO属性符合驼峰命名法,如A_COLUMN和aColumn,我们可以开启自动驼峰命名规则映射功能,mapUnderscoreToCamelCase=true。可以实现高级结果集映射
查询Employee的同时查询员工对应的部门,就像hibernate中得一对一
主配置文件
<!-- 可以使用延迟加载(懒加载);(按需加载) Employee==>Dept: 我们每次查询Employee对象的时候,都将一起查询出来。 部门信息在我们使用的时候再去查询; 分段查询的基础之上加上两个配置: --> <settings> <!-- <setting name="mapUnderscoreToCamelCase" value="true"/> --> <setting name="jdbcTypeForNull" value="NULL"/> <!--显示的指定每个我们需要更改的配置的值,即使他是默认的。防止版本更新带来的问题 --> <setting name="lazyLoadingEnabled" value="true"/> <setting name="aggressiveLazyLoading" value="false"/> </settings>例如:查询部门的时候将部门对应的所有员工信息也查询出来
discriminator
<!-- <discriminator javaType=""></discriminator> 鉴别器:mybatis可以使用discriminator判断某列的值,然后根据某列的值改变封装行为 封装Employee: 如果查出的是女生:就把部门信息查询出来,否则不查询; 如果是男生,把last_name这一列的值赋值给email; --> <resultMap type="com.atguigu.mybatis.bean.Employee" id="MyEmpDis"> <id column="id" property="id"/> <result column="last_name" property="lastName"/> <result column="email" property="email"/> <result column="gender" property="gender"/> <!-- column:指定判定的列名 javaType:列值对应的java类型 --> <discriminator javaType="string" column="gender"> <!--女生 resultType:指定封装的结果类型;不能缺少。/resultMap--> <case value="0" resultType="com.atguigu.mybatis.bean.Employee"> <association property="dept" select="com.atguigu.mybatis.dao.DepartmentMapper.getDeptById" column="d_id"> </association> </case> <!--男生 ;如果是男生,把last_name这一列的值赋值给email; --> <case value="1" resultType="com.atguigu.mybatis.bean.Employee"> <id column="id" property="id"/> <result column="last_name" property="lastName"/> <result column="last_name" property="email"/> <result column="gender" property="gender"/> </case> </discriminator> </resultMap>