1、概述
-
mybatis中也提供了注解式开发方式,采用注解可以减少Sql映射文件的配置。
-
使用注解式开发的话,sql语句是写在java程序中的,这种方式也给sql语句的维护带来成本。
-
使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂一点的语句,Java 注解不仅力不从心,还会让你本就复杂的 SQL 语句更加混乱不堪。 因此,如果你需要做一些很复杂的操作,最好用 XML 来映射语句。
-
原则:简单sql可以注解。复杂sql使用xml。
-
在哪用注解:直接在Mapper接口的方法上标注相应的注解,在注解里面写SQL映射文件中的sql语句即可。
模块名:mybatis-013-annotation
打包方式:jar
依赖:mybatis,mysql驱动,junit,logback
配置文件:jdbc.properties、mybatis-config.xml、logback.xml
pojo类:com.powernode.mybatis.pojo.Car
mapper接口:com.powernode.mybatis.mapper.CarMapper
常用的注解
2、@Insert注解
CarMapper接口
package com.powernode.mybatis.mapper;
import com.powernode.mybatis.pojo.Car;
import org.apache.ibatis.annotations.Insert;
public interface CarMapper {
@Insert(value="insert into t_car values(null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})")
int insert(Car car);
}
AnnotationTest.testInsert
package com.powernode.mybatis.test;
import com.powernode.mybatis.mapper.CarMapper;
import com.powernode.mybatis.pojo.Car;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
public class AnnotationTest {
@Test
public void testInsert() throws Exception{
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession();
CarMapper mapper = sqlSession.getMapper(CarMapper.class);
Car car = new Car(null, "1112", "卡罗拉", 30.0, "2000-10-10", "燃油车");
int count = mapper.insert(car);
System.out.println("插入了几条记录:" + count);
sqlSession.commit();
sqlSession.close();
}
}
3、 @Deleta
CarMapper接口
@Delete("delete from t_car where id = #{id}")
int deleteById(Long id);
AnnotationTest.java
@Test
public void testDelete() throws Exception{
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession();
CarMapper mapper = sqlSession.getMapper(CarMapper.class);
mapper.deleteById(89L);
sqlSession.commit();
sqlSession.close();
}
4、 @Update
CarMapper接口
@Update("update t_car set car_num=#{carNum},brand=#{brand},guide_price=#{guidePrice},produce_time=#{produceTime},car_type=#{carType} where id=#{id}")
int update(Car car);
AnnotationTest.java
@Test
public void testUpdate() throws Exception{
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession();
CarMapper mapper = sqlSession.getMapper(CarMapper.class);
Car car = new Car(88L,"1001", "凯美瑞", 30.0,"2000-11-11", "新能源");
mapper.update(car);
sqlSession.commit();
sqlSession.close();
}
5、 @Select
CarMapper接口
@Select("select * from t_car where id = #{id}")
@Results({
@Result(column = "id", property = "id", id = true),
@Result(column = "car_num", property = "carNum"),
@Result(column = "brand", property = "brand"),
@Result(column = "guide_price", property = "guidePrice"),
@Result(column = "produce_time", property = "produceTime"),
@Result(column = "car_type", property = "carType")
})
Car selectById(Long id);
AnnotationTest.java
@Test
public void testSelectById() throws Exception{
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession();
CarMapper carMapper = sqlSession.getMapper(CarMapper.class);
Car car = carMapper.selectById(88L);
System.out.println(car);
}
6、@Results注解
相当于结果映射标签resultMap,配合@select注解一起使用
下面使用一对一关系映射来演示@Results注解。
实体类
package org.example.entity;
public class Dept {
private Integer deptno;
private String dname;
private String loc;
public Integer getDeptno() {
return deptno;
}
public void setDeptno(Integer deptno) {
this.deptno = deptno;
}
public String getDname() {
return dname;
}
public void setDname(String dname) {
this.dname = dname;
}
public String getLoc() {
return loc;
}
public void setLoc(String loc) {
this.loc = loc;
}
@Override
public String toString() {
return "Dept{" +
"deptno=" + deptno +
", dname='" + dname + '\'' +
", loc='" + loc + '\'' +
'}';
}
}
package org.example.mapper;
public class Emp {
private Integer empno;
private String ename;
private String job;
private Integer mgr;
private Date hiredate;
private Double sal;
private Double comm;
private Integer deptno;
private Dept dept;
public Integer getEmpno() {
return empno;
}
public void setEmpno(Integer empno) {
this.empno = empno;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public Integer getMgr() {
return mgr;
}
public void setMgr(Integer mgr) {
this.mgr = mgr;
}
public Date getHiredate() {
return hiredate;
}
public void setHiredate(Date hiredate) {
this.hiredate = hiredate;
}
public Double getSal() {
return sal;
}
public void setSal(Double sal) {
this.sal = sal;
}
public Double getComm() {
return comm;
}
public void setComm(Double comm) {
this.comm = comm;
}
public Integer getDeptno() {
return deptno;
}
public void setDeptno(Integer deptno) {
this.deptno = deptno;
}
public Dept getDept() {
return dept;
}
public void setDept(Dept dept) {
this.dept = dept;
}
@Override
public String toString() {
return "Emp{" +
"empno=" + empno +
", ename='" + ename + '\'' +
", job='" + job + '\'' +
", mgr=" + mgr +
", hiredate=" + hiredate +
", sal=" + sal +
", comm=" + comm +
", deptno=" + deptno +
", dept=" + dept +
'}';
}
}
mapper接口
package org.example.entity;
public interface EmpMapper {
/*
* 手动映射resultMap标签
* @Results + @Result注解替代
* @Results = resultMap标签
* @Result = resultMap标签的子标签id和result
*/
@Select("select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp")
@Results(id = "selectResultMap",
value = {
@Result(id = true, column = "empno", property = "empno"),
@Result(column = "ename", property = "ename"),
@Result(column = "job", property = "job"),
@Result(column = "mgr", property = "mgr"),
@Result(column = "hiredate", property = "hiredate"),
@Result(column = "sal", property = "sal"),
@Result(column = "comm", property = "comm"),
@Result(column = "deptno", property = "deptno"),
@Result(column = "deptno", property = "dept", javaType =
Dept.class,
one = @One(select =
"com.newcapec.dao.DeptDao.selectById", fetchType = FetchType.LAZY))
})
List<Emp> select();
@Select("select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp where
empno=#{empno}")
@ResultMap("selectResultMap")
Emp selectById(Integer empno);
}
测试
@Test
public void testSelectEmp(){
SqlSession sqlSession=MybatisUtil.getSession();
EmpMapper empMapper=sqlSession.getMapper(EmpMapper.class);
List<Emp> empList=empMapper.select();
for(Emp emp:empList){
System.out.println(emp);
}
sqlSession.close();
}
@Test
public void testSelectEmpById(){
SqlSession sqlSession=MybatisUtil.getSession();
EmpMapper empMapper=sqlSession.getMapper(EmpMapper.class);
Emp emp=empMapper.selectById(7369);
System.out.println(emp);
sqlSession.close();
}
在这里引用一篇大佬的文章: