MyBatis最佳实践:提升数据库交互效率的秘密武器

news2025/4/20 11:59:21

第一章:框架的概述:

  1. MyBatis 框架的概述:
    1. MyBatis 是一个优秀的基于 Java 的持久框架,内部对 JDBC 做了封装,使开发者只需要关注 SQL 语句,而不关注 JDBC 的代码,使开发变得更加的简单
    2. MyBatis 通过 XML 或者注解的方式将要执行的各种 Statement 对象配置起来,通过 Java  对象和 statement 中 SQL 后,最终将结果已 Java 对象返回
    3. MyBatis 采用了 ORM 的思想
  2. ORM 思想:
    1. 在 web 阶段学习 JavaBean 更正确的叫法是:实体类
    2. ORM:object  relational  mapping  对象映射关系
      1. O:面向对象领域的 Object(JavaBean 对象)
      2. R:关系数据库领域的 Relational(表的结构)
      3. M:映射 Mapping(XML 的配置文件)、
    3. 让实体类和数据库表进行 一 一  对应关系
      1. 先让实体类和数据库表对应
      2. 再让实体类属性和表里面字段对应
    4. 不需要直接操作数据库表,直接操作表对应的实体类对象即可
  3. 推荐插件:

第二章:MyBatis 的入门程序(重点)

  1. 创建数据库和表结构:
    create database mybatis_demo;
    use mybatis_demo;
    ​
    CREATE TABLE `user` (
      `id` int(11) NOT NULL auto_increment,
      `username` varchar(32) NOT NULL COMMENT '用户名称',
      `birthday` datetime default NULL COMMENT '生日',
      `sex` char(1) default NULL COMMENT '性别',
      `address` varchar(256) default NULL COMMENT '地址',
      PRIMARY KEY  (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    ​
    insert  into `user`(`id`,`username`,`birthday`,`sex`,`address`) values 
    (1,'老王','2018-02-27 17:47:08','男','北京'),
    (2,'熊大','2018-03-02 15:09:37','女','上海'),
    (3,'熊二','2018-03-04 11:34:34','女','深圳'),
    (4,'光头强','2018-03-04 12:04:06','男','广州');
  2. MyBatis 的入门程序:
    1. 创建 maven 项目,Java 工程即可
    2. 引入坐标:
      1. 引入 MyBatis 的 3.4.5 的版本的坐标
      2. 引入 MySQL 驱动的 jar 包,5.1.6 版本
      3. 引入 Junit 单元测试的 jar 包
      4. 引入 log4h 的 jar 包,1.2.12 版本(需要引入log4j.propertiees 的配置文件)
        <dependencies>
            <!--mybatis核心包-->
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.4.5</version>
            </dependency>
            <!--mysql驱动包-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.6</version>
            </dependency>
            <!-- 单元测试 -->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.10</version>
                <scope>test</scope>
            </dependency>
            <!-- 日志 -->
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.17</version>
            </dependency>
        </dependencies>
    3. 编写 User 的实现类,属性尽量使用包装类型:
      public class User implements Serializable {
          private Integer id;
          private String username;
          private Date birthday;
          private String sex;
          private String address;
      
          public Integer getId() {
              return id;
          }
      
          public void setId(Integer id) {
              this.id = id;
          }
      
          public String getUsername() {
              return username;
          }
      
          public void setUsername(String username) {
              this.username = username;
          }
      
          public Date getBirthday() {
              return birthday;
          }
      
          public void setBirthday(Date birthday) {
              this.birthday = birthday;
          }
      
          public String getSex() {
              return sex;
          }
      
          public void setSex(String sex) {
              this.sex = sex;
          }
      
          public String getAddress() {
              return address;
          }
      
          public void setAddress(String address) {
              this.address = address;
          }
      
          @Override
          public String toString() {
              return "User{" +
                      "id=" + id +
                      ", username='" + username + '\'' +
                      ", birthday=" + birthday +
                      ", sex='" + sex + '\'' +
                      ", address='" + address + '\'' +
                      '}';
          }
      }
    4. 编写 UserMapper 的接口和方法(即 Spring 框架中 UserDao 接口):
      public interface UserMapper {
          public List<User> selectAll;
      }
    5. 在 resources 目录下,创建 mapper 文件夹。编写 Usermapper.xml 的配置文件,导入一下约束信息:
      <?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.qcby.mapper.UserMapper">
      
          <select id="findAll" resultType="com.qcby.model.User">
              select * from user;
          </select>
      </mapper>
      1. mapper  namespace="com.qcby.mapper.UserMapper":叫名称空间,表明以后查找 UserMapper 接口中的 findAll 方法
      2. select  id = "findAll" 中的 id 属性编写的 UserMapper 接口中方法的名称,固定写法
      3. resultType = "com.qcby.model.User":表明的是 findAll 方法的返回值类型
    6. 编写配置文件,在 resources 目录下创建 SqlMapConfig.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>
          <!-- 配置具体的环境 -->
          <environments default="mysql">
              <environment id="mysql">
                  <transactionManager type="JDBC"></transactionManager>
                  <!-- 配置是否需要使用连接池, POOLED 使用,UNPOOLED 不适用-->
                  <dataSource type="POOLED">
                      <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                      <property name="url" value="jdbc:mysql:///mybatis_demo"/>
                      <property name="username" value="root"/>
                      <property name="password" value="root"/>
                  </dataSource>
              </environment>
          </environments>
      
          <!-- 加载映射的配置文件 -->
          <mappers>
              <mapper resource="Mapper/UserMapper.xml"/>
          </mappers>
      
      </configuration>
    7. 编写入门程序(重点掌握入门的步骤):
      import com.qcby.mapper.UserMapper;
      import com.qcby.model.User;
      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.Test;
      
      import java.io.IOException;
      import java.io.InputStream;
      import java.util.List;
      
      public class MyBatisDemo {
          
          @Test
          public void run() throws Exception {
              //加载主配置文件,目的是构建 SqlSessionFactory 的对象
              InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
      
              //创建 SqlSSessionFactory 对象
              SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
      
              //使用 SqlSessionFactory 工厂对象创建 SqlSession 对象
              SqlSession session = factory.openSession();
      
              //通过 session 创建 UserMapper 接口的代理对象
              UserMapper mapper = session.getMapper(UserMapper.class);
      
              //调用 findAll 方法
              List<User> list = mapper.findAll();
      
              //遍历集合并输出
              for (User u : list){
                  System.out.println(u);
              }
      
              //释放资源
              session.close();
              in.close();
          }
      }

第三章:代理 Dao 方式的 CURD 操作

  1. Dao 方式的增删改查:
    1. 创建项目
    2. 注意:除了查询方法之外,其他增删改操作需要进行 session.commit 提交
    3.  UserMapper 接口代码:
      public interface UserMapper {
          public List<User> findAll();
      
          //根据 id 查询
          public User findById(Integer id);
      
          // 插入
          public void insert(User user);
      
          //修改
          public void update(User user);
      
      
          //删除
          public void delete(int id);
      
          //根据姓名模糊查询
          public List<User> findByName(String username);
      
          //查询总数
          public Integer findByCount();
      }
    4. UserMapper.xml 的配置文件代码:
      <?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.qcby.mapper.UserMapper">
      
          <!--保存操作-->
          <insert id="insert" parameterType="com.qcby.model.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.qcby.model.User">
              update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}
          </update>
      
          <!-- 根据 id 删除 -->
          <delete id="delete" parameterType="integer">
              delete from user where id = #{id}
          </delete>
      
          <!-- 查询所有 -->
          <select id="findAll" resultType="com.qcby.model.User" >
              select * from user;
          </select>
      
          <!-- 根据 id 查询 -->
          <select id="findById" resultType="com.qcby.model.User">
              select * from user where id=#{id};
          </select>
      
          <!-- 根据姓名模糊查询-->
          <select id="findByName" parameterType="string" resultType="com.qcby.model.User">
              /**
                第一种方式的 SQL 语句
             */
      --        select * from user where username like #{username}
             /**
               第二种 SQL 语句的编写,强调: '%${value}%' 不能修改,固定写法(推荐使用)
               注意:使用第二种 SQL 写法时需要把 SQL 中的注释全部删除否则会报错
              */
              select * from user where username like %${value}%
          </select>
      
          <!-- 查询总数量 -->
          <select id="findByCount" resultType="java.lang.Integer">
              select count(*) from user;
          </select>
      
      </mapper>
    5. 测试代码:
      public class MyBatisDemo {
      
          private InputStream in;
          private SqlSession session;
          private UserMapper userMapper;
      
          @Before
          public void init() throws IOException {
              //加载配置文件
              in = Resources.getResourceAsStream("SqlMapConfig.xml");
      
              //创建工厂对象
              SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
      
              //创建 Session 对象
              session = factory.openSession();
      
              //获取到代理对象
              userMapper = session.getMapper(UserMapper.class);
          }
      
          @After
          public void dstory() throws IOException {
              in.close();
              session.close();
          }
      
          //查询所有
          @Test
          public void fundAll() throws IOException {
              List<User> users = userMapper.findAll();
              for (User u : users){
                  System.out.println(u);
              }
      
              in.close();
          }
      
          //根据 id 查询
          @Test
          public void findById() throws IOException {
              User user = userMapper.findById(1);
              System.out.println(user);
              in.close();
          }
      
          //插入方法
          @Test
          public void insert() throws IOException {
              User user = new User();
              user.setAddress("河北");
              user.setBirthday(new Date());
              user.setSex("男");
              user.setUsername("张翰里");
              System.out.println(user);
              userMapper.insert(user);
              session.commit();
              in.close();
          }
      
          //修改方法
          @Test
          public void updage() throws IOException {
              User user = new User();
              user.setId(1);
              user.setAddress("河北");
              user.setBirthday(new Date());
              user.setSex("男");
              user.setUsername("张翰里");
              userMapper.update(user);
              session.commit();
              in.close();
          }
      
          //删除方法
          @Test
          public void delete() throws IOException {
              userMapper.delete(2);
              session.commit();
              in.close();
          }
      
          //模糊查询
          @Test
          public void findByName() throws IOException {
              List<User> list = userMapper.findByName("%张%");
              for(User u : list){
                  System.out.println(u);
              }
              in.close();
          }
      
          //查询总量
          @Test
          public void findCount(){
              System.out.println(userMapper.findByCount());
          }
      }

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Three.js实战项目02:vue3+three.js实现汽车展厅项目

文章目录 实战项目02项目预览项目创建初始化项目模型加载与展厅灯光加载汽车模型设置灯光材质设置完整项目下载实战项目02 项目预览 完整项目效果: 项目创建 创建项目: pnpm create vue安装包: pnpm add three@0.153.0 pnpm add gsap初始化项目 修改App.js代码&#x…

1月27(信息差)

&#x1f30d;喜大普奔&#xff0c;适用于 VS Code 的 GitHub Copilot 全新免费版本正式推出&#xff0c;GitHub 全球开发者突破1.5亿 &#x1f384;Kimi深夜炸场&#xff1a;满血版多模态o1级推理模型&#xff01;OpenAI外全球首次&#xff01;Jim Fan&#xff1a;同天两款国…

开发环境搭建-3:配置 nodejs 开发环境 (fnm+ node + pnpm)

在 WSL 环境中配置&#xff1a;WSL2 (2.3.26.0) Oracle Linux 8.7 官方镜像 node 官网&#xff1a;https://nodejs.org/zh-cn/download 点击【下载】&#xff0c;选择想要的 node 版本、操作系统、node 版本管理器、npm包管理器 根据下面代码提示依次执行对应代码即可 基本概…

一个局域网通过NAT访问另一个地址重叠的局域网(IP方式访问)

正文共&#xff1a;1335 字 7 图&#xff0c;预估阅读时间&#xff1a;4 分钟 现在&#xff0c;我们已经可以通过调整两台设备的组合配置&#xff08;地址重叠时&#xff0c;用户如何通过NAT访问对端IP网络&#xff1f;&#xff09;或仅调整一台设备的配置&#xff08;仅操作一…

DeepSeek学术题目选择效果怎么样?

论文选题 一篇出色的论文背后&#xff0c;必定有一个“智慧的选题”在撑腰。选题足够好文章就能顺利登上高水平期刊&#xff1b;选题不行再精彩的写作也只能“当花瓶”。然而许多宝子们常常忽视这个环节&#xff0c;把大量时间花在写作上&#xff0c;选题时却像抓阄一样随便挑一…

正反转电路梯形图

1、正转联锁控制。按下正转按钮SB1→梯形图程序中的正转触点X000闭合→线圈Y000得电→Y000自锁触点闭合&#xff0c;Y000联锁触点断开&#xff0c;Y0端子与COM端子间的内部硬触点闭合→Y000自锁触点闭合&#xff0c;使线圈Y000在X000触点断开后仍可得电。 Y000联锁触点断开&…

高可用集群故障之join

本文记录了在部署高可用的k8s集群时&#xff0c;遇到的一个故障及其解决方法。 集群环境 描述&#xff1a;三主三从&#xff0c;eth0为外网网卡&#xff0c;eth1为内网网卡&#xff0c;内网互通。 需求&#xff1a;eth0只负责访问外网&#xff0c;eth1作为集群间的通信。 主…

【Web开发】一步一步详细分析使用Bolt.new生成的简单的VUE项目

https://bolt.new/ 这是一个bolt.new生成的Vue小项目&#xff0c;让我们来一步一步了解其架构&#xff0c;学习Vue开发&#xff0c;并美化它。 框架: Vue 3: 用于构建用户界面。 TypeScript: 提供类型安全和更好的开发体验。 Vite: 用于快速构建和开发 主界面如下&#xff1a…

SpringBoot源码解析(八):Bean工厂接口体系

SpringBoot源码系列文章 SpringBoot源码解析(一)&#xff1a;SpringApplication构造方法 SpringBoot源码解析(二)&#xff1a;引导上下文DefaultBootstrapContext SpringBoot源码解析(三)&#xff1a;启动开始阶段 SpringBoot源码解析(四)&#xff1a;解析应用参数args Sp…

论文阅读 AlphaFold 2

用AlphaFold进行非常精确的蛋白质结构的预测(AlphaFold2) 发表于2021年07月15日 NatureDOI: 10.1038/s41586-021-03819-2自然和科学杂志评选为2021年最重要的科学突破之一2021年AI在科学界最大的突破 前言 2020年11月30号, deepmind博客说AlphaFold解决了50年以来生物学的大挑…

计算机网络 (62)移动通信的展望

一、技术发展趋势 6G技术的崛起 内生智能&#xff1a;6G将强调自适应网络架构&#xff0c;通过AI驱动的智能算法提升通信能力。例如&#xff0c;基于生成式AI的6G内生智能架构将成为重要研究方向&#xff0c;实现低延迟、高效率的智能通信。信息编码与调制技术&#xff1a;新型…

探索与创新:DeepSeek R1与Ollama在深度研究中的应用

在当今信息爆炸的时代&#xff0c;获取和处理信息的能力变得至关重要。特别是在学术和研究领域&#xff0c;如何有效地进行深度研究是一个亟待解决的问题。最近&#xff0c;一个名为DeepSeek R1的模型结合Ollama平台提供了一种创新的解决方案。本文将分析并解构这一新兴的研究工…

mantisbt添加修改用户密码

文章目录 问题当前版本安装流程创建用户修改密码老的方式探索阶段 问题 不太好改密码啊。貌似必须要域名要发邮件。公司太穷&#xff0c;看不见的东西不关心&#xff0c;只能改源码了。 当前版本 当前mantisbt版本 2.27 php版本 7.4.3 安装流程 &#xff08;下面流程不是…

记录 | Docker的windows版安装

目录 前言一、1.1 打开“启用或关闭Windows功能”1.2 安装“WSL”方式1&#xff1a;命令行下载方式2&#xff1a;离线包下载 二、Docker Desktop更新时间 前言 参考文章&#xff1a;Windows Subsystem for Linux——解决WSL更新速度慢的方案 参考视频&#xff1a;一个视频解决D…

【Elasticsearch】内置分词器和IK分词器

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

2025美赛数学建模C题:奥运金牌榜,完整论文代码模型目前已经更新

2025美赛数学建模C题&#xff1a;奥运金牌榜&#xff0c;完整论文代码模型目前已经更新&#xff0c;获取见文末名片

HarmonyOS:ForEach:循环渲染

一、前言 ForEach接口基于数组类型数据来进行循环渲染&#xff0c;需要与容器组件配合使用&#xff0c;且接口返回的组件应当是允许包含在ForEach父容器组件中的子组件。例如&#xff0c;ListItem组件要求ForEach的父容器组件必须为List组件。 API参数说明见&#xff1a;ForEa…

C++ STL:深入探索常见容器

你好呀&#xff0c;欢迎来到 Dong雨 的技术小栈 &#x1f331; 在这里&#xff0c;我们一同探索代码的奥秘&#xff0c;感受技术的魅力 ✨。 &#x1f449; 我的小世界&#xff1a;Dong雨 &#x1f4cc; 分享我的学习旅程 &#x1f6e0;️ 提供贴心的实用工具 &#x1f4a1; 记…

Java面试题2025-设计模式

1.说一下开发中需要遵守的设计原则&#xff1f; 设计模式中主要有六大设计原则&#xff0c;简称为SOLID &#xff0c;是由于各个原则的首字母简称合并的来(两个L算一个,solid 稳定的)&#xff0c;六大设计原则分别如下&#xff1a; 1、单一职责原则 单一职责原则的定义描述非…

flink StreamGraph解析

Flink程序有三部分operation组成&#xff0c;分别是源source、转换transformation、目的地sink。这三部分构成DAG。 DAG首先生成的是StreamGraph。 用户代码在添加operation的时候会在env中缓存&#xff08;变量transformations&#xff09;&#xff0c;在env.execute()执行的…