MyBatis入门的详细应用实例

目录

  • MyBatis
    • 第一章:代理Dao方式的CRUD操作
      • 1. 代理Dao方式的增删改查
    • 第二章:MyBatis参数详解
      • 1. parameterType
      • 2. resultType
    • 第三章:SqlMapConfig.xml配置文件
      • 1. 定义properties标签的方式管理数据库的信息
      • 2. 类型别名定义

MyBatis

第一章:代理Dao方式的CRUD操作

1. 代理Dao方式的增删改查

  1. 创建项目

  2. UserMapper接口代码

    findAll 方法用于获取所有用户的信息,将以 List<User> 形式返回。

    findById 是根据用户的唯一标识(userId)查找用户信息,返回单个 User 对象。insert 方法接收一个 User 对象作为参数,将其存储到数据库中。

    update 方法用于更新用户信息,接收一个 User 对象,通过对象的属性值更新数据库中对应记录。

    delete 方法依据用户 ID 删除相应记录,接收一个 Integer 类型的用户 ID。findByName 可根据用户名进行查找,以字符串形式接收用户名,结果以 List<User> 形式返回,适用于模糊查询或精确查询。

    findByCount 方法计算用户的总数,结果以 Integer 类型返回。

    package cn.tx.mapper;import java.util.List;import cn.tx.domain.User;public interface UserMapper {public List<User> findAll();public User findById(Integer userId);public void insert(User user);public void update(User user);public void delete(Integer userId);public List<User> findByName(String username);public Integer findByCount();}
    
  3. UserMapper.xml的配置文件代码

    元素的 namespace 属性绑定到对应的 UserMapper 接口,确保 XML 中的操作与接口方法关联。

    元素中的 findAll 操作,使用 select * from user 语句查询所有用户,结果将映射为 com.qcbyjy.domain.User 类型的对象。

    findById 的 select 操作通过 #{id} 占位符接收 findById 方法传入的用户 ID,查询结果映射为 com.qcbyjy.domain.User 类型,参数为 int 类型。

    insert 操作除了插入数据的 SQL 语句外,使用 元素在插入操作后执行,通过 select last_insert_id() 获取新插入记录的主键值,keyProperty 指明将主键值存储在 User 对象的 id 属性中,order=“AFTER” 表示在插入之后执行,resultType 为 Integer。

    update 操作使用 #{} 占位符接收 update 方法传入的 User 对象的属性,更新用户表中相应记录。

    delete 操作使用 #{id} 接收 delete 方法传入的用户 ID,删除相应记录。

    findByName 操作的 select 语句使用 like ‘%${value}%’ 进行模糊查询,其中 ${value} 接收 findByName 方法传入的用户名,存在 SQL 注入风险,不推荐使用。

    findByCount 操作通过 select count(*) from user 统计用户表中的记录数,结果为 int 类型。

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.qcbyjy.mapper.UserMapper"><select id="findAll" resultType="com.qcbyjy.domain.User">select * from user</select><!-- 通过id查询 SQL语句使用#{占位符的名称,名称可以任意},仅限于基本数据类型和String类型--><select id="findById" resultType="com.qcbyjy.domain.User" parameterType="int">select * from user where id = #{id};</select><!--保存操作--><insert id="insert" parameterType="com.qcbyjy.domain.User">/*keyProperty表示要返回的属性名称order取值AFTER表示插入数据后的行为resultType表示返回值的类型*/<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">select last_insert_id();</selectKey>insert into user (username,birthday,sex,address) values (#{username},#{birthday},#{sex},#{address})</insert><!-- 修改 --><update id="update" parameterType="com.qcbyjy.domain.User">update user set username = #{username},birthday = #{birthday},sex = #{sex},address=#{address} where id = #{id}</update><!-- 删除 --><delete id="delete" parameterType="Integer">delete from user where id = #{id}</delete><!-- 模糊查询 --><select id="findByName" resultType="com.qcbyjy.domain.User" parameterType="string"><!-- 第一种方式的SQL语句 select * from user where username  like #{username}--><!-- 第二章SQL语句的编写 强调:'%${value}%'不能修改,固定写法(不推荐使用)  -->select * from user where username  like '%${value}%'</select><!-- 具体函数的查询 --><select id="findByCount" resultType="int">select count(*) from user</select></mapper>
    
  4. UserTest的代码

    • init 方法中,首先使用 Resources.getResourceAsStream("SqlMapConfig.xml") 从类路径加载配置文件,然后使用 SqlSessionFactoryBuilder 创建 SqlSessionFactory,进而创建 SqlSession,最终通过 session.getMapper(UserMapper.class) 获取 UserMapper 的代理对象。
    • @Before 注解的 init 方法中进行资源的初始化,在 @After 注解的 destory 方法中关闭输入流和 SqlSession,确保资源的正确管理。
    • testFindAll 测试方法调用 mapper.findAll() 方法查询所有用户,将结果存储在 List<User> 中并遍历打印。
    • testFindById 测试方法调用 mapper.findById(41) 查找 ID 为 41 的用户并打印。
    • testInsert 测试方法创建一个新的 User 对象,设置属性,调用 mapper.insert(user) 插入用户,使用 session.commit() 提交事务,并打印新插入用户的 id
    • testUpdate 测试方法先查找用户,修改用户信息,调用 mapper.update(user) 更新用户信息,再提交事务。
    • testDelete 测试方法调用 mapper.delete(48) 删除 ID 为 48 的用户,提交事务。
    • testFindByName 测试方法有两种方式,第一种传入 %王% 进行模糊查询,第二种只传入 ,根据配置自动添加通配符进行模糊查询,都将结果存储在 List<User> 中并遍历打印。
    • testFindByCount 测试方法调用 mapper.findByCount() 获取用户数量并打印。
    package cn.tx.test;import java.io.IOException;
    import java.io.InputStream;
    import java.util.Date;
    import java.util.List;import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;import cn.tx.domain.User;
    import cn.tx.mapper.UserMapper;public class UserTest {private InputStream in;private SqlSession session;private UserMapper mapper;@Beforepublic void init() throws Exception {// 加载配置文件in = Resources.getResourceAsStream("SqlMapConfig.xml");// 创建工厂对象SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);// 创建Session对象session = factory.openSession();// 获取到代理对象mapper = session.getMapper(UserMapper.class);}@Afterpublic void destory() throws IOException {in.close();session.close();}/*** 测试查询所有的方法* @throws Exception */@Testpublic void testFindAll() throws Exception {List<User> list = mapper.findAll();// 遍历for (User user : list) {System.out.println(user);}in.close();}@Testpublic void testFindById() throws Exception {User user = mapper.findById(41);System.out.println(user);in.close();}@Testpublic void testInsert() throws Exception {User user = new User();user.setUsername("美美");user.setBirthday(new Date());user.setSex("男");user.setAddress("顺义");mapper.insert(user);session.commit();System.out.println(user.getId());}@Testpublic void testUpdate() throws Exception {User user = mapper.findById(41);user.setUsername("小凤");mapper.update(user);session.commit();}@Testpublic void testDelete() throws Exception {mapper.delete(48);session.commit();}// 第一种@Testpublic void testFindByName() throws Exception {List<User> list = mapper.findByName("%王%");for (User user : list) {System.out.println(user);}}// 第二种@Testpublic void testFindByName() throws Exception {List<User> list = mapper.findByName("王");for (User user : list) {System.out.println(user);}}@Testpublic void testFindByCount() throws Exception {Integer count = mapper.findByCount();System.out.println("总记录数:"+count);}}
    
  5. 模糊查询符号使用的区别

    通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入。 #{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。通过$可以将传入的内容拼接在中且不进行类型转换,${}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换, ${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value。
    

第二章:MyBatis参数详解

1. parameterType

  1. 简单数据类型

    int double类型 String类型 long

    简单的写法:java.lang.Integer --> int integer Int Integer 都可以,框架提供简写的方式。

  2. POJO(JavaBean实体类)对象类型,默认是不能简写,可以配置。

    User对象

  3. POJO包装对象类型

    包含更多的实体类

    package cn.tx.domain;import java.io.Serializable;/*** * * * **/
    public class QueryVo implements Serializable {// 自己属性private String name;// user属性private User user;// role属性private Role role;public String getName() {return name;}public void setName(String name) {this.name = name;}public User getUser() {return user;}public void setUser(User user) {this.user = user;}public Role getRole() {return role;}public void setRole(Role role) {this.role = role;}
    }// 测试包装类查询
    public List<User> findByVo(QueryVo vo);<!--包装类测试查询-->
    <select id="findByVo" parameterType="com.qcbyjy.domain.QueryVo" resultType="com.qcbyjy.domain.User">select * from user where username = #{user.username}
    </select>

2. resultType

  1. 返回简单数据类型

    int double long String

  2. 返回POJO数据类型

    返回User对象类型

  3. resultMap结果类型

    resultType可以指定pojo将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功。 如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系 ,resultMap实质上还需要将查询结果映射到pojo对象中。 resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。

    <!--演示resultMap配置-->
    <select id="findUsers" resultMap="userMap">select id _id,username _username,birthday _birthday,sex _sex,address _address from user
    </select><!--配置resultMap,用来进行数据封装id="唯一的名称,用来被引用的"type="进行封装数据的类型"-->
    <resultMap id="userMap" type="com.qcbyjy.domain.User"><!--property="JavaBean中的属性"column="表中的字段"--><result property="id" column="_id"/><result property="username" column="_username" /><result property="birthday" column="_birthday" /><result property="sex" column="_sex" /><result property="address" column="_address" />
    </resultMap>
    

第三章:SqlMapConfig.xml配置文件

1. 定义properties标签的方式管理数据库的信息

  1. 把数据库的信息定义property标签中的方式,在 properties 元素内直接定义 jdbc 相关属性,如 jdbc.driverjdbc.url 等,这些属性在 dataSource 元素中通过 ${} 占位符使用,实现了配置信息的集中管理。

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE configuration  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration><properties><property name="jdbc.driver" value="com.mysql.jdbc.Driver"/><property name="jdbc.url" value="jdbc:mysql:///mybatis_db"/><property name="jdbc.username" value="root"/><property name="jdbc.password" value="root"/></properties><!-- 配置环境们 --><environments default="mysql"><!-- 配置具体的环境 --><environment id="mysql"><!-- 配置事务管理类型 --><transactionManager type="JDBC"/><!-- 配置是否需要使用连接池,POOLED使用,UNPOOLED不使用 --><dataSource type="POOLED"><property name="driver" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><!-- 加载映射的配置文件 --><mappers><mapper resource="mappers/UserMapper.xml"/></mappers>
    </configuration>
    
  2. 在项目中定义jdbc.properties属性文件,存储数据库相关的信息,统一管理,在 SqlMapConfig.xml 中通过 <properties resource="jdbc.properties"></properties> 引入,使配置信息更易于维护。

    1. jdbc.properties属性文件

      jdbc.driver=com.mysql.jdbc.Driver
      jdbc.url=jdbc:mysql:///mybatis_db
      jdbc.username=root
      jdbc.password=root
      
    2. SqlMapConfig.xml的配置文件

      在 environments 元素中设置事务管理类型和数据源类型,数据源类型可选择使用连接池(POOLED)或不使用(UNPOOLED)。

      元素加载映射文件,将 UserMapper.xml 引入。

      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE configuration  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  "http://mybatis.org/dtd/mybatis-3-config.dtd">
      <configuration><!--  <properties resource="jdbc.properties"></properties>读取外部的配置文件resource="文件的相对路径写法"。例如:jdbc.properties 或者 cn/tx/xxx/jdbc.properties--><properties resource="jdbc.properties"></properties><!-- 配置环境们 --><environments default="mysql"><!-- 配置具体的环境 --><environment id="mysql"><!-- 配置事务管理类型 --><transactionManager type="JDBC"/><!-- 配置是否需要使用连接池,POOLED使用,UNPOOLED不使用 --><dataSource type="POOLED"><property name="driver" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><!-- 加载映射的配置文件 --><mappers><mapper resource="mappers/UserMapper.xml"/></mappers>
      </configuration>
      

    2. 类型别名定义

    1. MyBatis自已有类型别名的注册类,咱们编写int或者integer通过注册可以找到java.lang.Integer

    2. 咱们自己也可以进行别名的注册

      1. SqlMapConfig.xml的配置文件

        <!-- 定义别名 -->
        <typeAliases><!-- 把com.qcbyjy.domain.User使用user别名来显示,别名user User USER都可以,默认是忽略大写的 <typeAlias type="com.qcbyjy.domain.User" alias="user"/>--><!-- 针对com.qcbyjy.domain包下的所有的类,都可以使用当前的类名做为别名 --><package name="com.qcbyjy.domain"/>
        </typeAliases>
      2. UserMapper.xml的配置文件使用别名

        <!--  resultType="com.qcbyjy.domain.User" 原来是全路径resultType="user" 现在使用的是别名的方式-->
        <select id="findAll" resultType="user">select * from user
        </select>
        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/493435.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java期末复习暨学校第十三次上机课作业

Java期末复习暨学校第十三次上机课作业&#xff1a; &#xff08;1&#xff09;&#xff1a;掌握正则表达式的使用 第一题&#xff1a; 第13行代码为正则表达式&#xff0c;中国内地的手机号必须是11个数字&#xff1a; &#xff08;1&#xff09; ^1&#xff1a;是该电话号码…

aosp15 - Activity生命周期切换

本文探查的是&#xff0c;从App冷启动后到MainActivity生命周期切换的系统实现。 调试步骤 在com.android.server.wm.RootWindowContainer#attachApplication 方法下断点&#xff0c;为了attach目标进程在com.android.server.wm.ActivityTaskSupervisor#realStartActivityLock…

【libuv】Fargo信令1:client发connect消息给到server

tcp 单机测试,进行模拟 (借助copilot实现) 【Fargo】28:字节序列client发connect消息给到serverserver 收到后回复ack给到客户端程序借助copilot实现。项目构建 Console依赖于Halo.dll提供的api,Halo 依赖于 Immanuel, 运行效果 遗留问题 客户端似乎么有逻辑收到ack做处理各…

libmodbus安装使用

要配置和编译 libmodbus&#xff0c;您需要确保安装了所有必要的依赖项&#xff0c;并按照正确的步骤进行操作。以下是详细的环境配置和编译指南&#xff0c;适用于不同的操作系统。 1. Linux (Debian/Ubuntu) 安装依赖项 首先&#xff0c;确保您的包列表是最新的&#xff1…

猫咪睡眠:萌态背后的奥秘与启示

猫咪的睡眠&#xff0c;犹如一本充满趣味与奥秘的小书&#xff0c;每一页都写满了它们独特的习性与本能。 猫咪堪称 “睡眠大师”&#xff0c;睡眠时间之长令人咋舌&#xff0c;一天中大约有 12 - 16 个小时在梦乡中度过&#xff0c;幼猫和老年猫甚至能睡更久。它们似乎深谙放…

关于小程序内嵌h5打开新的小程序

关于小程序内嵌h5打开新的小程序 三种方式 https://juejin.cn/post/7055551463489011749 只依赖于h5本身的就是 https://huaweicloud.csdn.net/64f97ebb6b896f66024ca16c.html https://juejin.cn/post/7055551463489011749 navigateToMiniProgram 故小程序webview里的h5无法…

免费GIS工具箱:轻松将glb文件转换成3DTiles文件

在GIS地理信息系统领域&#xff0c;GLB文件作为GLTF文件的二进制版本&#xff0c;主要用于3D模型数据的存储和展示。然而&#xff0c;GLB文件的使用频率相对较低&#xff0c;这是因为GIS系统主要处理的是地理空间数据&#xff0c;如地图、地形、地貌、植被、水系等&#xff0c;…

音视频入门基础:MPEG2-TS专题(21)——FFmpeg源码中,获取TS流的视频信息的实现

一、引言 通过FFmpeg命令可以获取到TS文件/TS流的视频压缩编码格式、色彩格式&#xff08;像素格式&#xff09;、分辨率、帧率信息&#xff1a; ./ffmpeg -i XXX.ts 本文以H.264为例讲述FFmpeg到底是从哪个地方获取到这些视频信息的。 二、视频压缩编码格式 FFmpeg获取TS文…

BenchmarkSQL使用教程

1. TPC-C介绍 Transaction Processing Performance Council (TPC) 事务处理性能委员会&#xff0c;是一家非盈利IT组织&#xff0c;他们的目的是定义数据库基准并且向产业界推广可验证的数据库性能测试。而TPC-C最后一个C代表的是压测模型的版本&#xff0c;在这之前还有TPC-A、…

火山引擎发布数据飞轮 2.0,AI 重塑企业数据消费

12 月 18 日&#xff0c;在 2024 冬季火山引擎 FORCE 原动力大会上&#xff0c;火山引擎数智平台&#xff08;VeDI&#xff09;正式升级发布数据飞轮 2.0 模式。 延续去年 4 月发布的数据飞轮“以数据消费促资产建设&#xff0c;以数据消费助业务发展”的核心内涵&#xff0c;…

LLaMA-Factory 单卡3080*2 deepspeed zero3 微调Qwen2.5-7B-Instruct

环境安装 git clone https://gitcode.com/gh_mirrors/ll/LLaMA-Factory.git 下载模型 pip install modelscope modelscope download --model Qwen/Qwen2.5-7B-Instruct --local_dir /root/autodl-tmp/models/Qwen/Qwen2.5-7B-Instruct 微调 llamafactory-cli train \--st…

合并比对学习资料

目录 ContractComparison已开源: ContractComparison已开源: GitHub - UnstoppableCurry/ContractComparison: Comparison of General Chinese Contracts with OCR Pytorch

全速下载 50M/S,不限速下载就是香

近几年来虽说各大网盘层出不穷&#xff0c;各有乾坤&#xff0c;而这其中某些网盘对于网速限制非常严重&#xff0c;这也是很多小伙伴一直吐槽的点&#xff0c;并且某些网盘下载文件还需要安装客户端&#xff0c;并且每家的限速方式不同&#xff0c;有的限速取决于文件大小&…

回归预测 | MATLAB实现CNN-BiGRU-Attention卷积神经网络结合双向门控循环单元融合注意力机制多输入单输出回归预测

回归预测 | MATLAB实现CNN-BiGRU-Attention卷积神经网络结合双向门控循环单元融合注意力机制多输入单输出回归预测 目录 回归预测 | MATLAB实现CNN-BiGRU-Attention卷积神经网络结合双向门控循环单元融合注意力机制多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效…

RunCam WiFiLink连接手机图传测试

RunCam WiFiLink中文手册从这里下载 一、摄像头端 1.连接天线&#xff08;易忘&#xff09; 2.打开摄像头前面的盖子&#xff08;易忘&#xff09; 3.接上直流电源&#xff0c;红线为正&#xff0c;黑线为负 4.直流电源设置电压为14v&#xff0c;电流为3.15A&#xff0c; 通…

AI的进阶之路:从机器学习到深度学习的演变(二)

AI的进阶之路&#xff1a;从机器学习到深度学习的演变&#xff08;一&#xff09; 三、机器学习&#xff08;ML&#xff09;&#xff1a;AI的核心驱动力 3.1 机器学习的核心原理 机器学习&#xff08;Machine Learning, ML&#xff09;突破了传统编程的局限&#xff0c;它不再…

WordPress 去除?v= 动态后缀

Wordpress url后面带有?vxxx的参数符&#xff0c;这种现象出现在安装了Woocommerce插件的店铺类型站点上&#xff0c;参数的作用是帮助系统根据用户的geographic定位计算 tax and shipping fee。 如何删除&#xff1f; 后台进入WooCommerce Settings &#xff0c;将根据IP定…

Spring Cloud Gateway 源码

Spring Cloud Gateway 架构图 按照以上架构图&#xff0c;请求的处理流程&#xff1a; 1.客户端请求发送到网关 DispatcherHandler 2.网关通过 HandlerMapping 找到相应的 WebHandler 3.WebHandler生成FilterChain过滤器链执行所有的过滤器 4.返回Response结果 自动装配类Gat…

数据结构漫游记:初识vector

​ 嘿&#xff0c;各位技术潮人&#xff01;好久不见甚是想念。生活就像一场奇妙冒险&#xff0c;而编程就是那把超酷的万能钥匙。此刻&#xff0c;阳光洒在键盘上&#xff0c;灵感在指尖跳跃&#xff0c;让我们抛开一切束缚&#xff0c;给平淡日子加点料&#xff0c;注入满满的…

go-zero负载均衡实现原理

1. 什么是负载均衡 关于微服务分布式及集群的概念即定义&#xff0c;在业界中这些往往会同时在同一个项目中&#xff0c;而集群在微服务中主要为服务的运行保障高可用。 比如&#xff1a;在当前的项目情况下&#xff0c;我们可能针对用户服务部署两台服务以保障用户服务的高可用…