Mybatis学习

2023-11-15

mybatis面向接口编程

1.mybatis配置文件

<configuration>
  
     <properties resource="db.properties">  </properties>
     <typeAliases>
     <package name="com.yc.po"></package>
     </typeAliases>
     
    <environments default="development">
  
    <environment id="development">
      <transactionManager type="JDBC"/>
      
      <dataSource type="POOLED">
     
        <property name="driver" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>    
      </dataSource>
    
    </environment>   
  </environments>

  <mappers>
    <mapper resource="com/yc/dao/UserMapper.xml"/>
  </mappers>
   
</configuration>

一:mybatis配置文件的解释:

1.mysql配置文件的引入:

<properties resource="db.properties">  </properties>

2.给com.yc.po这个包创别名,别名默认是类名首字母大小写均可;此处定义后,本项目下的xxmapper.xml中就可以使用别名,不用使用全路径;

 <typeAliases>
     <package name="com.yc.po"></package>
     </typeAliases>

3.生态环境搭建 可为mysql 和oracle等 <environments default="development"> 为选择哪种环境

<environments default="development">
  
    <environment id="development">
      <transactionManager type="JDBC"/>
      
      <dataSource type="POOLED">
     
        <property name="driver" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>    
      </dataSource>
    
    </environment>   
  </environments>

4.配置mapper映射,resource代表xxmapper.xml 的路径,class 代表与xxmapper.xml映射的接口的全路径 package 中 name是接口包名的全路径.,此处是将xxmapper,xml与该配置联系起来,用于以后

inputStream=Resources.getResourceAsStream("mybatis-config.xml");
		//创建sqlsessionfactory
		factory=new SqlSessionFactoryBuilder().build(inputStream);
		
创建工厂时能加载到xxmapper.xml配置文件

  <mappers>
    <mapper resource="com/yc/dao/UserMapper.xml"/>
    <mapper class="com.yc.dao.UserMapper"/>
    <package name="com.yc.dao"/> <!-- 批量处理 -->
  </mappers>

二:构建mapper映射

 <mapper namespace="com.yc.dao.UserMapper">
  <select id="findById" resultType="userPO">
  select * from tb_user where usid= #{id}  
  </select>
  <insert id="addUser" parameterType="UserPO">
  insert into tb_user (uname,pwd) values(#{uname},#{pwd})
  </insert>
  
  </mapper>

1.命名空间:

 <mapper namespace="com.yc.dao.UserMapper">

作用:
1.将sql进行隔离,每个mapper.xml对应一个命名空间
2.将命名空间设置为定义sql语句方法的定义接口的路径 就可以使用mapper代理找到该接口

2.方法类型
<select> </select>对应查找 等等,id对应接口中方法名,resultType对应返回值类型,当返回值类型是包装类时查询的列名必须和包装类的属性名一致,完全不一致不创建对象接收数据,部分一致时创建对象接收相同数据,其他不同数据不接收,parameterType=“UserPO” 代表参数类型 ,#{} 设置参数 相当于预加载的占位符? 如果传入类型为基本数据类型{}里面的参数名自定义,但是如果是包装类必须为包装类的属性名;

<select id="findById" resultType="userPO">
  select * from tb_user where usid= #{id}  
  </select>

三.sql语句传入参数parameterType,parameterMap和返回结果参数resultType,resultMap的注意事项

传入参数:
1.parameterType;
2.parameterMap;

parameterType:可为基本数据类型,包装类;
parameterMap:为map<K,V>

1.为基本类型时如果传入多个参数xxmapper.xml中的sql语句的参数就不可像单个参数那样任意命名

  <select id="findById" resultType="userPO">
  select * from tb_user where usid= #{id}  
  </select>

<1>上述为单个基本类型参数 #{}中参数名可随意定义

  <insert id="addUser2"  databaseId="mysql">
          insert into tb_user  values(null,#{param1},#{param2})
          </insert>

<2>上述为多个基本类型参数#{}中参数只能用 param1 ,param2…paramN来定位参数
这是由底层代码用Map<KEY,VALUE >来实现的 Map<param1,“你输入的第一个参数”>,Map<param2,“你输入的第一二参数”>…

2.传入参数为包装类时

<insert id="addUser" parameterType="UserPO" databaseId="mysql">
  insert into tb_user  values(null,#{uname},#{pwd})
  </insert>

传入参数必须与包装类对象的属性名一一对应

3.可以使用自定义Map<k,v>来当传入参数
表名甚至都可以用参数传入

    <select id="findByMap" resultType="userPO" databaseId="mysql">
 select *from ${tableName} where usid=${uname} and uname=#{pwd}
  </select>

在测试类中自定义Map
Map<String,Object>map=new HashMap<String,Object >();
map.put(“tableName”,“tb_user”);
map.put(“uname”, “yc”);
map.put(“pwd”, " ‘a’ ");

${}与#{}的区别:

${}:等价于字符串的拼接
设值时如果是字符串 要加’ ’ map.put(“pwd”, " ‘a’ ");

如图所示它会将表名tb_user 和usid 的值给设置进去

而#{}相当于占位符只会设置成?运行时赋值

在这里插入图片描述

返回参数:
1.resultType;
2.resultMap;

resultType:
1.如果是查数量count 只能返回一列
不然不知道该返回哪个值给count函数

如:
select count(*) from tb_user;

2.如果返回类型是包装类
列名必须与属性名一致,sql语句中不能为列定别名,如果想定别名需用到reslutMap进行配置
如:

select uname u_name from tb_user;

u_name 就是uname的别名;

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

这样使用mybatis中查询不到,因为它无法定位到u_name,数据库中只有列名uname;

5.主键自增:

在这里插入图片描述

resultMap的配置:

//type:结果映射到UserInfoPO这个po对象类中
//id: 这个映射的唯一标识,后面调用该映射会用到
<resultMap type="UserInfoPO" id="myuserStep">
   
   <id column="uid"  property="uid" />//column:数据库列名而且是唯一标识,property:po对象中与column相对应的属性名,如果多个列名才能标识一条记录就配置多个<id/>
 <result column="uname" property="uname"/>//<result />是你要得到的数据库其他非唯一标识的列名;
 <result column="upwd" property="upwd"/>
 <result column="usex" property="usex"/>
 <result column="uemail" property="uemail"/>
   <discriminator javaType="String" column="usex">//相当于java中switch判断语句 column根据那一列的数据判断 
   <case value="女" resultType="UserInfoPO">//value:判断的条件
    <!-- association 进行分步查询:
  1.根据ID查看用户信息
  2.根据用户信息中tid值去类型表查看类型信息
  3.将查询的类型信息设置到用户信息中
  
   -->
    <association property="typeinfo" select="com.yc.dao.TypeInfoMapper.findById" column="tid">//association :进行分步查询
    //一查询能延迟加载,延迟加载要去mybatisConfig.xml中配置setting;	<settings>
	//	<setting name="lazyLoadingEnabled" value="true"/>
	//	<setting name="aggressiveLazyLoading" value="false"/> 
    //    </settings>
//------------------------------------------------------------


  </association>
   </case>
    <case value="男" resultType="UserInfoPO">
     <id column="uid"  property="uid" />
 <result column="uname" property="uname"/>
 <result column="upwd" property="upwd"/>
 <result column="usex" property="usex"/>
 <result column="uname" property="uemail"/>
   </case>
   
  </discriminator>
  
   
  

   </resultMap>
   <!-- public UserInfoPO findUserStep(Integer id); -->
   <select id="findUserStep" resultMap="myuserStep">//resultMap:根据id调用上述resultMap的配置
   select *from tb_userinfo where uid=#{id}
   </select>

配置一对多的关系

 <resultMap type="TypeInfoPO" id="mytype">
   
   <id column="tid"  property="tid" />
 <result column="tname" property="tname"/>
 <!-- collection 嵌套结果集的封装规则
 property="users" 指定属性  ofType="UserInfoPO"
  -->
  
   <collection property="users" ofType="UserInfoPO">
  <!-- 定义集合中元素的封装规则 -->
  <result column="uname" property="uname"/>
 <result column="upwd" property="upwd"/>
 <result column="usex" property="usex"/>
 <result column="uemail" property="uemail"/>
   </collection>

   </resultMap>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mybatis学习 的相关文章

  • 管理概论笔记

    前言 本文章属于在听课时做的笔记 第一周 管理导论 来源 管理概论 浙江大学 邢以群 MOOC 学习理论的目的是为了能够做没有学过的人做不了的事情或者比他们做得更好 一 管理及其功能 介绍什么是管理以及为什么需要管理 观念决定行为 行为决定

随机推荐

  • GBDT的正则化及与XGBOOST区别

    1 GBDT的正则化 和Adaboost一样 我们也需要对GBDT进行正则化 防止过拟合 GBDT的正则化主要有三种方式 第一种是和Adaboost类似的正则化项 即步长 learning rate 定义为 对于前面的弱学习器的迭代 fk
  • Shiro中Session和Cache

    Session是一种状态保持机制 参考文章Session是什么可知Session和Web服务也没有必然关系 Shiro本身的Security Manager也可以脱离Servlet自己管理Session 根据Security Manager
  • 13-3 动态链接库的编译和使用

    1 静态链接库与动态链接库 由于静态链接库不能共享 且依赖的符号的对应目标文件与主程序文件需要一同编译 故静态链接库内存空间占用较大 而动态链接库具有共享性质 通过特定路径即可引用 可以有效减少内存空间的占用 此外 可使用 ldd 命令查看
  • ubuntu16.04.1安装xrdp实现远程桌面访问

    之前测试过xfce4桌面 但是其实ubuntu16 04 1默认的unity桌面也是可以的 首先需要安装 tigervncserver 1 6 80 wget c http www c nergy be downloads tigervnc
  • python刷题第七周

    以下是有所收获的题目 第一题 第5章 2 图的字典表示 20 分 图的字典表示 输入多行字符串 每行表示一个顶点和该顶点相连的边及长度 输出顶点数 边数 边的总长度 比如上图0点表示 O A 2 B 5 C 4 用eval函数处理输入 ev
  • 服务器网站5m带宽在线多少人?

    同时访问一个网站的人数是在线的 这由许多因素决定 包括服务器带宽 质量和同时访问您的网站的人数有关的网站类型 若使用的是独享5M带宽 即5Mbit s 相应云服务器的数据最高传输速度应为5Mbit s x 1024 8 640KB 1分钟流
  • 面试官问:Redis 分布式锁如何自动续期?

    资深面试官 你们项目中的分布式锁是怎么实现的 老任 基于redis的set命令 该命令有nx和ex选项 资深面试官 那如果锁到期了 业务还没结束 如何进行自动续期呢 老任 这个 面试官 您上个问题是啥来着 资深面试官 你们项目中分布式锁是怎
  • springboot之乐观锁和悲观锁

    适用场景 悲观锁 比较适合写入操作比较频繁的场景 如果出现大量的读取操作 每次读取的时候都会进行加锁 这样会增加大量的锁的开销 降低了系统的吞吐量 乐观锁 比较适合读取操作比较频繁的场景 如果出现大量的写入操作 数据发生冲突的可能性就会增大
  • python_mysql

    pymysql模块 pip3 install pymysql pymysql使用流程 1 建立数据库连接 db pymysql connect 2 创建游标对象 cur db cursor 3 游标方法 cur execute insert
  • 网络安全-跨站请求伪造(CSRF)的原理、攻击及防御

    目录 简介 原理 举例 漏洞发现 链接及请求伪造 CSRF攻击 不同浏览器 未登录状态 登录状态 代码查看 工具 防御 用户 程序员 简介 跨站请求伪造 Cross site request forgery 也被称为 one click a
  • 二进制、八进制、十进制、十六进制之间的相互转换

    一 二进制 八进制 十六进制转换为十进制 方法 位权求和法 二进制用符号 B 表示 十进制用符号 D 表示 八进制用符号 O 表示 十六进制用符号 H 表示 100101 10111 B 1 2 5 0 2 4 0 2 3 1 2 2 0
  • OpenGL渲染字体的批处理操作

    一 问题描述 在OpenGL中 绘制字体通过纹理贴图的方式 一个场景中有200个单词 按照正常做法 一个单词生成一个贴图 指定Quad四个顶点纹理坐标 最后把数据传给OpenGL 进行绘制 OpenGL顶点数组是客户端 服务器模式 客户端是
  • 删除报错不能删除myeclipse或者eclipse项目方法

    当在myeclipse创建了项目 想删除的时候 发现删除不了 终极的解决方法如下 一 删除myeclipse或者eclipse上的java项目工程 1 找到对应myeclipse工作空间 使用强力删除 粉碎文件 删除成功 2 接着回到mye
  • Ubuntu下安装egg

    http blog csdn net flydirk article details 8506463 用easy install安装就可以了 安装之前需要python setuptools sudo apt get install pyth
  • 数字图像散斑计算Matlab连续处理1/2

    数字图像散斑计算Matlab连续处理 1 数字散斑相关测量法原理 2 打开 All m 文件 设置路径 3 运行程序 输入参考图像序号 4 框选高对比度区域 下图左图 双击以结束 结果后为下图右图 5 回到命令行 输入高对比度区域裁剪位置
  • RabbitMQ(二)confirm/return机制

    程序用了1 5 3 RELEASE版本的spring boot starter amqp依赖 confirm确认机制 配置文件
  • Python介绍

    Python由荷兰数学和计算机科学研究学会的吉多 范罗苏姆 于1990 年代初设计 作为一门叫做ABC语言的替代品 1 Python提供了高效的高级数据结构 还能简单有效地面向对象编程 Python语法和动态类型 以及解释型语言的本质 使它
  • prometheus的介绍&环境搭建配置服务启动监控

    一 prometheus的介绍 环境搭建配置 1 prometheus grafana构成 2 功能简介 Prometheus是一个开源监控系统 它前身是SoundCloud的警告工具包 主要具有如下功能 多维 数据模型 时序由 metri
  • 消息队列状态:struct msqid_ds

    Linux的消息队列 queue 实质上是一个链表 它有消息队列标识符 queue ID msgget创建一个新队列或打开一个存在的队列 msgsnd向队列末端添加一条新消息 msgrcv从队列中取消息 取消息是不一定遵循先进先出的 也可以
  • Mybatis学习

    mybatis面向接口编程 1 mybatis配置文件