Mybatis框架-two

小鱼儿 2022-03-12 02:07 292阅读 0赞

1.DAO层代理开发(重点)

DAO层代理开发要满足四个规范:
1.Mapper接口的全限定名和Mapper.xml的namespace一致
2.Mapper接口的方法名和Mapper.xml的statment的id一致(不是完整唯一标识)
3.Mapper接口的方法的参数类型和Mapper.xml的statment的parameterType一致
4.Mapper接口的方法的返回值类型和Mapper.xml的statment的resultType一致

1)定义Mapper接口,相当于原始的DAO接口

  1. public interface EmployeeMapper {
  2. //插入
  3. int insert(Employee emp);
  4. //修改
  5. int update(Employee emp);
  6. //删除
  7. int delete(int eid);
  8. //查询单个记录
  9. Employee queryById(int eid);
  10. //全查询
  11. List<Employee> queryAll();
  12. }

2)定义Mapper.xml文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  4. <mapper namespace="com.sxt.mapper.EmployeeMapper">
  5. <insert id="insert" parameterType="com.sxt.domain.Employee" useGeneratedKeys="true">
  6. insert into t_employee(ename,sex,salary) values(#{ename},#{sex},#{salary})
  7. <!-- insert into t_employee(ename,sex,salary) values('${ename}','${sex}',${salary}) -->
  8. </insert>
  9. <update id="update" parameterType="com.sxt.domain.Employee">
  10. update t_employee set ename=#{ename},sex=#{sex},salary=#{salary} where eid=#{eid}
  11. </update>
  12. <delete id="delete" parameterType="int">
  13. delete from t_employee where eid=#{sid}
  14. </delete>
  15. <select id="queryById" resultType="com.sxt.domain.Employee">
  16. <!-- select * from t_employee where eid=#{sid} -->
  17. select * from t_employee where eid=${value}
  18. </select>
  19. <select id="queryAll" resultType="com.sxt.domain.Employee">
  20. select * from t_employee
  21. </select>
  22. </mapper>

1.1 多个简单参数的绑定
如果Mapper接口中的方法有多个简单参数,那么Mapper.xml文件中绑定多个简单参数的占位符名称xxx只能是param1,param2,…paramN (param1绑定第1个参数,param2绑定第2个参数)
原理:当方法的入参是多个简单参数时,myBatis会将调用方法的实参作为value,将param1,param2…作为key存储到Map中

例如:

方法定义: List queryByCondition(String sex,int salary);
调用
List list = mapper.queryByCondition(“男”, 7500);
MyBatis会构造一个Map,把实参作为value,用param1,param2…作为key存到Map中
类似于:map.put(“param1”,“男”);
map.put(“param2”,7500);

在Mapper.xml文件中通过#{key}来获取Map中的参数值,例如#{param1}绑定参数1的值,#{param2}绑定参数2的值

2.主配置文件的其它配置(重点)

2.1.properties标签
加载外部的properties文件

  1. <!-- 加载外部properties文件 -->
  2. <properties resource="db.properties"></properties>
  3. 可以通过${
  4. key}语法去读取properties文件中的value
  5. 例如: <property name="driver" value="${driver}" />

2.2.typeAliases标签
用于配置类的别名,具体有2种配置别名方式:
1.在typeAliases内用一个typeAlias来为一个类型配置别名

  1. <typeAliases>
  2. <!-- typeAlias指定一个类的别名 type:类的全限定名 alias:别名 -->
  3. <typeAlias type="com.sxt.domain.Employee" alias="emp"/>
  4. </typeAliases>

2.在typeAliases内用package标签来批量配置别名
package标签为某个包下的所有类指定别名,默认别名就是类名(不区分大小写)

  1. <typeAliases>
  2. <!-- typeAlias指定一个类的别名 type:类的全限定名 alias:别名 -->
  3. <!-- <typeAlias type="com.sxt.domain.Employee" alias="emp"/> -->
  4. <!-- package为某个包下所有的类批量配置别名,默认别名就是类名本身(不区分大小写) -->
  5. <package name="com.sxt.domain"/>
  6. </typeAliases>
  7. Mapper.xml中用Employee或者employee来引用类全限定名
  8. <select id="queryAll" resultType="Employee">
  9. select * from t_employee
  10. </select>

2.3 加载SQL映射文件的三种方式
1.通过mapper标签的resource属性来加载,值是Mapper.xml的物理路径
2.通过mapper标签的class属性来加载,值是Mapper接口的全限定名,
前提是Mapper接口和Mapper.xml要在同一级包下且文件名要相同,
mybatis会加载与Mapper接口在同一包下且名字相同的Mapper.xml
3.通过package标签来加载,package是指定Mapper接口所在的包名称,mybatis会自动扫描该包下所有Mapper接口
并加载映射文件,前提条件和方式2相同,即Mapper接口和Mapper.xml要在同一级包下且文件名要相同
以上3种方式1,只有方式3是批量加载,即可以加载多个Mapper.xml文件

  1. <mappers>
  2. <!-- <mapper resource="com/sxt/mapper/EmployeeMapper.xml" /> -->
  3. <!-- <mapper class="com.sxt.mapper.EmployeeMapper"/> -->
  4. <package name="com.sxt.mapper"/>
  5. </mappers>

常见错误:
BindingException:绑定异常,没有找到名字为queryAll的Statement,本质就是Mapper.xml没有加载成功
在这里插入图片描述

3.resultType和resultMap(重点)

resultType:映射(封装)单表的查询结果集,要求字段名和属性名完全一致,如果哪个属性名和字段不相同,则该属性值为null.因为mybatis默认将字段的值封装到实体类的同名属性上

resultMap:映射(封装)多表查询的复杂结果集。可以使用resultMap解决属性名和字段名不一致的问题

使用resultMap属性时,它的值就是外部resultMap元素的id,是对外部resultMap的一个引用
1)自定义一个resultMap,指定封装的规则(字段和属性之间的映射规则)

  1. <resultMap type="com.sxt.domain.Card" id="cardMap">
  2. <id column="cid" property="cid"/>
  3. <result column="c_name" property="cname"/>
  4. </resultMap>

2)在select标签上用resultMap属性来引用resultMap元素,值是resultMap元素的id

  1. <select id="queryAll" resultMap="cardMap">
  2. select * from t_card
  3. </select>

发表评论

表情:
评论列表 (有 0 条评论,292人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Mybatis框架

    MyBatis框架的作用 MyBatis框架的主要作用是:简化持久层编程。 持久层:处理数据持久化的层。通常,在开发领域,讨论数据时,默认指的是内存中的数据,而内存无法

    相关 MyBatis框架

    1.对比传统Servlet技术和SSM框架的优缺点? Servlet是一种运行在支持Java语言的服务器上的组件,用于实现多种网络服务功能,为网络客户提供安全可靠、易于移植的

    相关 Mybatis框架

    什么是Mybits > 是一款优秀的持久层框架, > 他是支持制定SQL, 存储过程以及高级映射 > .它避免了几乎所有JDBC代码和手动设置参数, 以及获取结果集

    相关 Mybatis框架-two

    1.DAO层代理开发(重点) DAO层代理开发要满足四个规范: 1.Mapper接口的全限定名和Mapper.xml的namespace一致 2.Mapper接口