文章目录
- 一、Mybatis 注解的使用
 - 二、 使用注解完成查询
 - 三、使用注解完成DML操作
 - 四、 注解开发中的动态 SQL
 - 五、 注解开发中的映射处理
 - 六、 注解开发中的多表关联查询
 - 七、 注解开发与映射配置文件的对比
 
一、Mybatis 注解的使用
在 Mybatis 中如果使用注解式开发,那么注解需要添加在 Mapper 接口中的抽象方法上,在注解中给定需要执行的 SQL 语句即可,这样就可以不需要映射配置文件。MyBatis 支持纯注解方式,支持纯映射配置文件方式,也支持注解和映射配置文件混合形式。当只有接口没有映射配置文件时在 mybatis-cfg.xml 中对于引入映射可以通过加载指定接口类。也可以使用指定加载的包。
二、 使用注解完成查询
1、查询所有用户
1.1、 修改 UsersMapper 接口
public interface UsersMapper {
    @Select("select * from users")
    List<Users> selectUsersAll();
}
 
1.2、 创建测试类
public class SelectUsersAllTest {
    public static void main(String[] args) {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);
        List<Users> list = usersMapper.selectUsersAll();
        list.forEach(System.out::println);
    }
}
 
2、注解式开发时的参数传递
2.1、 顺序传参法
    //顺序传参法
    @Select("select * from users where username = #{param1} and usersex = #{param2}")
    List<Users> selectUsersByNameAndSexOrder(String username,String usersex);
    @Select("select * from users where username = #{name} and usersex = #{sex}")
    List<Users> selectUsersByNameAndSexOrder2(@Param("name") String username, @Param("sex") String usersex);
 
2.2、 POJO 传参法
    //POJO传参法
    @Select("select * from users where username = #{username} and usersex = #{usersex}")
    List<Users> selectUsersByNameAndSexPOJO(Users users);
 
2.3、 Map 传参法
    //Map传参法
    @Select("select * from users where username = #{keyname} and usersex = #{keysex}")
    List<Users> selectUsersByNameAndSexMap(Map<String ,String >map);
 
三、使用注解完成DML操作
1、实现添加用户操作
1.1、修改UsersMapper接口
    //添加用户
    @Insert("insert into users values(default,#{username},#{usersex})")
    int insertUsers(Users users);
 
1.2、创建测试类
public class InsertUsers2Test {
    public static void main(String[] args) {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);
        Map<String ,String > map = new HashMap<>();
        map.put("name","yiyi");
        map.put("sex","famale");
        int flag = usersMapper.insertUsers2(map);
        System.out.println(flag);
        sqlSession.commit();
    }
}
 
2、实现用户更新操作
2.1、修改UsersMapper接口
    @Update("update users set userid = #{id},username = #{name},usersex =#{sex} where username = #{prename}")
    int updateUsers2(Map<String,String>map);
 
2.2、创建测试类
public class UpdateUsers2Test {
    public static void main(String[] args) {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);
        Map<String,String> map = new HashMap<>();
        map.put("id","3");
        map.put("name","nine");
        map.put("sex","female");
        map.put("prename","kkkkkkkkkkk");
        int flag = usersMapper.updateUsers2(map);
        System.out.println(flag);
        sqlSession.commit();
    }
}
 
3、实现删除用户操作
3.1、修改UsersMapper接口
    @Delete("delete from users where userid in (#{a},#{b})")
    int deleteUsers2(@Param("a") int a,@Param("b") int b);
 
3.2、创建测试类
public class DeleteUsers2Test {
    public static void main(String[] args) {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);
        int flag = usersMapper.deleteUsers2(12,17);
        System.out.println(flag);
        sqlSession.commit();
    }
}
 
四、 注解开发中的动态 SQL
在 Mybatis 中的注解开发中,对于动态 SQL 的处理是比较繁琐的,所以如果有动态 SQL的操作,建议使用映射配置文件文件方式实现。
1、脚本SQL
在 <script> 标签中通过动态 SQL 的标签完成动态 SQL 的拼接。
1.1、 修改 UsersMapper 接口
    //动态SQL查询
    @Select("<script>select * from users where 1=1 <if test=\"username != null and username != ''\"> and username = #{username}</if> <if test=\"usersex != null and usersex != ''\">and usersex = #{usersex}</if></script>")
    List<Users> selectUsersByProperty(Users users);
 
1.2、 创建测试类
public class SelectUsersByPropertyTest {
    public static void main(String[] args) {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);
        Users users = new Users();
        users.setUsername("aaaaaa");
        users.setUsersex("male");
        List<Users> list = usersMapper.selectUsersByProperty(users);
        list.forEach(System.out::println);
    }
}
 
1.3、运行结果:

2、在方法中构建 SQL
在 MyBatis3 的注解中包含了@SelectProvider、@UpdateProvider、@DeleteProvider、@InsertProvider,这些注解统称为 SqlProvider,它们分别对应着查询、修改、删除、新增操作。当使用这些注解时将不在注解中直接编写 SQL,而是调用某个类的特定方法来生成 SQL。
2.1、 修改 UsersMapper 接口
    //在方法中构建SQL
    @SelectProvider(type = UsersMapperProvider.class,method = "selectUsersByPropertySQL")
    List<Users> selectUsersByPropertyProvider(Users users);
    class UsersMapperProvider{
        //生成动态SQL
        public String selectUsersByPropertySQL(Users users){
            StringBuffer sb = new StringBuffer("select * from users where 1=1 ");
            if (users.getUsername() != null && users.getUsername() !=""){
                sb.append(" and username = #{username}");
            }
            if (users.getUsersex() != null && users.getUsersex() != ""){
                sb.append(" and usersex = #{usersex}");
            }
            return sb.toString();
        }
    }
 
2.2、 创建测试类
public class SelectUsersByPropertyProviderTest {
    public static void main(String[] args) {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);
        Users users = new Users();
        users.setUsername("aaaaaa");
        users.setUsersex("male");
        List<Users> list = usersMapper.selectUsersByPropertyProvider(users);
        list.forEach(System.out::println);
    }
}
 
2.3、运行结果:

五、 注解开发中的映射处理
在 Mybatis 中的注解开发中,对于结果集的映射处理也是比较繁琐的,所以如果有结果集映射操作,建议使用映射配置文件文件方式实现。
1、映射注解介绍
1.1、 @Results 注解

1.2、 @Result 注解

1.3、 @ResultMap 注解
可通过该注复用其他方法上的映射配置
 value: 指定其他@Results 的 id 的值。
2、通过注解实现结果集与对象映射
2.1、 修改 UsersMapper 接口
    //结果集映射
    @Select("select userid as id,username as name,usersex as sex from users where userid = #{userid}")
    @Results(id = "usersMapper" ,value = {
            @Result(id = true,property = "userid",column = "id"),
            @Result(property = "username",column = "name"),
            @Result(property = "usersex",column = "sex")
    })
    Users selectUsersByIdMapper(int userid);
    @Select("select userid as id,username as name,usersex as sex from users where userid = #{userid}")
    @ResultMap(value = {"usersMapper"})
    Users selectUsersByIdMapper2(int userid);
 
2.2、 创建测试类
public class SelectUsersByIdMapperTest {
    public static void main(String[] args) {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);
        //Users users = usersMapper.selectUsersByIdMapper(1);
        Users users = usersMapper.selectUsersByIdMapper2(1);
        System.out.println(users);
    }
}
 
2.3、运行结果:

六、 注解开发中的多表关联查询
在 Mybatis 的注解开发中对于多表查询只支持 N+1 次查询,不支持连接查询。
1、一对一的关联查询
1.1、 创建 Roles 实体
public class Roles {
    private int roleid;
    private String rolename;
    public int getRoleid() {
        return roleid;
    }
    public void setRoleid(int roleid) {
        this.roleid = roleid;
    }
    public String getRolename() {
        return rolename;
    }
    public void setRolename(String rolename) {
        this.rolename = rolename;
    }
    @Override
    public String toString() {
        return "Roles{" +
                "roleid=" + roleid +
                ", rolename='" + rolename + '\'' +
                '}';
    }
}
 
1.2、 修改 Users 实体
public class Users {
    private int userid;
    private String username;
    private String usersex;
    private Roles roles;
    public Roles getRoles() {
        return roles;
    }
    public void setRoles(Roles roles) {
        this.roles = roles;
    }
    public int getUserid() {
        return userid;
    }
    public void setUserid(int userid) {
        this.userid = userid;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getUsersex() {
        return usersex;
    }
    public void setUsersex(String usersex) {
        this.usersex = usersex;
    }
    @Override
    public String toString() {
        return "Users{" +
                "userid=" + userid +
                ", username='" + username + '\'' +
                ", usersex='" + usersex + '\'' +
                '}';
    }
}
 
1.3、 创建 RolesMapper 接口
public interface RolesMapper {
    @Select("select * from roles where user_id = #{userid}")
    Roles selectRolesByUserId(int userid);
}
 
1.4、 修改 UsersMapper 接口
    //一对一的关联查询
    @Select("select * from users where userid =#{userid}")
    @Results(id = "usersAndRolesMapper",value = {
            @Result(id = true,property = "userid",column = "userid"),
            @Result(property = "username",column = "username"),
            @Result(property = "usersex",column = "usersex"),
            @Result(property = "roles",column = "userid",one = @One(select = "com.bjsxt.mapper.RolesMapper.selectRolesByUserId"))
    })
    Users selectUsersAndRolesByUserId(int userid);
 
1.5、 创建测试类
public class SelectUsersAndRolesByUserIdTest {
    public static void main(String[] args) {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);
        Users users = usersMapper.selectUsersAndRolesByUserId(1);
        System.out.println(users);
        Roles roles = users.getRoles();
        System.out.println(roles);
    }
}
 
1.6、运行结果:

2、一对多的关联查询
2.1、 创建 Orders 实体
public class Orders {
    private int orderid;
    private double orderprice;
    public int getOrderid() {
        return orderid;
    }
    public void setOrderid(int orderid) {
        this.orderid = orderid;
    }
    public double getOrderprice() {
        return orderprice;
    }
    public void setOrderprice(double orderprice) {
        this.orderprice = orderprice;
    }
    @Override
    public String toString() {
        return "Orders{" +
                "orderid=" + orderid +
                ", orderprice=" + orderprice +
                '}';
    }
}
 
2.2、 修改 Users 实体
public class Users {
    private int userid;
    private String username;
    private String usersex;
    private Roles roles;
    private List<Orders> orders;
    public List<Orders> getOrders() {
        return orders;
    }
    public void setOrders(List<Orders> orders) {
        this.orders = orders;
    }
    public Roles getRoles() {
        return roles;
    }
    public void setRoles(Roles roles) {
        this.roles = roles;
    }
    public int getUserid() {
        return userid;
    }
    public void setUserid(int userid) {
        this.userid = userid;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getUsersex() {
        return usersex;
    }
    public void setUsersex(String usersex) {
        this.usersex = usersex;
    }
    @Override
    public String toString() {
        return "Users{" +
                "userid=" + userid +
                ", username='" + username + '\'' +
                ", usersex='" + usersex + '\'' +
                '}';
    }
}
 
2.3、 创建 OrdersMapper 接口
public interface OrdersMapper {
    @Select("select * from orders where user_id =#{userid}")
    List<Orders> selectOrdersByUserId(int userid);
}
 
2.4、 修改 UsersMapper 接口
    //一对多的关联查询
    @Select("select * from users where userid = #{userid}")
    @Results(id = "usersAndOrdersMapper",value = {
            @Result(id = true,property = "userid",column = "userid"),
            @Result(property = "username",column = "username"),
            @Result(property = "usersex",column = "usersex"),
            @Result(property = "orders",column = "userid",many = @Many(select = "com.bjsxt.mapper.OrdersMapper.selectOrdersByUserId",fetchType = FetchType.LAZY))
    })
    Users selectUsersAndOrdersByUserId(int userid);
 
2.5、 创建测试类
public class SelectUsersAndOrdersByUserIdTest {
    public static void main(String[] args) {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);
        Users users = usersMapper.selectUsersAndOrdersByUserId(1);
        System.out.println(users);
        List<Orders> list = users.getOrders();
        list.forEach(System.out::println);
    }
}
 
2.6、测试结果:

七、 注解开发与映射配置文件的对比

结束!!









