Java Mybatis框架多表操作与注解开发详解分析

网友投稿 419 2022-09-19


Java Mybatis框架多表操作与注解开发详解分析

目录一对一查询多对多查询Mybatis的注解开发Mybatis的增删查改MyBatis的注解实现复杂映射开发

一对一查询

一对一查询的模型

用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户。

一对一查询的需求:查询一个订单,与此同时查询出该订单所属的用户

一对一查询的语句

对应的sql语句: select * from orders o,user u where o.uid=u.id;查询的结果如下:

创建Order和User实体

创建OrderMapper接口

public interface OrderMapper {

//查询全部的方法

public List findAll();

}

配置OrderMapper.xml

http://

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

配置UserMapper.xml

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

SELECT * FROM USER u,sys_user_role ur,sys_role r WHERE u.id=ur.userId AND ur.roleId=r.id

配置sqlMapConfig.xml

测试代码

@Test

public void test1() throws IOException {

InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);

SqlSession sqlSession = sqlSessionFactory.openSession();

OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);

List orderList = mapper.findAll();

for (Order order : orderList) {

System.out.println(order);

}

sqlSession.close();

}

一对多查询

一对多查询模型

用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户一对多查询的需求:查询一个用户,与此同时查询出该用户具有的订单

对应的sql语句: select *,o.id oid from user u left join orders o on u.id=o.uid;查询的结果如下:

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

修改User实体

创建UserMapper接口

配置UserMapper.xml

测试结果

多对多查询

多对多查询的模型

用户表和角色表的关系为,一个用户有多个角色,一个角色被多个用户使用多对多查询的需求:查询用户同时查询出该用户的所有角色

多对多查询的语句

对应的sql语句: select u.*,r.*,r.id rid from user u left join user_role ur on u.id=ur.user_idinner join role r on ur.role_id=r.id;

查询的结果如下:

创建Role实体,修改User实体

添加UserMapper接口方法

配置UserMapper.xml(上面)

测试代码

总结:

MyBatis多表配置方式:

一对一配置:使用做配置

一对多配置:使用+做配置

多对多配置:使用+做配置

Mybatis的注解开发

Mybatis的常用注解

这几年来注解开发越来越流行,Mybatis也可以使用注解开发方式,这样我们就可以减少编写Mapper映射文件了。我们先围绕一些基本的CRUD来学习,再学习复杂映射多表操作。

@Insert:实现新增

@Update:实现更新@Delete:实现删除@Select:实现查询

@Result:实现结果集封装

@Results:可以与@Result一起使用,封装多个结果集@One:实现一对一结果集封装

@Many:实现一对多结果集封装

Mybatis的增删查改

private UserMapper mapper;

@Before

public void before() throws IOException {

InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.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(18);

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 all = mapper.findAll();

for (User user : all) {

System.out.println(user);

}

}

修改MyBatis的核心配置文件,我们使用了注解替代的映射文件,所以我们只需要加载使用了注解的Mapper接口即可

或者指定扫描包含映射关系的接口所在的包也可以

UserMapper:

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

@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",

javaType = List.class,

many = @Many(select = "com.longdi.mapper.OrderMapper.findByUid")

)

})

public List findUserAndOrderAll();

@Select("SELECT * FROM USER")

@Results({

@Result(id = true,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.longdi.mapper.RoleMapper.findByUid")

)

})

public List findUserAndRoleAll();

}

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

实现复杂关系映射之前我们可以在映射文件中通过配置来实现,使用注解开发后,我们可以使用@Results注解,@Result注解,@One注解,@Many注解组合完成复杂关系的配置

一对一查询(使用注解配置Mapper)

测试代码:

一对多查询(使用注解配置Mapper)

测试代码;

多对多查询(使用注解配置mapper)

测试代码:


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:opsf综合应用场景(ops典型的应用场景)
下一篇:什么是 OSI 模型?(什么是数字经济)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~