MyBatis的注解开发

01_MyBatis注解开发

  • 这几年来注解开发越来越流行,MyBatis也可以使用注解开发方式,这样就可以减少编写Mapper映射文件了。
  • MyBatis常用注解
  1. @Insert:实现新增
  2. @Update:实现更新
  3. @Delete:实现删除
  4. @Select:实现查询
  5. @Result:实现结果集封装
  6. @Results:可以与@Result 一起使用,封装多个结果集
  7. @One:实现一对一结果集封装
  8. @Many:实现一对多结果集封装

02_MyBatis注解操作CRUD

  • @Insert、@Update、@Delete、@Select
  • DAO接口
public interface IEmployeeDao {

	@Select("select * from tb_employee")
	List<Employee> selectEmployeeList();
	@Insert("insert into tb_employee(ename,salary,dno) values(#{ename},#{salary},#{dno})")
	int insertEmployee(Employee employee);
	@Delete("delete from tb_employee where eid = #{eid}")
	int deleteEmployeeById(Long id);
	@Update("update tb_employee set ename = #{ename} where eid = #{eid}")
	int updateEmployee(Employee employee);
}
  • 代码测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:/spring.xml"})
public class IEmployeeDaoTest {

    @Resource
	private IEmployeeDao employeeDao;

    @Test
    public void selectEmployeeList(){
        List<Employee> employeeList = employeeDao.selectEmployeeList();
		System.out.println(employeeList);
    }
    @Test
    public void insertEmployee(){
        Employee employee = new Employee();
        employee.setEname("邱邱");
        employee.setSalary(10000.0);
        employee.setDno(1L);
		int i = employeeDao.insertEmployee(employee);
		System.out.println(i);
    }
    @Test
    public void deleteEmployeeById(){
		int i = employeeDao.deleteEmployeeById(0L);
		System.out.println(i);
    }
    @Test
    public void updateEmployee(){
        Employee employee = new Employee();
        employee.setEid(2L);
        employee.setEname("aaa");
	int i = employeeDao.updateEmployee(employee);
	System.out.println(i);
    }
}

03_复杂关系映射注解说明

  • 实现复杂关系映射之前我们可以在映射文件中通过配置来实现, 在使用注解开发时我们需要借助@Results 注解, @Result 注解, @One 注解, @Many 注解。
  • 复杂关系映射的注解说明
  • @Results 注解
  1. 代替的是标签
  2. 该注解中可以使用单个@Result 注解,也可以使用@Result 集合
  3. @Results({@Result(), @Result() })或@Results(@Result())
  • @Result 注解
  1. 代替了 标签和标签
  2. @Result 中 属性介绍:
    id 是否是主键字段
    column 数据库的列名
    property 需要装配的属性名
    one 需要使用的@One 注解(@Result(one=@One)()))
    many 需要使用的@Many 注解(@Result(many=@many)()))
  • @One 注解(一对一)
  1. 代替了标签,是多表查询的关键,在注解中用来指定子查询返回单一对象。
  2. @One 注解属性介绍:
    select 指定用来多表查询的 sqlmapper
    fetchType 会覆盖全局的配置参数 lazyLoadingEnabled。
  3. 使用格式:
    @Result(column=" “,property=”",one=@One(select=""))
  • @Many 注解(多对一)
  1. 代替了标签,是是多表查询的关键,在注解中用来指定子查询返回对象集合。
  2. 注意:聚集元素用来处理“一对多”的关系。需要指定映射的 Java 实体类的属性,属性的javaType (一般为 ArrayList)但是注解中可以不定义;
  3. 使用格式:
    @Result(property="",column="",many=@Many(select=""))

04_注解实现一对一延迟加载

  • 一个订单属于一个用户

  • IOrderDao代码

@Select("select * from tb_orders")
@Results(id = "resultMap",
        value = {
			@Result(id = true , property = "customerId" ,column =
"customerId",javaType = Long.class),
			@Result(property = "name" , column = "name" ,javaType = String.class ),
			@Result(property = "address" ,column = "address",javaType =
String.class),
				@Result(property = "customer",
                    javaType = Customer.class,
                    one = @One(select =
"com.aaa.dao.ICustomerDao.selectCustomerById",fetchType = FetchType.EAGER),
                    column = "customerNo")
        })
 List<Order> selectOrderList();
  • ICustomerDao代码
@Select(value = "select * from tb_customer where customerId = #{customerId}")
Customer selectCustomerById(Long customerId);

05_注解实现一对多延迟加载

  • 一个用户有多个订单

  • ICustomerDao代码

@Select(value = "select * from tb_customer")
@Results(id = "resultMap",
    value = {
		@Result(id = true,property = "orderId",column = "orderId",javaType =
Long.class),
		@Result(property = "state",column = "state",javaType = String.class),
		@Result(property = "orderList",
                column = "customerId",
                many =
@Many(select="com.aaa.dao.IOrderDao.selectOrderListByCustomerId",fetchType =
FetchType.LAZY))
    }
)
List<Customer> selectCustomerList();
  • IOrderDao代码
@Select("select * from tb_orders where customerNo = #{customerNo}")
List<Order> selectOrderListByCustomerId(Long customerId);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值