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

第一章:框架的概述:

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Scratch全攻略:从入门到实践的编程之旅

目录 一、Scratch 基础入门1.1 Scratch 是什么1.2 安装与界面熟悉1.2.1 在线版1.2.2 离线版1.2.2.1 舞台区1.2.2.2 角色区1.2.2.3 脚本区1.2.2.4 背景区1.2.2.5 声音区 二、核心编程要素2.1 角色与舞台2.2 积木块详解2.2.1 运动类积木2.2.2 外观类积木2.2.3 声音类积木2.2.4 事…

STM32之CubeMX新建工程操作(十八)

STM32F407 系列文章 - STM32CubeMX&#xff08;十八&#xff09; 目录 前言 一、STM32CubeMX 二、新建工程 ​编辑 1.创建工程 2.选择芯片型号 3.Pinout引脚分配 1.SYS配置 2.RCC配置 3.定时器配置 4.GPIO引脚配置 5.中断配置 6.通讯接口配置 7.插件Middleware配…

Spark任务提交流程

当包含在application master中的spark-driver启动后&#xff0c;会与资源调度平台交互获取其他执行器资源&#xff0c;并通过反向注册通知对应的node节点启动执行容器。此外&#xff0c;还会根据程序的执行规划生成两个非常重要的东西&#xff0c;一个是根据spark任务执行计划生…

GenTact Toolbox:为Franka Research 3机械臂定制触觉 “皮肤” 的创新方案

前言&#xff1a; 在机器人的发展历程中&#xff0c;为其配备全身触觉皮肤一直是一项充满挑战的任务。传统的触觉皮肤设计往往采用模块化、“一刀切” 的方式&#xff0c;虽然具备一定通用性&#xff0c;但无法充分考虑机器人独特的形状以及其操作环境的特殊需求。在复杂的现实…

设计模式Python版 单例模式

文章目录 前言一、单例模式二、单例模式实现方式三、单例模式示例四、单例模式在Django框架的应用 前言 GOF设计模式分三大类&#xff1a; 创建型模式&#xff1a;关注对象的创建过程&#xff0c;包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模…

JVM面试题解,垃圾回收之“对象存活判断”剖析

一、JVM怎么判断一个类/对象是不是垃圾&#xff1f; 先来说如何判断一个对象是不是垃圾 最常用的就是引用计数法和可达性分析 引用计数法 引用计数法为每个对象维护一个计数器来跟踪有多少个引用指向该对象。每当创建一个新的引用指向某个对象时&#xff0c;计数器加1&…

【Django开发】django美多商城项目完整开发4.0第14篇:Docker使用,1. 在Ubuntu中安装Docker【附

本教程的知识点为&#xff1a; 项目准备 项目准备 配置 1. 修改settings/dev.py 文件中的路径信息 2. INSTALLED_APPS 3. 数据库 用户部分 图片 1. 后端接口设计&#xff1a; 视图原型 2. 具体视图实现 用户部分 使用Celery完成发送 判断帐号是否存在 1. 判断用户名是否存在 后…

14-5C++的deque容器

(一&#xff09;deque的基础知识 1.deque是“double-ended queue"的缩写和vector-样都是STL的容器 2.deque是双端数组而vector是单端的 3.deque在接口上和vector非常相似&#xff0c;在许多操作的地方可以直接替换 4.deque可以随机存取元素(支持索引值直接存取&#xf…

鸿蒙仓颉环境配置(仓颉SDK下载,仓颉VsCode开发环境配置,仓颉DevEco开发环境配置)

目录 ​1&#xff09;仓颉的SDK下载 1--进入仓颉的官网 2--点击图片中的下载按钮 3--在新跳转的页面点击即刻下载 4--下载 5--找到你们自己下载好的地方 6--解压软件 2&#xff09;仓颉编程环境配置 1--找到自己的根目录 2--进入命令行窗口 3--输入 envsetup.bat 4--验证是否安…

grafana新增email告警

选择一个面板 比如cpu 新增一个临界点表达式 input选A 就是A的值达到某个临界点 触发告警 我这边IS ABOVE0.15就是cpu大于0.15%就触发报警&#xff0c;这个值怎么填看指标的值显示 这里要设置一下报警条件 这边随便配置下 配置标签和通知&#xff0c;选择你的邮件 看下告警…

springboot自动配置原理(高低版本比较)spring.factories文件的作用

SpringBootApplication public class SpringSecurityApplication {public static void main(String[] args) {SpringApplication.run(SpringSecurityApplication.class, args);}}注解SpringBootApplication Target({ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) Doc…

Spring源码03 - bean注入和生命周期

bean注入和生命周期&#xff08;面试&#xff09; 文章目录 bean注入和生命周期&#xff08;面试&#xff09;一&#xff1a;getBean的主体思路1&#xff1a;初步思路2&#xff1a;SpringBean的主体思路 二&#xff1a;Spring如何解决循环依赖问题1&#xff1a;三级Map&#xf…

vscode导入模块不显示类型注解

目录结构&#xff1a; utils.py&#xff1a; import random def select_Jrandom(i:int, m:int) -> int:"""随机选择一个不等于 i 的整数"""j iwhile j i:j int(random.uniform(0, m))return jdef clip_alpha(alpha_j:float, H:float, L:f…

浅谈机器学习之基于RNN进行充值的油费预测

浅谈机器学习之基于RNN进行充值的油费预测 引言 随着智能交通和物联网技术的发展&#xff0c;油费预测已成为研究的热点之一。准确的油费预测不仅能帮助车主合理规划出行成本&#xff0c;还可以为油价波动提供参考依据。近年来&#xff0c;递归神经网络&#xff08;RNN&#…

There is no getter for property named ‘XXX’ in ‘XXXX‘

写了一个POST方法用于新增软件描述信息&#xff0c;报错显示在我的实体类中没有这个属性的getter方法&#xff0c;实体类如下&#xff1a; 报错没有softWare这个属性的getter方法&#xff0c;但是我的实体类中本来就没有这个属性&#xff08;笑哭...) 后面查了许多资料发现&am…

基于springboot+vue的校园二手物品交易系统的设计与实现

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

H266/VVC 变换编码中大尺寸变换块高频系数置零技术

大尺寸变换块高频系数置零 近年来视频技术有了飞速的变化&#xff0c;视频的分辨率从 1080P 过渡到 4K&#xff0c;并逐渐向发展 8K。为了适应日益增长的视频分辨率&#xff0c;新的编码技术采用了更大尺寸的变换块来提高编码效率&#xff0c;最大变换块大小变成 64x64。变换块…

5989.数字接龙

5989.数字接龙 小蓝最近迷上了一款名为《数字接龙》的迷宫游戏&#xff0c;游戏在一个大小为 NN 的格子棋盘上展开&#xff0c;其中每一个格子处都有着一个 0…K−10…K−1 之间的整数。 游戏规则如下&#xff1a; 从左上角 (0,0) 处出发&#xff0c;目标是到达右下角 (N−1…

Titans: 学习在测试时记忆 - 论文解读与总结

论文地址&#xff1a;https://arxiv.org/pdf/2501.00663v1 本文介绍了一篇由 Google Research 发表的关于新型神经网络架构 Titans 的论文&#xff0c;该架构旨在解决传统 Transformer 在处理长序列时的局限性。以下是对论文的详细解读&#xff0c;并结合原文图片进行说明&…

账号IP属地:依据手机号还是网络环境?

在数字化生活中&#xff0c;账号的IP属地信息往往成为我们关注的一个焦点。无论是出于安全考虑&#xff0c;还是为了满足某些特定服务的需求&#xff0c;了解账号IP属地的确定方式都显得尤为重要。那么&#xff0c;账号IP属地根据手机号还是网络来确定的呢&#xff1f;本文将深…