菜缤的世界 CairBin's Blog - sql
type: channel
link: https://blog.cairbin.top/index.php/tag/sql
items: MyBatis与Spring整合使用
items: MyBatis入门——关联映射
items: MyBatis入门——动态SQL
items: SQL语句入门
items: LibManagementSys图书管理系统

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…

SQL语句入门
type: item
date: 2022-10-09T06:52:17+00:00
description: SQL语句入门起因学校开设数据库相关的课程了，打算总结一篇关于基础SQL语句的文章。SQL介绍SQL最早版本是由IBM开发的，一直发展到至今。SQL语言有如下几个部分：数据定义语言DDL：提供定义关系模式、删除关系以及修改关系模式的命令数据操纵语言DML：提供从数据库中查询信息以及在数据库中插入元组、删除元组以及修改元组的能力完整性：SQL DDL包括定义完整性的约束命令视图定义：SQL DDL包括定义视图的命令事务控制：SQL包括定义事务的开始点和结束点命令嵌入式SQL和动态SQL：定义如何嵌入如C++等这样的编程语言授权：SQL DDL包括定义对关系和视图的访问权限的命令SQL标准支持多种固有类型：char(n) 具有用户指定长度为n的字符串varchar(n) 最大长度为n的可变长字符串int 整数smallint 小正数(依赖于机器的整数类型的子集)numeric(p,d) 指定精度的定点数。此数字有p位(加上一个符号位)小数点右边有p位数中的d位数字real 单精度double 双精度float(n) 精度至少为n的浮点数SQL语句入门首先说明一下，SQL语句后面的分号是可选的。创建关系CREATE TABLE student ( Sname VARCHAR(20), Sid INT, PRIMARY KEY(Sid) );上述语句会创建一个student的关系(表)，它包含学生姓名和学生id号码。其中，Sname学生姓名的最大长度不超过20个字符，Sid为整型，并且PRIMARY KEY(Sid)对关系进行了完整性约束，说明学号作为主键，也就是说同一个学生他的id号码是唯一的。SQL还支持许多完整性约束，例如外码与非空，下面仅对这两种进行介绍：外码声明关系中的任意元组在属性上的取值必须对应于另外的某个关系的某元组在主码属性上的取值，其形式为foreign key(A,B,C)references X，其中A B C为属性，X为指定的关系非空完整性约束表示某个属性的取值不能为空，其形式A INT not null表示类型为整型名为A的属性不能为空下面我们创建一个与课程相关的表，要求主键(主码)为课程id且不为空，外码为上面student关系的学生姓名属性来做演示：CREATE TABLE course ( Cid INT NOT NULL, Sname VARCHAR(20), Cname VARCHAR(20), PRIMARY KEY(Cid), FOREIGN KEY(Sname) REFERENCES student );此时Sname的取值必须是student关系的Sname中的的一个取值。删除关系删除操作有两种：下方这条语句会删除名为course的关系DROP TABLE course;而DELETE FROM course;则会删除course关系中的所有元组（数据），但该关系保留说白一点就是前者连表带数据一块删除，后者只剩一个空表增加与删除属性有时候会向关系中添加一个新的属性，则需要用到以下语句ALTER TABLE student ADD Sage INT;该语句向student中添加了一个名为Sage，类型为整型的属性，用于表示学生的年龄在student中原有的元组在Sage的取值都将为空，即null（意思就是老数据原来没有年龄，现在新建了年龄这一列，之前的老数据该列上的取值都为空）删除属性就很简单了，我们删除student关系中的Sage属性为例，语句如下ALTER TABLE student DROP Sage;但是注意，很多数据库都不支持这一点，执行该语句可能会报错。查询SQL查询结构由三个子居构成select，from，where查询以在from子句列出的关系作为输入，并在这些关系上进行where和select子句中的指定运算，然后产生一个关系作为结果。为方便演示，先向student表中插入如下几条数据INSERT INTO student VALUES('CairBin',1); INSERT INTO student VALUES('Bob',2); INSERT INTO student VALUES('Alice',3); INSERT INTO student VALUES('Alice',4);INSERT INTO course VALUES(4,'Alex','chemistry'); INSERT INTO course VALUES(1,'CairBin','math'); INSERT INTO course VALUES(2,'CairBin','chemistry'); INSERT INTO course VALUES(3,'Alice','chemistry'…

LibManagementSys图书管理系统
type: item
date: 2022-03-31T19:01:35+00:00
description: LibManagementSys介绍图书管理系统开发环境.net6.0MySQL 5.7.26提示在使用时，需手动导入DataBase文件夹下单sql数据库文件功能介绍登录功能支持注册功能支持密码哈希加密(SHA256,MD5)支持连接数据库图书查询功能图书管理功能用户管理功能图书借阅功能图书归还功能数据库结构db_libsystb_user 普通账户表tb_admin 管理员账户表tb_book 图书表tb_borrowed_book 借书表项目目录LibManagementSysAdminModel 管理员模块BookInfo 图书信息BookManage 图书管理模块BookSearch 图书查询模块BorrowBook 图书借还模块BorrowBookInfo 所借图书信息ChangePassword 密码更改模块HashEncryption 哈希加密模块LinkMysql 数据库操作模块LoginModel 登录模块MainMenu 主菜单模块RegisterModel 注册模块TableValue 表对应信息结构UserInfo 用户信息UserManage 用户管理模块UserModel 用户模块UserSearch 用户信息查询模块发布地址Github