IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Mybatis注解开发 -> 正文阅读

[Java知识库]Mybatis注解开发

1. MyBatis的常用注解

  • 这几年来注解开发越来越流行,Mybatis也可以使用注解开发方式,这样我们就可以减少编写Mapper映射文件了。我们先围绕一些基本的CRUD来学习,再学习复杂映射多表操作。
@Insert:实现新增
@Update:实现更新
@Delete:实现删除
@Select:实现查询
@Result:实现结果集封装
@Results:可以与@Result 一起使用,封装多个结果集
@One:实现一对一结果集封装
@Many:实现一对多结果集封装

2. MyBatis的增删改查

完成简单的user表的增删改查的操作

  • 修改MyBatis的核心配置文件,使用了注解替代的映射文件,所以只需要加载使用了注解的Mapper接口即可
<mappers>
	<!--扫描使用注解的类-->
	<mapper class="com.itheima.mapper.UserMapper">
	</mapper>
</mappers>
  • 或者指定扫描包含映射关系的接口所在的包也可以
<!--加载映射关系-->
<mappers>
    <!--指定接口所在的包-->
    <package name="com.xdr630.mapper"/>
</mappers>
public interface UserMapper {

    @Insert("insert into user values(#{id},#{username},#{password},#{birthday})")
    public void save(User user);

    @Update("update user set username=#{username},password=#{password} where id=#{id}")
    public void update(User user);

    @Delete("delete from user where id=#{id}")
    public void delete(int id);

    @Select("select * from user where id=#{id}")
    public User findById(int id);

    @Select("select * from user")
    public List<User> findAll();

}
public class MyBatisTest {

    private UserMapper mapper;
    

    @Before
    public void before() throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapperConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        mapper = sqlSession.getMapper(UserMapper.class);
    }


    @Test
    public void testSave(){
        User user = new User();
        user.setUsername("tom");
        user.setPassword("abc");
        mapper.save(user);
    }

    @Test
    public void testUpdate(){
        User user = new User();
        user.setId(8);
        user.setUsername("lucy");
        user.setPassword("123");
        mapper.update(user);
    }

    @Test
    public void testDelete(){
        mapper.delete(18);
    }

    @Test
    public void testFindById(){
        User user = mapper.findById(2);
        System.out.println(user);
    }

    @Test
    public void testFindAll(){
        List<User> all = mapper.findAll();
        for (User user : all) {
            System.out.println(user);
        }
    }

}

  • 增加
    在这里插入图片描述

  • 更新
    在这里插入图片描述

  • 删除
    在这里插入图片描述

  • 查询单条数据
    在这里插入图片描述

  • 查询全部数据
    在这里插入图片描述

3. MyBatis的注解实现复杂映射开发

  • 实现复杂关系映射之前可以在映射文件中通过配置<resultMap>来实现,使用注解开发后,可以使用@Results注解,@Result注解,@One注解,@Many注解组合完成复杂关系的配置
    在这里插入图片描述
    在这里插入图片描述

4. 一对一查询

4.1 一对一查询的模型

  • 用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户
  • 一对一查询的需求:查询一个订单,与此同时查询出该订单所属的用户
    在这里插入图片描述

4.2 一对一查询的语句

SELECT *,o.id oid 
FROM orders o, user u
WHERE o.uid=u.id

在这里插入图片描述

4.3 创建Order和User实体

public class User {
    private int id;
    private String username;
    private String password;
    private Date birthday;
  }  
public class Order {
	private int id;
	private Date ordertime;
	private double total;
    //当前订单属于哪一个用户
    private User user;
 }
public interface UserMapper {

    @Insert("insert into user values(#{id},#{username},#{password},#{birthday})")
    public void save(User user);

    @Update("update user set username=#{username},password=#{password} where id=#{id}")
    public void update(User user);

    @Delete("delete from user where id=#{id}")
    public void delete(int id);

    @Select("select * from user where id=#{id}")
    public User findById(int id);

    @Select("select * from user")
    public List<User> findAll();

}

4.4 使用注解配置Mapper接口

public interface OrderMapper {

    @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();

}
  • 也可以这样写:
public interface OrderMapper {

    @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, //要封装的实体类型
                    // select 属性 代表哪个接口方法获得的数据
                    one = @One(select = "com.xdr630.mapper.UserMapper.findById")
            )
    })
    public List<Order> findAll();

}

在这里插入图片描述

4.5 测试结果

public class MyBatisTest2 {

    private OrderMapper mapper;


    @Before
    public void before() throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapperConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        mapper = sqlSession.getMapper(OrderMapper.class);
    }


    @Test
    public void testSelectOrderAndUser(){
        List<Order> all = mapper.findAll();
        for (Order order : all) {
            System.out.println(order);
        }
    }
}    

在这里插入图片描述

5. 一对多查询

5.1 一对多查询的模型

  • 用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户
  • 一对多查询的需求:查询一个用户,与此同时查询出该用户具有的订单
    在这里插入图片描述

5.2 一对多查询的语句

对应的sql语句:

select * from user;
select * from orders where uid=查询出用户的id;

查询的结果如下:
在这里插入图片描述

5.3 修改User实体

public class User {
    private int id;
    private String username;
    private String password;
    private Date birthday;

    //描述当前用户存在哪些订单
    private List<Order> orderList;
}

5.4 使用注解配置Mapper

public interface UserMapper {

    @Select("select * from user")
    @Results({
            @Result(column = "id", property = "id"),
            @Result(column = "username", property = "username"),
            @Result(column = "password", property = "password"),
            @Result(
                    property = "orderList",
                    column = "id",
                    javaType = List.class,
                    many = @Many(select = "com.xdr630.mapper.OrderMapper.findByUid")
            )
    })
    public List<User> findUserAndOrderAll();

}
public interface OrderMapper {

    @Select("select * from orders where uid=#{uid}")
    public List<Order> findByUid(int id);

}

在这里插入图片描述

5.5 测试结果

public class MyBatisTest3 {

    private UserMapper mapper;


    @Before
    public void before() throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapperConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        mapper = sqlSession.getMapper(UserMapper.class);
    }


    @Test
    public void testfindUserAndOrderAll(){
        List<User> userAndOrderAll = mapper.findUserAndOrderAll();
        for (User user : userAndOrderAll) {
            System.out.println(user);
        }
    }

}

在这里插入图片描述

6. 多对多查询

6.1 多对多查询的模型

  • 用户表和角色表的关系为,一个用户有多个角色,一个角色被多个用户使用
  • 多对多查询的需求:查询用户同时查询出该用户的所有角色
    在这里插入图片描述

6.2 多对多查询的语句

  • 对应的sql语句:
select * from user;
select * from sys_user_role ur,sys_role r where ur.roleId=r.id AND ur.userId=用户id
  • 查询的结果如下:
    在这里插入图片描述

6.3 创建Role实体,修改User实体

public class Role {
    private int id;
    private String roleName;
    private String roleDesc;
}
public class User {
    private int id;
    private String username;
    private String password;
    private Date birthday;

    //描述的是当前用户具备哪些角色
    private List<Role> roleList;
}    

6.4 使用注解配置Mapper

public interface UserMapper {

    @Select("select * from user")
    @Results({
            @Result(column = "id", property = "id"),
            @Result(column = "username", property = "username"),
            @Result(column = "password", property = "password"),

            @Result(
                    property = "roleList",
                    column = "id",
                    javaType = List.class,
                    many = @Many(select = "com.xdr630.mapper.RoleMapper.findByUid")
            )

    })
    public List<User> findUserAndRoleAll();
}
public interface RoleMapper {

    @Select("select * from sys_user_role ur,sys_role r where ur.roleId=r.id AND ur.userId=#{uid}")
    public List<Role> findByUid(int uid);
}

在这里插入图片描述

6.5 测试结果

public class MyBatisTest4 {

    private UserMapper mapper;

    @Before
    public void before() throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapperConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        mapper = sqlSession.getMapper(UserMapper.class);
    }

    @Test
    public void testfindByUid(){
        List<User> userAndRoleAll = mapper.findUserAndRoleAll();
        for (User user : userAndRoleAll) {
            System.out.println(user);
        }
    }

}

在这里插入图片描述

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-04-14 23:36:51  更:2022-04-14 23:43:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:21:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码