Mybatis 之九:MyBatis 注解

MyBatis注解

在 MyBatis 框架中,注解可以用于替代或补充 XML 映射文件来实现 SQL 语句的映射。使用注解可以使代码更简洁,减少配置文件的工作量,特别适用于简单场景和快速开发。

下面是一些 MyBatis 中常用的注解:

  1. @Mapper:标注在接口类上,表明这个接口是一个 MyBatis 的 Mapper 接口。
  2. 基本 CRUD 注解:
    • @Select:标注在方法上,表示这是一个查询操作,包含需要执行的 SQL 语句。
    • @Insert:用于插入操作,对应一个 INSERT SQL 语句。
    • @Update:用于更新操作,对应一个 UPDATE SQL 语句。
    • @Delete:用于删除操作,对应一个 DELETE SQL 语句。
  3. 参数处理注解:
    • @Param:标注在方法参数上,用来为参数命名或者注入动态参数。
  4. 结果集映射注解:
    • @Result 和 @Results:用于描述结果集映射,指定列如何映射到 Java 类型属性上。
    • @Result 用于一对一的字段映射。
    • @Results 可以包含多个 @Result,用于多结果集或复杂的结果映射。

基本CRUD

@Select 、@Insert、@Delete、@Update

  • 搭建基本 MyBatis框架
  • 在原有的持久层代码接口中,修改代码,在对应的方法上添加对应的注解
    • 在查询的方法上使用 @Select ; 在修改的方法上使用@Update ...... @Delete 、@Insert

修改持久层代码:

package com.wdzl.dao;
import com.wdzl.pojo.Emp;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;

public interface IEmpDao {
    @Insert("insert into emp(ename,sal,hiredate,deptno)values(#{ename},#{salary},#{hiredate},#{deptno})")
    void save(Emp emp);

    @Delete("delete from emp where empno=#{eno}")
    void delete(Integer eno);

    @Update("update emp set sal=#{salary} where empno=#{empno}")
    void update(Emp emp);

    @Select("SELECT empno,ename,sal,hiredate,deptno from emp where empno=#{empno}")
    Emp get(Integer empno);

    @Select("select empno,ename,sal,hiredate,deptno from emp")
    List<Emp> queryAll();

    List<Emp> selectByCondition(Emp emp);
}

修改配置文件,mapper 引入映射方式,变成类 class属性

    <mappers>
<!--        <mapper resource="mapper/EmpMapper.xml"/>-->
<!--        <mapper resource="mapper/DeptMapper.xml"/>-->
        <mapper class="com.wdzl.dao.IEmpDao"></mapper>
    </mappers>

测试代码,这个没变化和之前一样

public class TestAnno {
    private SqlSession session;
    private IEmpDao empDao;

    @Test
    public void testPage(){
        Emp exx = empDao.get(1);
//        empDao.queryAll().forEach(System.out::println);
//        Emp emp = new Emp();
//        emp.setEname("UUUUU");
//        emp.setSalary(12000f);
//        emp.setHiredate(new Date());
//        emp.setDeptno(30);

        exx.setSalary(13000f);
//        empDao.update(exx);

        empDao.delete(111);

//        empDao.save(emp);


    }

    @Before
    public void open(){
        System.out.println("===============open()===============");
        session = MyBatisUtil.getSqlSession();
        empDao = session.getMapper(IEmpDao.class);
    }

    @After
    public void close(){
        System.out.println("===============close()===============");
        MyBatisUtil.close(session);
    }
}

结果映射注解

@Results

@Result

@ResultMap

使用@Results() 注解时,通过id属性来唯一标识结果映射,其他的方法可以通过 @ResultMap()直接引用

    @Select("SELECT empno,ename,sal,hiredate,deptno from emp where empno=#{empno}")
//    @Results({@Result(property = "salary",column = "sal"),@Result(property = "ename",column = "sal")})
    @Results(id="empMap",value={@Result(property = "salary",column = "sal"),@Result(property = "ename",column = "sal")})
    Emp get(Integer empno);

    @Select("select empno,ename,sal,hiredate,deptno FROM emp")
    @ResultMap("empMap")
    List<Emp> queryAll();

@SelectKey

获取自动增长主键

@SelectKey

其中属性必填的:keyProperty、before、resultType、statement

before 的用法:

  • mysql 和 sqlserver 中有标识列,插入后才能获取到主键的值
  • oracle 中自动增长,通过序列 对象来实现的,插入之前,就可以通过序列获取自动增长列的值
@Insert("insert into emp(ename,sal,hiredate,deptno)values(#{ename},#{salary},#{hiredate},#{deptno})")
@SelectKey(keyProperty = "empno",keyColumn = "empno",before = false,resultType = Integer.class,
statement = "select last_insert_id()")
void save(Emp emp);

@ Param

在方法中如果存在多个参数时,需要使用@Param 来确定参数名

如果不使用 @Param 时,默认执行会抛出异常,

提示:可以使用 arg0,arg1,param1,param2 来调用

/**
 * 如果不使用@Param 取别名时,可以使用下面变量名
 * Available parameters are [arg1, arg0, param1, param2]

 * @param deptno
 * @param ename
 * @return 
 */
@Select("select * from emp where deptno=#{arg0} and ename=#{arg1}")
List<Emp> selectByConditionx(String deptno,String ename);

@Select("select * from emp where deptno=#{dno} and ename=#{ename}")
List<Emp> selectByCondition(@Param("dno") String deptno,@Param("ename") String ename);

@One 和 @Many

注解实现关联映射:

@One

@Many

注意:因为关联映射涉及的多个实体类,Emp 和 Dept

所以需要修改对应的 IEmpDao 和 IDeptDao 两个接口,那这样就需要在配置文件中同时配置两个dao的

修改 IEmpDao接口

@Select("SELECT empno,ename,sal,hiredate,deptno from emp where empno=#{empno}")
@Results(id="empMap",value={@Result(property = "salary",column = "sal"),
@Result(property = "dept",column = "deptno",
        one = @One(select = "com.wdzl.dao.IDeptDao.get"))
})

修改 IDeptDao 接口

public interface IDeptDao {

    @Select("select deptno,dname from dept where deptno=#{deptno}")
    Dept get(Integer dno);
    void save(Dept dept);
}

修改映射文件,增加 IDeptDao 配置引用

    <mappers>
<!--        <mapper resource="mapper/EmpMapper.xml"/>-->
<!--        <mapper resource="mapper/DeptMapper.xml"/>-->
        <mapper class="com.wdzl.dao.IEmpDao"></mapper>
        <mapper class="com.wdzl.dao.IDeptDao"></mapper>
    </mappers>

@ Many

通过部门关联查员工

修改员工持久接口 IEmpDao,新增通过部门编号查询员工列表的方法

@Select("select empno,ename,sal,hiredate,deptno from emp where deptno=#{deptno}")
List<Emp> queryByDept(Integer deptno);

修改部门持久接口 IDeptDao,新增关联映射结果集

@Select("select deptno,dname from dept where deptno=#{deptno}")
@Results({
        @Result(id = true,property = "deptno",column = "deptno"),
        @Result(property = "dname",column = "dname"),
        @Result(property = "emps",column = "deptno",
        many = @Many(select = "com.wdzl.dao.IEmpDao.queryByDept"))
})
Dept get(Integer dno);

测试代码:

Dept dept = deptDao.get(30);
System.out.println("部门名:"+dept.getDname());
System.out.println("部门下人数:"+dept.getEmps().size());
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zp8126

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值