菜缤的世界 CairBin's Blog - SqlMapping
type: channel
link: https://blog.cairbin.top/index.php/tag/SqlMapping/
items: MyBatis与Spring整合使用
items: MyBatis入门——关联映射
items: MyBatis入门——动态SQL
items: MyBatis入门——了解MyBatis

MyBatis与Spring整合使用
type: item
date: 2024-04-01T10:28:37+00:00
description: SqlSession以及Spring与MyBatis整合准备所需要的JAR包要实现MyBatis与Spring的整合，很明显需要这两个框架的JAR包，但是只是使用这两个框架中所提供的JAR包是不够的，还需要配合其他包使用：Spring的JAR包MyBatis的JAR包Spring与MyBatis整合中间包mybatis-spring-x.x.x.jar数据库驱动JAR(以MYSQL为例)mysql-connector-java-x.x.x-bin.jar数据源所需的JAR(DBCP)commons-dbcp2-x.x.x.jar和commons-pool2-x.x.x.jar配置文件介绍关于resources文件夹我们在之前的项目中，几乎每次都会创建这个文件夹，然后Use as a source folder，那么这个文件夹到底是用来干啥的，凭什么使用它里面的文件是直接写文件名？实际上这个文件夹是专门存放你的应用所需资源的，如XML等配置文件。这个文件夹被标记为source folder后，在编译后，里面的文件会放到与编译好的文件相同目录里，所以你读取的直接使用文件名实际上是相对路径。pom.xml如果我们创建的是一个Maven项目，就可以在pom.xml里添加<properties></properties>标签来定义库版本，然后在下方的<dependencies></dependencies>中的<dependency></dependency>的<version></version>以${...}形式引用它。下面的XML文件省略了很多，仅为了演示。<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <junit.version>4.12</junit.version> [...] </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> [...] </dependencies>db.propertiesdb.properties主要包含一些数据库连接信息，比如JDBC连接驱动、数据库账户名和密码等。我们在之前的项目中就已经使用过这个文件了，但我们一直没有详细介绍过其每条内容的含义（实际上语义很明显）jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/db_mybatis?useUnicode=true&characterEncoding=utf8 jdbc.username=db_mybatis jdbc.password=db_mybatis首先第一行jdbc.driver是指定数据库连接驱动。JDBC即Java数据库连接，它定义了一套关系型数据库的规则，没错实际上就是接口，然后实现并不是由Java官方进行的，而是交给各个数据库厂商来做，它们打包的库也就是JAR包，就被叫做数据库驱动，同时也意味着不同数据库就有不同的驱动实现。程序设计者无需去关心每个数据库驱动是怎么实现的，而是像你把手机充电器插到墙上的插座一样，把驱动按照接口给“插”进去。这就是面向接口编程的好处。你的程序只是一个调用者，数据库驱动就像一个代理人，你要先告诉这个代理人怎么操作，然后让这个代理人去真正操纵数据库（怎么操纵你是不关心的，只要满足你的操作需求即可）。你与这个代理人约定的通用交流方式就是刚才的接口，而代理人具体的操纵方式就是驱动的实现。我们所给的代码中很显然是MySQL的数据库驱动，后面的mysql.jdbc.Driver实际上是随你pom.xml添加的包一块引入的。第二行的是数据库连接URL，它实际上是数据库JDBC连接字符串的一部分。它的书写形式应该参考数据库驱动提供方的文档！jdbc说明这是一个JDBC的连接字符串mysql说明连接的数据库为MYSQLlocalhost所在部分，一般是数据库的网络地址或域名，localhost实际上是一个域名，它在你系统的HOST文件中被解析到了127.0.0.1（通常是这样，不绝对，你完全可以修改它），这个地址是一个回环地址，它实际上表示你机器本身。同理，我的MySQL如果在远程服务器192.168.10.2上面，这里就不再是localhost，而是192.168.10.2或者对应的域名。db_mybatis部分对应数据库名称，这个我…

MyBatis入门——关联映射
type: item
date: 2024-04-01T10:27:45+00:00
description: MyBatis关联映射为什么要关联映射实际开发中，对数据库操作常常会涉及多张表，所以在OOP中就涉及对象与对象的关联关系。针对多表操作，MyBatis提供关联映射。关联关系概述一对一：A类中定义B类的属性b，B类中定义A类属性a。一对多：一个A类类型对应多个B类。多对多：在A类中定义B的集合，B中定义A的集合。嵌套查询与嵌套结果嵌套查询是通过执行另外一条SQL映射语句来返回预期复杂类型：嵌套查询是在查询SQL嵌套一个子查询嵌套查询会执行多条SQL语句嵌套查询SQL语句编写相对简单嵌套结果是使用嵌套结果映射来处理的联合结果子集：嵌套结果是一个嵌套的多表查询SQL嵌套结果只会执行一条复杂的SQL语句嵌套结果SQL语句写起来相对麻烦对于嵌套查询有一个问题，那就是执行多条SQL语句导致性能开销很大。于是就有了MyBatis的延迟加载——fetchType。实践创建表我们还是用之前的账户连接数据库，终端命令可以如下mysql -u db_mybatis -p输入密码敲击回车，然后切换数据库到db_mybatisWindows用户可以用终端或者sqlyog执行下面语句如果你没有这个数据库请回到前面的章节创建它。USE db_mybatis;我们要使用一个新的customer表，所以把之前项目留下的删除掉DROP TABLE IF EXISTS customer;重新创建它CREATE TABLE customer( `id` int(32) NOT NULL AUTO_INCREMENT, `username` varchar(50) DEFAULT NULL, `jobs` varchar(50) DEFAULT NULL, `phone` varchar(16) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;给这张表插入两条数据方便我们接下来写代码用INSERT INTO customer(`id`,`username`,`jobs`,`phone`) VALUES (1,'zhangsan','teacher','11111111111'),(2,'lisi','student','11111111112');创建一张idcard表，并设置主键（主码）为id如果之前存在请删除DROP TABLE IF EXISTS `idcard`;CREATE TABLE idcard( `id` int(11) NOT NULL AUTO_INCREMENT, `code` varchar(50) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;同样插入两条数据（身份证号是我瞎编的，为了防止巧合不一定符合真实格式，但长度与现实一样）INSERT INTO idcard(`id`,`code`) VALUES(1,'37010219800X051118'),(2,'370203199X09092222');创建persion表，并插入数据DROP TABLE IF EXISTS person; CREATE TABLE person( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL, `age` int(11) DEFAULT NULL, `card_id` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `FK_person` (`card_id`), CONSTRAINT `FK_person` FOREIGN KEY (`card_id`) REFERENCES `idcard` (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; INSERT INTO person(`id`,`name`,`age`,`card_id`) values (1,'张三',18,1),(2,'李四',18,2);创建product表并插入数据DROP TABLE IF EXISTS product; CREATE TABLE product( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(32) DEFAULT NULL, `price` double DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoD…

MyBatis入门——动态SQL
type: item
date: 2024-04-01T10:27:02+00:00
description: 动态SQL什么是动态SQL动态SQL是MyBatis强大特性之一，MyBatis3采用了功能强大的基于OGNL的表达式来完成SQL。动态SQL主要元素常用的动态SQL主要元素如下：如果单独对以上元素解释理解起来还是比较费力的，接下来还是以代码的形式展现。实践基础部分我们还是用之前的项目top.cairbin.test4，我们把src/main/java目录下的top.cairbin.test4包中的CustomerMapper.xml文件里的<mapper namespace="top.cairbin.test4.CustomerMapper"></mapper>中间的内容全部删除，最终效果看上去应该与下面一致：<?xml version="1.0" encoding="UTF-8"?> <mapper namespace="top.cairbin.test4.CustomerMapper"> </mapper>然后把src/test/java目录下的top.cairbin.test4中的测试类MyBatisTest里面的测试方法也删除掉package top.cairbin.test4; import java.io.InputStream; 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.Test; import top.cairbin.test4.*; public class MyBatisTest { }我们先来编写表与对象的映射关系，在CustomerMapper.xml的<mapper>元素之间填写如下内容（注意包名与你的一致）： <resultMap id="BaseResultMap" type="top.cairbin.test4.Customer"> <id column="id" jdbcType="INTEGER" property="id" /> <result column="username" jdbcType="VARCHAR" property="username" /> <result column="jobs" jdbcType="VARCHAR" property="jobs" /> <result column="phone" jdbcType="VARCHAR" property="phone" /> </resultMap> <sql id="Base_Column_List"> id, username, jobs, phone </sql>看起来效果应该跟下面一样，不过在后文中这个文件会越写越长，由于篇幅有限，我们每次仅给出增添部分的代码，而不是每次修改都粘贴全部配置到这里来<?xml version="1.0" encoding="UTF-8"?> <mapper namespace="top.cairbin.test4.CustomerMapper"> <resultMap id="BaseResultMap" type="top.cairbin.test4.Customer"> <id column="id" jdbcType="INTEGER" property="id" /> <result column="username" jdbcType="VARCHAR" property="username" /> <result column="jobs" jdbcType="VARCHAR" property="jobs" /> <result column="phone" jdbcType="VARCHAR" property="phone" /> </resultMap> <sql id="Base_Column_List"> id, username, jobs, phone </sql> </mapper>为了方便操作SqlSession，我们在src/main/java的top.cairbin.test4包下写一个工具类，名称为MyBatisHelperpackage top.cairbin.test4; import java.io.Reader; import org.apache.ibatis.io.Resources; import o…

MyBatis入门——了解MyBatis
type: item
date: 2024-04-01T10:25:00+00:00
description: 了解MyBatis什么是MyBatisMyBatis 是一款优秀的持久层框架，它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO（Plain Old Java Objects，普通老式 Java 对象）为数据库中的记录。MyBatis中文文档 可参考 https://mybatis.net.cn/。MyBatis是不是ORM？什么是ORM？即Object-Relationl Mapping，它的作用是在关系型数据库和对象之间作一个映射，这样，我们在具体的操作数据库的时候，就不需要再去写复杂的SQL语句。JPA是orm框架标准，MyBatis没有实现JPA，和orm框架的设计思路完全不一样。MyBatis是拥抱sql，而orm则更靠近面向对象。Mybatis是sql mapping框架而不是orm框架，当然orm和Mybatis都是持久层框架。MyBatis工作原理使用MyBatis废话不多说，我们直接上手用下。创建数据库与表我们来创建一个名称为db_mybatis的数据库还是老样子，我这里以终端为例，你可以用sqlyog等工具。mysql -uroot有密码的话mysql -u root -p执行SQL语句创建数据库CREATE DATABASE db_mybatis;创建管理该数据库的用户db_mybatis，密码为db_mybatis，访问主机为本机可访问localhost，如果远程访问请改为%。CREATE USER 'db_mybatis'@'localhost' IDENTIFIED BY 'db_mybatis';给它管理db_mybatis的所有权限GRANT ALL ON db_mybatis.* TO 'db_mybatis'@'localhost';刷新权限flush privileges;如果你用的MySQL8.0及以上版本，客户端版本较老，由于加密算法问题需要追加以下语句：ALERT USER 'db_mybatis'@'localhost' IDENTIFIED WITH mysql_native_password by 'db_mybatis';退出MySQL控制台，返回PC终端exit;我们用刚创建的用户连接下mysqlmysql -u db_mybatis -p然后出现提示，输入密码db_mybatis敲击回车，如果密码跟我不一样，这里与你上面的设置一致。切换数据库到db_mybatisUSE db_mybatis;如果表名称已经存在，会影响我们创建，如果你之前不太重要的话就直接删了，如果想要保留那么新建的表就要修改名字DROP TABLE IF EXISTS `customer`;我们创建一张表，名称为customer，主键为id如果用标准的SQL语句来写的话，我这里版本为MySQL5.7，可能会报错如果报错，就替换成以下语句CREATE TABLE customer ( id int(32) AUTO_INCREMENT, username varchar(50) DEFAULT NULL, jobs varchar(50) DEFAULT NULL, phone varchar(16) DEFAULT NULL, PRIMARY KEY(`id`) );我们插入条数据（这里的电话号码是我瞎编的）INSERT INTO customer(id,username,jobs,phone) VALUES(1,'joy','doctor','15544433322');通过SELECT语句查看下，看来是成功的SELECT * FROM customer;创建项目我们创建一个Maven项目，不会的请回Spring初步部分看看。项目名称为top.cairbin.test4，然后修改pom.xml添加依赖项<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>top.cairbin</groupId> <artifactId>test4</artifactId> <version>0.0.1-SNAPSH…