MyBatis注解
在 MyBatis 框架中,注解可以用于替代或补充 XML 映射文件来实现 SQL 语句的映射。使用注解可以使代码更简洁,减少配置文件的工作量,特别适用于简单场景和快速开发。
下面是一些 MyBatis 中常用的注解:
- @Mapper:标注在接口类上,表明这个接口是一个 MyBatis 的 Mapper 接口。
- 基本 CRUD 注解:
- @Select:标注在方法上,表示这是一个查询操作,包含需要执行的 SQL 语句。
- @Insert:用于插入操作,对应一个 INSERT SQL 语句。
- @Update:用于更新操作,对应一个 UPDATE SQL 语句。
- @Delete:用于删除操作,对应一个 DELETE SQL 语句。
- 参数处理注解:
- @Param:标注在方法参数上,用来为参数命名或者注入动态参数。
- 结果集映射注解:
- @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());
1060

被折叠的 条评论
为什么被折叠?



