SSM之Mybatis

SSM

MyBatis->Jdbc;SpringMVC->servlet;Maven:管理项目的依赖和构建管理的软件

Mybatis

1、使用代理模式创建接口的对象 例: UserMapper mapper=sqlSession.getMapper(UserMapper.class);

   mapper接口中的代理实现类实现接口中的抽象方法,底层使用的sqlSession.insert方法:

方法中字符串定位到UserMapper接口中的insertUser方法作为UserMapper.xml配置文件中insertUser中sql语句的唯一标识。

 

2、一个表对应一个实体类,对应一个mapper接口对应一个映射文件

模糊查询及获取参数方式的使用情况

1、Mybatis中获取参数的两种方式:${}的本质就是字符串拼接,#{}的本质就是占位符赋值,占位符赋值会默认加上单引号

只能使用${}的情况:

  1. where  字段 in(范围)
  2. 动态设置表名时

模糊查询中占位符赋值被单引号涵盖,将会直接作为字符串的一部分不会再作为占位符。除非使用"%"#{}"%"

 

2、类中的属性和成员变量无关,看类中的get和set方法。

 

3、可以给Integer赋值为null,但int型不可以赋值为null

 

4、使用map集合接收数据,当查询得到的某个字段为null,则在此map中没有赋值;但如果是实体类,此属性会显示赋值为null

获取自增的主键

处理字段名和属性名不一致的情况

1、Mapper接口中方法的形参名并不重要,但@para("")里面的名字必须要和映射文件里获取参数里的名字相同,和实体类型的属性名相对应,sql语句中的字段名必须和表里的字段名匹配。

实体类中的定义:

接口方法的定义;

mapper映射文件中sql语句:

 

2、使用全局变量方式处理字段名和属性名不一致的情况时,mapper映射文件中直接写resultType即可,不用映射

 

3、多对一的分步查询步骤(可以延迟加载,前提要按需加载):

    • 先对”多“表创建方法,为查询的第一步  
      Emp getEmpAndDeptByStepOne(@Param("empId") Integer id);
    • 在”多“表对应的映射文件中写对应的sql语句,并将返回值类型映射成实体类对象
      <select id="getEmpAndDeptByStepOne" resultMap="empDeptStepMap">
          select * from t_emp where emp_id=#{empId}
      </select>
    • 在”一“表中创建查询的第二步方法,并在对应表中写出对应的sql语句
      Dept getEmpAndDeptByStepTwo(@Param("deptId") Integer deptId);
      <select id="getEmpAndDeptByStepTwo" resultType="Dept">
          select * from t_dept where dept_id=#{deptId};
      </select>
    • 在多表对应的映射文件中详细设置empDeptStepMap
      <resultMap id="empDeptStepMap" type="Emp">
          <id column="emp_id" property="empId"></id>
          <result column="emp_name" property="empName"></result>
          <result column="age" property="age"></result>
          <result column="gender" property="gender"></result>
          <result column="email" property="email"></result>
          <association property="dept"
                       select="com.atguigu.mybatis.mapper.DeptMapper.getEmpAndDeptByStepTwo"
                       column="dept_id">
          </association>
      </resultMap>

       

4、一对多的分布查询

<resultMap id="deptAndEmpResultMap" type="Dept">
    <id column="dept_id" property="deptId"></id>
    <result column="dept_name" property="deptName"></result>
    <collection property="emps"
                select="com.atguigu.mybatis.mapper.EmpMapper.getDeptAndEmpByStepTwo"
                column="dept_id">
    </collection>

</resultMap>

collection中的属性可以理解为,将对应sql执行语句的结果中属性为dept_id的值拿出来,作为第二步的参数,最后将第二步返回的值给emps。

其它步骤思路和上面一样,有两个地方需要改为集合:”一“表中对”多“表的定义、”多“表方法中接收的结果:

List<Emp> getDeptAndEmpByStepTwo(@Param("deptId") Integer deptId);
posted @ 2024-12-23 10:09  Dyj07  阅读(28)  评论(0)    收藏  举报