大家好,我是可乐。

上篇文章给大家撸了一遍用 JDBC 直接操作数据库的实例,还只是简单写了一个查询的接口,其代码量就已经很大了,并且可乐还给大家分析了直接使用 JDBC 带来的一些问题,总之是一种反人类的操作,为了让这种操作人类正常化,我们选择使用 ORM 框架。

本篇文章给大家从头搭建一遍,如何基于 XML 配置,使用 Mybatis 进行增删改查操作。

看到这,可能有读者就要问了,what?

我现在使用 Springboot 多爽,还要这些复杂的配置干啥?

可乐这里要说的是,Springboot 用起来是爽,它啥都给你封装好了,但是很多细节问题你可能并不知道,后续撸 Mybatis 的源码流程也是基于此,所以大家一定要过一遍 Mybatis 原始的执行方式。

项目源码地址:https://github.com/YSOcean/mybatisproject

这里可乐不会介绍各种配置含义,需要的可以直接参考官网,更加权威,你值得拥有:https://mybatis.org/mybatis-3/zh/configuration.html

1、创建库表

以 Mysql 数据库为例,表比较简单,这里可乐就直接放图和建表语句了。

-- ----------------------------
-- Table structure for person
-- ----------------------------
DROP TABLE IF EXISTS `person`;
CREATE TABLE `person` (`pid` int NOT NULL AUTO_INCREMENT,`pname` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,`page` int DEFAULT NULL,PRIMARY KEY (`pid`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;-- ----------------------------
-- Records of person
-- ----------------------------
BEGIN;
INSERT INTO `person` VALUES (1, 'itcoke', 11);
INSERT INTO `person` VALUES (2, 'IT可乐', 22);
COMMIT;

2、创建工程

通过 IDEA 创建一个工程,并导入相应的jar包。

以 maven 为例,配置 MySQL 和 Mybatis 即可。

<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.7</version>
</dependency><!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.26</version>
</dependency>

整个项目结构可以参考我的GitHub地址:https://github.com/YSOcean/mybatisproject

3、创建与表对应的实体类对象

package com.itcoke.bean;public class Person {private Long pid;private String pname;private Integer page;public Long getPid() {return pid;}public void setPid(Long pid) {this.pid = pid;}public String getPname() {return pname;}public void setPname(String pname) {this.pname = pname;}public Integer getPage() {return page;}public void setPage(Integer page) {this.page = page;}@Overridepublic String toString() {return "Person{" +"pid=" + pid +", pname='" + pname + '\'' +", page=" + page +'}';}
}

4、编写数据库配置文件 mybatis-config.xml

关于配置文件的详细介绍,可以参考官网:https://mybatis.org/mybatis-3/zh/configuration.html

<?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><!-- 可以配置多个运行环境,但是每个 SqlSessionFactory 实例只能选择一个运行环境  --><!-- 默认使用的环境 ID,名字随意,但是要匹配下面其中一个环境 ID --><environments default="development"><!-- 环境ID --><environment id="development"><!--事务管理器一、JDBC:这个配置直接简单使用了 JDBC 的提交和回滚设置。它依赖于从数据源得到的连接来管理事务范围二、MANAGED:这个配置几乎没做什么。它从来不提交或回滚一个连接。而它会让容器来管理事务的整个生命周期比如 spring 或 JEE 应用服务器的上下文,默认情况下,它会关闭连接。然而一些容器并不希望这样,因此如果你需要从连接中停止它,就可以将 closeConnection 属性设置为 false,比如:<transactionManager type="MANAGED"><property name="closeConnection" value="false"/></transactionManager>--><transactionManager type="JDBC"/><!--dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象源  --><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis-study"/><property name="username" value="root"/><property name="password" value="root1234"/></dataSource></environment></environments>
</configuration>

5、定义person表映射文件

官方权威地址:https://mybatis.org/mybatis-3/zh/sqlmap-xml.html

<?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.itcoke.mapper.PersonMapper"><!-- 根据 id 查询 person 表中的数据id:唯一标识符,此文件中的id值不能重复resultType:返回值类型,一条数据库记录也就对应实体类的一个对象parameterType:参数类型,也就是查询条件的类型--><select id="selectPersonById"resultType="com.itcoke.bean.Person" parameterType="java.lang.Long" ><!-- 这里和普通的sql 查询语句差不多,后面的 #{id}表示占位符,里面不一定要写id,写啥都可以,但是不要空着 -->select * from person where pid = #{pid}</select><!-- 根据 id 更新 person 表的数据 --><update id="updatePersonById" parameterType="com.itcoke.bean.Person">update person p<trim prefix="set" suffixOverrides=","><if test="pname != null and pname != ''">p.pname = #{pname},</if><if test="page != null and page != ''">p.page = #{page},</if></trim>where pid=#{pid}</update><!-- 向 person 表插入一条数据 --><insert id="insertPerson" parameterType="com.itcoke.bean.Person">insert into person(pname,page)value(#{pname},#{page})</insert><!-- 根据 id 删除 person 表的数据 --><delete id="deletePersonById" parameterType="Long">delete from person where pid=#{pid}</delete></mapper>

6、向 mybatis-config.xml 中注册映射文件

<mappers><!-- 注册PersonMapper.xml文件 --><mapper resource="com/itcoke/mapper/PersonMapper.xml"/>
</mappers>

7、编写测试类

package com.itcoke;import com.itcoke.bean.Person;
import com.itcoke.mapper.PersonMapper;
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.Before;
import org.junit.Test;import java.io.IOException;
import java.io.InputStream;public class MybatisprojectApplicationTests {// 定义SqlSessionFactorySqlSessionFactory sessionFactory = null;@Beforepublic void init() {//定义mybatis全局配置文件String resource = "mybatis-config.xml";//加载 mybatis 全局配置文件InputStream inputStream = null;try {inputStream = Resources.getResourceAsStream(resource);} catch (IOException e) {e.printStackTrace();}//构建sqlSession的工厂sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);}//根据id查询person表数据@Testpublic void testSelectPersonById() {/*这个字符串由 PersonMapper.xml 文件中 两个部分构成<mapper namespace="com.itcoke.mapper.PersonMapper"> 的 namespace 的值<select id="selectPersonById" > id 值*/String namespace = "com.itcoke.mapper.PersonMapper";String method = "selectPersonById";//根据 sqlSessionFactory 产生 sessionSqlSession sqlSession = sessionFactory.openSession();Person person = sqlSession.selectOne(namespace + "." + method, 1L);System.out.println(person);sqlSession.close();}//根据id更新person表数据@Testpublic void testUpdatePersonById() {String statement = "com.itcoke.mapper.PersonMapper.updatePersonById";Person p = new Person();p.setPid(2L);p.setPage(18);//根据 sqlSessionFactory 产生 sessionSqlSession sqlSession = sessionFactory.openSession();sqlSession.update(statement, p);sqlSession.commit();sqlSession.close();}//向 person 表插入数据@Testpublic void testInsertPerson() {String statement = "com.itcoke.mapper.PersonMapper.insertPerson";Person p = new Person();p.setPname("可乐");p.setPage(18);//根据 sqlSessionFactory 产生 sessionSqlSession sqlSession = sessionFactory.openSession();sqlSession.insert(statement, p);sqlSession.commit();sqlSession.close();}//根据id更新person表数据@Testpublic void testDeletePersonById() {String statement = "com.itcoke.mapper.PersonMapper.deletePersonById";Person p = new Person();p.setPid(4L);//根据 sqlSessionFactory 产生 sessionSqlSession sqlSession = sessionFactory.openSession();sqlSession.delete(statement, p);sqlSession.commit();sqlSession.close();}
}

9、通过接口

在上面的例子中,我们发现 statement 每次都要自己书写拼接,很容易就写错了,这时候 MyBatis 提供了接口注册方式。

①、在 mapper 包下面新建一个 PersonMapper 接口

注意要和 PersonMapper.xml 同名,且在同一个包下,因为要和 namespace 相同。

package com.itcoke.mapper;import com.itcoke.bean.Person;public interface PersonMapper {Person selectPersonById(long pid);void updatePersonById(Person person);void insertPerson(Person person);void deletePersonById(long pid);
}

②、测试

//根据id查询person表数据//通过接口代理的方式@Testpublic void testInterfaceSelectPersonById() {    //根据 sqlSessionFactory 产生 session    SqlSession sqlSession = sessionFactory.openSession();    PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);    Person person = mapper.selectPersonById(1L);    System.out.println(person);    sqlSession.close();}

8、小结

至此,我们从头到尾撸了一遍利用 Mybatis 进行增删改查,后面便会深入底层,梳理架构。

从零单排——搭建Mybatis实例相关推荐

  1. 阿里云从零单排搭建环境

    一.想使用redis,下载redis,参考 http://www.redis.cn/download.html 下载了redis-5.0.9.tar.gz版本,gcc4.8.5就能用 安装完成后,需要 ...

  2. vue 请求在子组件加载后了_从零单排vue第九课--Vue实例及生命周期

    前期回顾 上一节课我们重点学习了子组件如何与父组件通信,我们使用$emit方法在子组件中触发一个事件,然后在父组件中接收它.本节课我们来深入了解下vue实例以及它的生命周期是怎么样的? 创建一个Vue ...

  3. Cocos2dx从零单排游戏开发(一)环境搭建

    今天晚上搭建起来开发环境了,因为我只有android手机,大屌丝一个也买不起苹果,所以我自然就只是试了试搭建起android的环境. 我的系统是win7 64位版,我年前有试着玩过cocos2dx 2 ...

  4. Spring5从零单排学习笔记【非常详细】

    前排 自学网课笔记整理,初次发博,有错的地方各位多多指教. Spring5从零单排学习笔记 文章目录 前排 Spring5从零单排学习笔记 一.Spring5框架概述 二.★IOC容器(Inversi ...

  5. 从零单排学Redis【铂金二】

    前言 好的,今天我们要上[铂金二]了,如果还没有上铂金的,赶紧先去蹭蹭经验再回来(不然不带你上分了): 从零单排学Redis[青铜] 从零单排学Redis[白银] 从零单排学Redis[黄金] 从零单 ...

  6. 从零单排学Redis【黄金】

    前言 好的,今天我们要上黄金段位了,如果还没经历过青铜和白银阶段的,可以先去蹭蹭经验再回来: 从零单排学Redis[青铜] 从零单排学Redis[白银] 看过相关Redis基础的同学可以知道Redis ...

  7. 从零单排学Redis【白银】

    前言 今天继续来学习Redis,上一篇从零单排学Redis[青铜]已经将Redis常用的数据结构过了一遍了.如果还没看的同学可以先去看一遍再回来~ 这篇主要讲的内容有: Redis服务器的数据库 Re ...

  8. 从零单排之玩转Python安全编程(II)

    转自:http://www.secpulse.com/archives/35893.html 都说Python大法好,作为一名合格的安全从业人员,不会几门脚本语言都不好意思说自己是从事安全行业的. 而 ...

  9. 使用IDEA Maven搭建Mybatis环境

    本文是使用IDEA Maven搭建Mybatis环境 涉及到的搭配环境 JDK1.8 Maven3.6.3 IDEA2019 MySQL数据库 一.Maven介绍 Maven 是一个项目管理工具,可以 ...

最新文章

  1. jQuery选择器实现隔行变色和使用javaScript实现隔行变色
  2. python开发软件行么-python适合开发桌面软件吗?
  3. CCNA综合实验配置
  4. 帧同步_什么是帧同步什么是状态同步
  5. java referencequeue_java源代码 Reference和ReferenceQueue分析
  6. Atom打造 c/c++编译环境(忙了一个上午)
  7. javascript中的变量如果没有定义就使用的话
  8. Ubuntu16.04源码安装postgresql-9.6.6数据库
  9. 转:构建高性能ASP.NET站点之二 优化HTTP请求(前端)
  10. ThreadLocal对象使用过程中容易陷入的坑
  11. 梦断代码-读书笔记一
  12. excel取消隐藏_Excel表格如何快速隐藏并取消隐藏
  13. 亚马逊Amazon广告API如何申请注册?
  14. iPhone苹果手机尺寸大小
  15. 用Python生成马赛克画
  16. 三款主流数码绘画软件调研分析
  17. Jupyter notebook用谷歌浏览器打开
  18. Android 学习记录(持续更新)
  19. Android 实现一个计时器
  20. e470换高分屏_DIY之Thinkpad E470升级记

热门文章

  1. 服务器入门与基础配置
  2. RoPE(旋转式位置编码)
  3. 金融数据挖掘 第7章 第2节(3)英文文本分析处理
  4. 电脑连接真机,但是androidstudio不显示手机,ADB Interface黄色感叹号
  5. Capslock + 的使用
  6. 计算机专业课程——答案搜集
  7. mysql遍历resultset_java中ResultSet遍历数据操作
  8. [翻译] Effective C++, 3rd Edition, Item 32: 确保 public inheritance 模拟 is-a(上)
  9. nrf51822学习之定时器的探究
  10. 【激光雷达点云障碍物检测】(一)滤波部分