当前位置:   article > 正文

Mybatis_注解开发超详细讲解_mybatis 添加注释

mybatis 添加注释

文章目录


一、Mybatis 注解的使用

在 Mybatis 中如果使用注解式开发,那么注解需要添加在 Mapper 接口中的抽象方法上,在注解中给定需要执行的 SQL 语句即可,这样就可以不需要映射配置文件。MyBatis 支持纯注解方式,支持纯映射配置文件方式,也支持注解和映射配置文件混合形式。当只有接口没有映射配置文件时在 mybatis-cfg.xml 中对于引入映射可以通过加载指定接口类。也可以使用指定加载的包。

二、 使用注解完成查询

1、查询所有用户

1.1、 修改 UsersMapper 接口

public interface UsersMapper {
    @Select("select * from users")
    List<Users> selectUsersAll();
}
  • 1
  • 2
  • 3
  • 4

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);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2.2、 POJO 传参法

    //POJO传参法
    @Select("select * from users where username = #{username} and usersex = #{usersex}")
    List<Users> selectUsersByNameAndSexPOJO(Users users);
  • 1
  • 2
  • 3

2.3、 Map 传参法

    //Map传参法
    @Select("select * from users where username = #{keyname} and usersex = #{keysex}")
    List<Users> selectUsersByNameAndSexMap(Map<String ,String >map);
  • 1
  • 2
  • 3

三、使用注解完成DML操作

1、实现添加用户操作

1.1、修改UsersMapper接口

    //添加用户
    @Insert("insert into users values(default,#{username},#{usersex})")
    int insertUsers(Users users);
  • 1
  • 2
  • 3

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();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

2、实现用户更新操作

2.1、修改UsersMapper接口

    @Update("update users set userid = #{id},username = #{name},usersex =#{sex} where username = #{prename}")
    int updateUsers2(Map<String,String>map);
  • 1
  • 2

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();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

3、实现删除用户操作

3.1、修改UsersMapper接口

    @Delete("delete from users where userid in (#{a},#{b})")
    int deleteUsers2(@Param("a") int a,@Param("b") int b);
  • 1
  • 2

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();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

四、 注解开发中的动态 SQL

在 Mybatis 中的注解开发中,对于动态 SQL 的处理是比较繁琐的,所以如果有动态 SQL的操作,建议使用映射配置文件文件方式实现。

1、脚本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
  • 3

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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();
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

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);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

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);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

1.3、 创建 RolesMapper 接口

public interface RolesMapper {

    @Select("select * from roles where user_id = #{userid}")
    Roles selectRolesByUserId(int userid);
}
  • 1
  • 2
  • 3
  • 4
  • 5

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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 +
                '}';
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

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 + ''' +
                '}';
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57

2.3、 创建 OrdersMapper 接口

public interface OrdersMapper {

    @Select("select * from orders where user_id =#{userid}")
    List<Orders> selectOrdersByUserId(int userid);
}
  • 1
  • 2
  • 3
  • 4
  • 5

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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

2.6、测试结果:

在这里插入图片描述

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

在这里插入图片描述

结束!!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/922008
推荐阅读
相关标签
  

闽ICP备14008679号