01_MyBatis注解开发
- 这几年来注解开发越来越流行,MyBatis也可以使用注解开发方式,这样就可以减少编写Mapper映射文件了。
- MyBatis常用注解
- @Insert:实现新增
- @Update:实现更新
- @Delete:实现删除
- @Select:实现查询
- @Result:实现结果集封装
- @Results:可以与@Result 一起使用,封装多个结果集
- @One:实现一对一结果集封装
- @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 注解
- 代替的是标签
- 该注解中可以使用单个@Result 注解,也可以使用@Result 集合
- @Results({@Result(), @Result() })或@Results(@Result())
- @Result 注解
- 代替了 标签和标签
- @Result 中 属性介绍:
id 是否是主键字段
column 数据库的列名
property 需要装配的属性名
one 需要使用的@One 注解(@Result(one=@One)()))
many 需要使用的@Many 注解(@Result(many=@many)()))
- @One 注解(一对一)
- 代替了标签,是多表查询的关键,在注解中用来指定子查询返回单一对象。
- @One 注解属性介绍:
select 指定用来多表查询的 sqlmapper
fetchType 会覆盖全局的配置参数 lazyLoadingEnabled。 - 使用格式:
@Result(column=" “,property=”",one=@One(select=""))
- @Many 注解(多对一)
- 代替了标签,是是多表查询的关键,在注解中用来指定子查询返回对象集合。
- 注意:聚集元素用来处理“一对多”的关系。需要指定映射的 Java 实体类的属性,属性的javaType (一般为 ArrayList)但是注解中可以不定义;
- 使用格式:
@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);

1515

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



