前言:注解开发给我们带来的便利不言而喻,Mybatis的注解开发可以让我们不用去编写xml文件,直接在接口上使用注解的形式就可以进行开发,使用起来十分便捷
本次我们将直接以代码举例的形式进行讲解,不明白的地方记得看注释
先看一下我们本次的项目结构(pom.xml文件和sqlMapConfig.xml文件不会配置的请看我上一篇博客):
首先我们建好数据库(如下图)
user是用户表,orders是订单表
用户表示例:其中id为主键
orders表示例:其中id为主键,uid为外键即user的id
搭建好数据库后,创建实体类
(具体的get,set,toString,和构造方法在这里我就不多加赘述了)
//User实体类
public class User {
private int id;
private String username;
private String password;
private List<Order> orderList;//当前用户所拥有的订单
}
//orders实体类
public class Order {
private int id;
private Date ordertime;
private int total;
private User user;//表示订单属于那个用户
}
然后我们编写相应的Mapper接口
OrderMapper:
package com.lsc.mapper;
import com.lsc.domain.Order;
import com.lsc.domain.User;
import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface OrderMapper {
//查询订单以及所属的用户信息,一对一查询!!!一个订单只能由一个用户所拥有
@Select("select * from orders")
@Results({
// column是数据库字段名,property是要封装的属性名
@Result(column = "id",property = "id"),
@Result(column = "ordertime",property = "ordertime"),
@Result(column = "total",property = "total"),
@Result(
property = "user",//要封装的属性名
column = "uid",//根据uid去查询user表
javaType = User.class,//要封装的实体类型
//select代表查询哪个接口的方法获得数据,我们这里通过UserMapper.findUserById方法根据uid进行查询
one = @One(select = "com.lsc.mapper.UserMapper.findUserById")
)
})
public List<Order> findAllOrder();
@Select("select * from Orders where uid=#{uid}")
public List<Order> findOrderById(int uid);
}
UserMapper:
package com.lsc.mapper;
import com.lsc.domain.User;
import org.apache.ibatis.annotations.*;
import java.util.List;
public interface UserMapper {
@Select("select * from user")
public List<User> findAll();
@Select("select * from user where id=#{id}")
public List<User> findUserById(int id);
@Insert("insert into user values(#{id},#{username},#{password})")
public void addUser(User user);
@Update("update user set username=#{username},password=#{password} where id=#{id}")
public void updateUser(User user);
@Delete("delete from user where id=#{id}")
public void deleteUser(int id);
// 一对多查询,一个用户有多个订单
@Select("select * from user")
@Results({// id =true代表是主键id column是数据库字段名,property是要封装的属性名
@Result(id =true,column = "id",property = "id"),
@Result(column = "username",property = "username"),
@Result(column = "password",property = "password"),
@Result(
column = "id",//根据id去查询order表
property = "orderList",//要封装的属性名
javaType = List.class,//要封装的实体类型
//select代表查询哪个接口的方法获得数据,我们这里通过OrderMapper.findOrderById方法根据user的id进行查询
many = @Many(select = "com.lsc.mapper.OrderMapper.findOrderById"))
})
public List<User> findUserAllOrders();
// 多对多查询,和上面差不多,只不过多一个中间表,这里就不加赘述了
}
注意:千万不要忘记在sqlMapConfig.xml文件中配置加载映射关系哦
<!--加载映射关系-->
<mappers>
<package name="com.lsc.mapper"/>
</mappers>
最后我们对用注解编写的sql代码进行测试
UserTest:
package com.lsc.test;
import com.github.pagehelper.PageHelper;
import com.lsc.domain.User;
import com.lsc.mapper.UserMapper;
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.Before;
import org.junit.Test;
import sun.util.BuddhistCalendar;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class UserTest {
private UserMapper mapper;
@Before
public void before() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = build.openSession(true);
mapper = sqlSession.getMapper(UserMapper.class);
}
@Test
public void testFindAll(){
List<User> all = mapper.findAll();
for (User user : all) {
System.out.println(user);
}
}
@Test
public void testFindUserById(){
List<User> all = mapper.findUserById(1);
for (User user : all) {
System.out.println(user);
}
}
@Test
public void testaddUser(){
User user=new User();
user.setUsername("anno");
user.setPassword("qwer");
mapper.addUser(user);
}
@Test
public void testUpdateUser(){
User user=new User();
user.setId(6);
user.setUsername("ooo");
user.setPassword("ppp");
mapper.updateUser(user);
}
@Test
public void testDelete(){
mapper.deleteUser(7);
}
@Test
public void testUserAllOrders(){
List<User> userAllOrders = mapper.findUserAllOrders();
for (User userAllOrder : userAllOrders) {
System.out.println(userAllOrder);
}
}
}
OrderTest:
package com.lsc.test;
import com.lsc.domain.Order;
import com.lsc.mapper.OrderMapper;
import com.lsc.mapper.UserMapper;
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.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class OrderTest {
private OrderMapper mapper;
@Before
public void before() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = build.openSession(true);
mapper = sqlSession.getMapper(OrderMapper.class);
}
@Test
public void testFindAllOrder(){
List<Order> Orders = mapper.findAllOrder();
System.out.println(Orders);
}
}
至此,Mybatis注解开发就结束了🎉🎉!