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;}@Overridepublic 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 mapperPUBLIC "-//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 configurationPUBLIC "-//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 {@Testpublic 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 mapperPUBLIC "-//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;@Beforepublic void init() throws IOException {//加载配置文件in = Resources.getResourceAsStream("SqlMapConfig.xml");//创建工厂对象SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);//创建 Session 对象session = factory.openSession();//获取到代理对象userMapper = session.getMapper(UserMapper.class);}@Afterpublic void dstory() throws IOException {in.close();session.close();}//查询所有@Testpublic void fundAll() throws IOException {List<User> users = userMapper.findAll();for (User u : users){System.out.println(u);}in.close();}//根据 id 查询@Testpublic void findById() throws IOException {User user = userMapper.findById(1);System.out.println(user);in.close();}//插入方法@Testpublic 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();}//修改方法@Testpublic 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();}//删除方法@Testpublic void delete() throws IOException {userMapper.delete(2);session.commit();in.close();}//模糊查询@Testpublic void findByName() throws IOException {List<User> list = userMapper.findByName("%张%");for(User u : list){System.out.println(u);}in.close();}//查询总量@Testpublic void findCount(){System.out.println(userMapper.findByCount());}
      }

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

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

相关文章

1. 基于图像的三维重建

1. 基于图像的三维重建 核心概念三维重建中深度图、点云的区别&#xff1f;深度图点云总结 深度图到点云还需要什么步骤&#xff1f;1. **获取相机内参**2. **生成相应的像素坐标**3. **计算三维坐标**4. **构建点云**5. **处理颜色信息&#xff08;可选&#xff09;**6. **去除…

将UI界面交给第三方库

当你了解了 Vue 项目构建和开发的基本知识后&#xff0c;我认为接下来你一定想亲自在构建出的项目中填充自己的业务和功能逻辑&#xff0c;因为目前其还是空白的。 但是这里我不会教你如何实现一个具体的业务和功能模块&#xff0c;因为每个人想要实现的东西都可能不尽相同。如…

深圳大学-计算机系统(3)-实验三取指和指令译码设计

实验目标 设计完成一个连续取指令并进行指令译码的电路&#xff0c;从而掌握设计简单数据通路的基本方法。 实验内容 本实验分成三周&#xff08;三次&#xff09;完成&#xff1a;1&#xff09;首先完成一个译码器&#xff08;30分&#xff09;&#xff1b;2&#xff09;接…

[Dialog屏幕开发] 屏幕绘制(文本/输入框/按钮控件)

阅读该篇文章之前&#xff0c;可先阅读下述资料 [Dialog屏幕开发] 设置GUI Status 菜单/GUI Title 标题https://blog.csdn.net/Hudas/article/details/145288453?spm1001.2014.3001.5501 上篇文章我们的屏幕已实现了如下功能 我们已经设置了GUI Status菜单以及GUI Title标题…

如何通过海外社交媒体平台提升品牌曝光度?

跨境电商和全球营销策略的核心之一是通过海外社交媒体平台提升品牌曝光度。为了实现这一目标&#xff0c;企业需要选定适合的社交平台并制定精准的营销策略。结合OKBrow指纹指纹浏览器的强大功能&#xff0c;您能够高效管理多个社交账户&#xff0c;避免平台识别账户之间的关联…

可替代CentOS 7的Linux操作系统选型

可替代CentOS 7的其他Linux操作系统选型 一、背景介绍二、主流操作系统调研2.1 企业级产品:Red Hat Enterprise Linux/CentOS Stream2.1.1 Red Hat Enterprise Linux2.1.2 CentOS Stream2.2 其他发行版:Debian/Ubuntu2.3 开源产品:AlmaLinux / RockyLinux2.3.1 AlmaLinux2.3…

每日一题洛谷P1423 小玉在游泳c++

#include<iostream> using namespace std; int main() {double s;cin >> s;int n 0;double sum 0;double k 2;while (sum < s) {sum k;n;k * 0.98;}cout << n << endl;return 0; }

DRG_DIP 2.0时代医院程序结构转型与数据结构优化研究

一、引言 1.1 DRG_DIP 2.0 改革背景与意义 医保支付方式改革在医疗保障制度改革中占据着极为关键的地位&#xff0c;是推动医疗领域变革的核心力量。它犹如一把精准的手术刀&#xff0c;对医疗资源的合理分配、医疗服务质量的稳步提升以及医疗费用的有效控制起着决定性作用。…

Redis支持数据类型详解

4 数据类型 Redis支持多种数据类型&#xff1a;string&#xff08;字符串&#xff09;&#xff0c;hash&#xff08;哈希&#xff09;&#xff0c;list&#xff08;列表&#xff09;&#xff0c;set&#xff08;集合&#xff09;、zset&#xff08;sorted set 有序集合&#x…

游戏设备升级怎么选?RTX4070独显,ToDesk云电脑更具性价比

过新年、添喜气&#xff01;正逢节期来临不知道各位是否都跟小编一样在考虑购置生活中的各样所需呐&#xff1f; 25年可谓是3A游戏大作之年&#xff0c;例如《GTA6》《文明7》《死亡搁浅2》《刺客信条&#xff1a;影》下半年落地的《塞尔达传说&#xff1a;新篇章》《生化危机9…

网络安全解决方案分享:推荐十款网络准入控制系统,保护企业网络安全

随着企业信息化进程的不断推进&#xff0c;企业网络安全面临的威胁愈加复杂。网络准入控制&#xff08;NAC, Network Access Control&#xff09;系统作为保障企业网络安全的核心技术&#xff0c;无论是防止外部攻击、阻止内部滥用&#xff0c;还是确保设备符合合规要求&#x…

WebSocket实现私聊私信功能

目录 后端pom.xmlConfig配置类Controller类DTO 前端安装相关依赖websocketService.js接口javascripthtmlCSS 效果展示简单测试连接&#xff1a; 报错解决方法1、vue3 使用SockJS报错 ReferenceError: global is not defined 后面将继续完善&#xff0c;待更新... 后端 pom.xml…

【PHP】部署和发布PHP网站到IIS服务器

欢迎来到《小5讲堂》 这是《PHP》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 前言安装PHP 稳定版本线程安全版解压使用 PHP配置 配置文件扩展文件…

电梯系统的UML文档07

从这个类中得到的类图&#xff0c;构划出了软件的大部分设计。 系统结构视图提供软件和整个系统结构最复杂的也是最优雅的描述。和通常的软件系统相比&#xff0c;在分布式嵌入系统中了解系统组件如何协同工作是非常重要的。毕竟&#xff0c;每个类图仅仅是一个系统的静态设计…

低代码系统-产品架构案例介绍、明道云(七)

今天分析另外一个零代码、低代码产品-明道云&#xff0c;跟所有低代码产品的架构图一样&#xff0c;高、大、炫、美。 依然是从下至上&#xff0c;从左到右的顺序。 开发层 搭建中心 表单、流程、报表、用户中心&#xff0c;还是这些内容&#xff0c;自定义打印很多平台都有&am…

Linux编译安装Netgen/NGSolve

本文记录Linux下编译安装Netgen/NGSolve的流程。 零、环境 操作系统Ubuntu 22.04.4 LTSVS Code1.92.1Git2.34.1GCC11.4.0CMake3.22.1oneAPI2024.2.1 一、安装依赖 1.1 VS Code 下载并安装VS Code&#xff0c;然后安装以下插件&#xff0c; Task Explorer Output Colorizer …

RabbitMQ的消息可靠性保证

文章目录 1.环境搭建1.common-rabbitmq-starter 配置防止消费者抢消息&#xff08;基础配置&#xff09;2.common-rabbitmq-starter-demo下创建一个生产者一个消费者 2.生产者可靠性1.开启消息超时重试机制2.生产者开启ConfirmCallback消息确认机制1.application.yml2.TestConf…

transformers使用过程问题

transfomers新旧版本冲突&#xff0c;和accelerate、datasets、evaluate这些库直接也经常会发生冲突 我使用了下面的版本&#xff0c;暂时没有冲突&#xff0c;如果有冲突再更新 transformers4.41.2 datasets2.20.0 accelerate0.31.0 evaluate0.4.2pip install transformers安…

Text2SQL 智能报表方案介绍

0 背景 Text2SQL智能报表方案旨在通过自然语言处理&#xff08;NLP&#xff09;技术&#xff0c;使用户能够以自然语言的形式提出问题&#xff0c;并自动生成相应的SQL查询&#xff0c;从而获取所需的数据报表&#xff0c;用户可根据得到结果展示分析从而为结论提供支撑&#…

Idea调试的时候字符串路径乱码 poi解析时表单中文名字正确,但是找不到

目录 原因 解决措施 POI表单中文名字正确但是找不到 原因 1.编码格式冲突 2.文件编码多次转换&#xff0c;已经凌乱 解决措施 1.找到工程目录下的文件夹【.idea】 2.进入【encodings.xml】文件 3.将【encodings.xml】中&#xff0c;除了<file url"PROJECT"&g…