mybatis 注解开发,概述
常用的注解
@Insert
@Update
@Delete
@Select
@Result : 实现结果集封装
@Results : 可以与@Result一起使用,封装多个结果集
@One : 实现一对一结果集封装
@Many : 实现一对多结果集封装
演示简单的CRUD操作
@Insert("insert into user values(#{id},#{username},#{password},#{birthday})") public void save (User user)
@Select("select * from user") public List<User> findAll()
实现复杂查询
@Results 代替的是标签,<resultMap>该注解中可以使用单个@Result注解,也可以使用@Result集合。使用格式:@Results({@Result(),@Result()})或者@Results(@Result())
@Result 代替<id>标签和<result>标签。@Result中属性介绍:column:数据库中的列名,property:需要装配的属性名,one:需要使用的@One注解(@Result (one=@One)),many;需要使用的@Many注解(@Result (many=@Many()))。
@One (一对一) 代替<assocation>标签,是多表查询的关键,(对方查询时使用的接口方法) ,在注解中用来指定子查询返回单一对象。@One注解属性介绍:select:指定用来多表查询的sqlmapper,使用格式:@Result(column=“” ,property=“”,one=@One(select=“”))
@Many (多对一)代替<collection>标签,是多表查询的关键,在注解中用来指定子查询返回对象集合。使用格式:@Result(property=“”,column=“”,many=@Many(select=""))
举一个例子
一对一:
查订单对应的用户
// 这里有一个id的重复,用oid,实现了冗余列名,这种封装和xml的方式一样 @Select("select *,o.id oid from orders o,user u where o.uid=u.id") @Results({ @Result(column="oid",property="id"), @Result(column="ordertime",property="ordertime"), @Result(column="total",property="total"), @Result(column="uid",property="user.id"), @Result(column="username",property="user.username"), @Result(column="password",property="user.password"), }) public List<Order> findAll();
// 分开查,查2次 @Select(“select * from orders”) @Results({ @Result(column=“id”,property=“id”), @Result(column=“ordertime”,property=“ordertime”), @Result(column=“total”,property=“total”), @Result ( property="user", //要封装的属性名称 column=“uid”,// 根据哪个字段查询user表的数据 javaType= User.class,// 要封装的实体类型 one = @One(select="cn.taotao.mapper.UserMapper.findById") 查询哪个接口的方法获得数据 ) })
publc List<Order> findAll()
接上面的接口查询
@Select(“select * from user where id=#{id}”) public User findById(Integer id);
一对多:
查用户的所有订单
在User类中,创建一个属性 ,建立映射关系,该用户的所有订单
private List<Order> orderList; 在@Result中需要引入这个属性
// 在 UserMapper中 @Select("select * from user") @Results({ @Result(id=true, column= "id", property="id"), @Result(column= "username", property="username"), @Result(column= "password", property="password"), @Result( property="orderList",column="id" , // 当前的id,作为对方的uid查询传入 ,返回类型为List javaType=List.class,
many=@Many(select=“cn.taotao.mapper.OrderMapper.findbyUid”) ) ), }) public List<User> findUserAndOrderAll(); // 在 OrderMapper中 @Select(“select * from orders where uid=#{uid}”) public List<Order> findByUid(int uid);
多对多
(关键: 从user中建立映射关系,然后从中间表(user_role)查询结果,这个查询复杂,联合查询(user-role和role表),将结果封装到user中的映射关系属性中)
用户角色表,一个用户对应多个角色,一个角色有多个用户。
多对多一般对应一个中间表。这个例子用到了3张表,一个是user,一个role,一个是user_role(不需要建立mapper)
分别建立role,user的bean。
public class User { private int id; private String username; private Sting password; private Date birthday; private List<Role> roleList; //当前用户拥有哪些角色,映射关系只需做一个即可,不用再role中建立, }
在UserMapper中
@Select(“select * from user”) @Results({ @Result(id=true,column="id",property="id"), @Result(column="username" ,property="username"), @Result(property="roleList",column="id", // 将id传入查询 javaType=List.class, many=@Many(select = "cn.taotao.mapper.RoleMapper.findByUid") // 对应下面的接口查询 ) }) public List<User> findUserAndRoleAll();
建立RoleMapper,这个查询是关键,关联两张表,根据uid查询出所有的角色信息
@Select("select * from user_role ur,role r where ur.roleId=r.id and ur.userId=#{uid}") public List<Role> findByUid(int uid)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~