Mybatis的基础和高级查询应用实践
前言
将分为3部分介绍:基本应用基于xml的复杂映射开发Mybatis注解开发
[玫瑰][玫瑰]你的"关注 ""收藏 "是我最大的动力。非常感谢。[玫瑰][玫瑰]
#java# #数据库# #开发# #后端# 基本应用
1.快速入门
快速入门查看官网 :http://www.mybatis.org/mybatis-3
开发步骤
1.添加Mybatis的坐标(添加pom.xml依赖) org.mybatis mybatis 3.4.5 mysql mysql-connector-java 5.1.6 runtime
2.创建数据库表 + 编写实体
表设计和实体根据自己业务实际编写即可
3.编写映射文件Mapper.xml与标签说明
<?xml version="1.0" encoding="UTF-8" ?>
4.编写核心文件SqlMapConfig.xml
5.使用public static void main(String[] args){ //获取配置信息 InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml"); //获取工厂类 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); //开启sql会话 SqlSession sqlSession = sqlSessionFactory.openSession(); //开始执行对应操作 User query = new User(); query.setUsername("Tom"); int insert = sqlSession.insert("userMapper.find", query); //提交事务 //sqlSession.commit(); //CUD操作需要提交事务 //关闭会话 sqlSession.close(); }
sqlConfig.xml核心配置文件标签说明
: 数据库环境的配置,支持多种环境配置
: 环境变量
: 事务管理器,有两种类型:JDBC:使用了JDBC的提交和回滚设置,依赖于从数据源得到的链接来管理事务作用域MANAGED:这个配置几乎什么都没有做,它从不提交和回滚一个链接,而是让容器去管理事务的整个生命周期。默认情况下它会关闭连接,然后有些容器不希望关闭,所以需要将 closeConnection 属性设置为false来阻止它的默认行为
: 数据源,有三种类型:UNPOOLED:非连接池类型。这个数据源实现的只是每次请求时打开和关闭连接POOLED:连接池类型。这种数据源实现利用"池"的概念将JDBC连接对象组织起来JNDI:这个数据源实现是为了能在如EJB或者应用服务器这类的容器中使用,容器可以集中或在外部配置数据源,然后放置一个JNDI上下文引用
: 属性
: 属性该标签可以加载额外配置的properties文件,如resource文件夹下的jdbc.properties。使用方式为:${jdbc.driver} 可以引用对应的值
: 映射器,作用是加载sql的映射,有四种方式使用类路径:使用完全限定资源定位符(URL): 使用映射器接口实现类的完全限定类名: 使用包内的映射器接口实现全部注册为映射器: 基于xml复杂映射开发准备:演示说明具体的xml复杂映射开发前,需要准备一下模拟信息
- 实体
- Mapper接口实体(对应数据库表) public class User{ private Integer id; private String userName; //一个用户,有多个订单(一对多) private List orderList; //用户角色(多对多) private List roleList; }public class Order{ private Integer id; private Integer userId; private String orderTime; //一个订单,只有一个用户(一对一) private User user; }public class Role{ private Integer id; private String roleName; }public class UserRole{ private Integer userId private Integer roleid; }Mapper接口 public class OrderMapper{ List findAll(); //查询一对一 List finUserAndOrder(); }public class UserMapper{ User findById(Integer userId); //查询一对多 List findAll(); //查询多对对 List findAllUserAndRole(); }public class RoleMapper{ //查询多对对 List findByUserId(Integer userId); }
一对一查询
一对多查询
从用户角度出发,查询一对多结果;
多对多查询
用户和角色的关系,就是多对多查询;
测试复杂映射public static void main(String[] args){ //获取配置输入流 InputStream inputStream = Resources.getResourceAsSteam("splMapConfig.xml"); //获取sql会话 SqlSession sqlSession = SqlSessionFactoryBuilder.build(inputStream).openSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //执行查询 /*一对一*/ List orderList = orderMapper.finUserAndOrder(); for(Order order : orderList){ System.out.println(order) } /*一对多*/ List userList = userMapper.findAll(); for(User user : userList){ System.out.println(user) } /*多对多*/ List userList = userMapper.findAllUserAndRole(); for(User user : userList){ System.out.println(user) } sqlSession.close(); }Mybatis注解开发
常用注解:使用注解开发前,先介绍以下常用的注解@Insert 新增 @Update 更新 @Delete 删除 @Select 查询 @Result 实现结果集封装。代替了xml中的和标签,有以下属性: column 数据库的字段名 property 对应对象的属性名one 需要使用的@One注解 :@Result( one=@One ) many 需要使用@Many注解:@Result( many=@Many ) @Results 可以与@Result一起使用,封装多个结果集 代替了xml中的标签,也可以使用@Result集合,使用格式: @Results({ @Result(),@Result() })@One 一对一结果集封装
代替了标签,是多表查询的关键,在注解中用来指定子查询返回单一对象。有以下属性: select 指定用来多表查询的 sqlmapper @Result(column="",property="",one=@One(select=""))@Many 一对多结果集封装
代替了标签,是多表查询的关键,再注解中用来指定子查询返回的对象集合。有以下属性: select 指定用来多表查询的 sqlmapper @Result(column="",property="",one=@Many(select=""))
使用注解一对一查询public class OrderMapper{ //查询一对一 @Select("select * from order") @Results({ @Result(id=true,property="id",column="id"), @Result(property="userId",column="userId"), @Result(property="orderTime",column="orderTime") @Result(property="user",column="userId", javaType=User.class, one=@One(select="com.xxx.mapper.UserMapper.findById") ) }) List finUserAndOrder(); }public class UserMapper{ @Select("select * from user where id=#{userId}") User findById(Integer userId); }
使用注解一对多查询public class OrderMapper{ @Select("select * from order where userId=#{userId}") List findByUserId(Integer userId); }public class UserMapper{ //查询一对多 @Select("select * from user") @Results({ @Result(id=true,property="id",column="id"), @Result(id=true,property="username",column="username"), @Result(property="orderList",column="id", javaType=List.class, many=@Many(select="com.xxx.mapper.OrderMapper.findByUserId") }) List findAllUserAndOrder(); }
使用注解多对多查询public class UserMapper{ //查询多对对 @Select("select * from user") @Results({ @Result(id=true,property="id",column="id"), @Result(property="username",column="username"), @Result(property="roleList",column="id", javaType=List.class, many=@Many(select="com.xxx.mapper.RoleMapper.findByUserId")) }) List findAllUserAndRole(); }public class RoleMapper{ //查询多对对 @Select("select * from role r,user_role ur where r.id=ur.roleId and ur.userId = #{userId}") List findByUserId(Integer userId); }结语
以上是对mybatis的基础使用和高级用法,实际项目中,可以结合情况,使用xml查询或者使用两者结合查询都是可行的。
可以的话,麻烦"关注"一下哦。后续文章中,会继续介绍mybatis的缓存和插件机制。
快捷访问:Mybatis一级缓存和二级缓存
小米社区高管竟称自己玩的久会玩其他人没有资格指手画脚起因是小米社区高管大李同学发了一篇博文,对于小米系统的问题截取了部分好的评论后被热心的网友揭破谎言,事实是小米现在的系统优化大不如前了,论坛天天骂。后该高管只是冷冷地回了句我用的比
javalz4压缩工具类packagecom。beini。test。javase。compressimportnet。jpountz。lz4。importjava。io。importjava。nio。By
Android通知管理类通知管理类packagecom。track。beini。navtrack。utilsimportandroid。app。NotificationChannelimportandro
chromevue5。1。0安装最新公司需要用到vue,顺便学习了会,今天先写vue调试工具的安装,前提是已经配置了vue的npm开发环境通过gitclonevuedevtools源码或者下载源码压缩包gitcl
word怎么删除空白行突然有朋友问我,word空白行怎么删除我们写文档的时候经常会遇到,这里针对表格位置导致的空白行该如何处理分析原因一般像这种情况都是表格位置边距造成的,首先我们找到表格定位,看一下表
EXCEL数据分析,迷你图制作,另类的数据图表在数据分析中,迷你图可以简单直观的反应数据变化情况,其制作简单,可以对一行中一系列的数据进行数据比较和趋势分析。本文使用案例数据制作迷你图,所使用的方法有,REPT函数法,以及数据
AndroidStudio自动加入SVN版本控制如下图,新建的时候勾选了Remember,dontaskagain,点击了Cancel按钮。这就导致了之后新建的文件都无法添加到svn进行版本控制了。为了解决这个问题,我找到了AS
Win10关闭系统更新在运行输入gpedit。msc,打开本地组策略编辑器禁用配置自动更新在本地策略找到,计算机配置管理模板Windows组件Windows更新配置自动更新选择已禁用配置说明指定此计算机
CtrlEnter,1秒批量合并数据并导入数据库的办法,你学会了吗?在日常数据分析的业务场景下,我们经常会遇到以下难题如何批量导入不同工作簿不同Sheet表下的数据?如何将这些不同Sheet表下的数据合并为一个数据?如何将合并的数据导入数据库?本文
从零开始学SQL数据分析,SQL数据清洗获取数据后,对数据的清洗工作必不可少,常用的数据清洗方法主要有缺失值填充数值替换数据类型转换数据分列重复值处理等,清洗的数据结果直接影响最后数据分析的结果,一个成熟的数据分析师,在
从零开始学SQL数据分析,SQL数据表的查看拿到一张数据表时,通常要预览数据表的整体情况,不能盲目地做分析,首先查看数据表的数据量大小,包含行数列数,空白数据有多少异常数据有多少,查看某列数据的唯一值等,下面一起来学习。本文