MyBatis_01
概述
-
MyBatis是一款优秀的 持久层 框架,用于简化JDBC的开发。
-
MyBatis本是 Apache的一个开源项目iBatis,2010年这个项目由apache迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
- MyBatis中文文档:MyBatis中文网
持久层:数据库访问层(Data Access Layer)又称为DAO层,有时候也称为是持久层,其功能主要是负责数据库的访问。简单地说就是实现对数据表的Select(查询)、Insert(插入)、Update(更新)、Delete(删除)等操作。如果要加入ORM的思想,就会包括对象和数据表之间的映射,以及对象实体的持久化操作。
框架 :是一个半成品软件,是一套可重用的、通用的、软件基础代码模型。在框架的基础上进行软件开发更加高效、规范、通用、可拓展。
搭建一个小项目
1.创建springboot项目,File–>New–>Project 然后按照下图步骤
2.导入 mybatis的起步依赖、mysql的驱动包、Lombok注解。
2.搭建数据库,直接运行sql脚本到数据库中即可
CREATE DATABASE /*!32312 IF NOT EXISTS*/`Mybatis` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `Mybatis`;
/*Table structure for table `dept` */
DROP TABLE IF EXISTS `dept`;
CREATE TABLE `dept` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`name` varchar(10) NOT NULL COMMENT '部门名称',
`create_time` datetime NOT NULL COMMENT '创建时间',
`update_time` datetime NOT NULL COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COMMENT='部门表';
/*Data for the table `dept` */
insert into `dept`(`id`,`name`,`create_time`,`update_time`) values (1,'学工部','2023-12-15 17:03:04','2023-12-15 17:03:04'),(2,'教研部','2023-12-15 17:03:04','2023-12-15 17:03:04'),(3,'咨询部','2023-12-15 17:03:04','2023-12-15 17:03:04'),(6,'就业部','2023-12-21 18:49:18','2023-12-21 18:49:18'),(7,'销售部','2023-12-21 18:50:22','2023-12-21 18:50:22');
/*Table structure for table `emp` */
DROP TABLE IF EXISTS `emp`;
CREATE TABLE `emp` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
`username` varchar(20) NOT NULL COMMENT '用户名',
`password` varchar(32) DEFAULT '123456' COMMENT '密码',
`name` varchar(10) NOT NULL COMMENT '姓名',
`gender` tinyint(3) unsigned NOT NULL COMMENT '性别, 说明: 1 男, 2 女',
`image` varchar(300) DEFAULT NULL COMMENT '图像',
`job` tinyint(3) unsigned DEFAULT NULL COMMENT '职位, 说明: 1 班主任,2 讲师, 3 学工主管, 4 教研主管, 5 咨询师',
`entrydate` date DEFAULT NULL COMMENT '入职时间',
`dept_id` int(10) unsigned DEFAULT NULL COMMENT '部门ID',
`create_time` datetime NOT NULL COMMENT '创建时间',
`update_time` datetime NOT NULL COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8 COMMENT='员工表';
/*Data for the table `emp` */
insert into `emp`(`id`,`username`,`password`,`name`,`gender`,`image`,`job`,`entrydate`,`dept_id`,`create_time`,`update_time`) values (1,'jinyong','123456','金庸',1,'1.jpg',4,'2000-01-01',2,'2023-12-15 17:03:05','2023-12-15 17:03:05'),(2,'zhangwuji','123456','张无忌',1,'2.jpg',2,'2015-01-01',2,'2023-12-15 17:03:05','2023-12-15 17:03:05'),(3,'yangxiao','123456','杨逍',1,'3.jpg',2,'2008-05-01',2,'2023-12-15 17:03:05','2023-12-15 17:03:05'),(4,'weiyixiao','123456','韦一笑',1,'4.jpg',2,'2007-01-01',2,'2023-12-15 17:03:05','2023-12-15 17:03:05'),(5,'changyuchun','123456','常遇春',1,'5.jpg',2,'2012-12-05',2,'2023-12-15 17:03:05','2023-12-15 17:03:05'),(6,'xiaozhao','123456','小昭',2,'6.jpg',3,'2013-09-05',1,'2023-12-15 17:03:05','2023-12-15 17:03:05'),(7,'jixiaofu','123456','纪晓芙',2,'7.jpg',1,'2005-08-01',1,'2023-12-15 17:03:05','2023-12-15 17:03:05'),(8,'zhouzhiruo','123456','周芷若',2,'8.jpg',1,'2014-11-09',1,'2023-12-15 17:03:05','2023-12-15 17:03:05'),(9,'dingminjun','123456','丁敏君',2,'9.jpg',1,'2011-03-11',1,'2023-12-15 17:03:05','2023-12-15 17:03:05'),(10,'zhaomin','123456','赵敏',2,'10.jpg',1,'2013-09-05',1,'2023-12-15 17:03:05','2023-12-15 17:03:05'),(11,'luzhangke','123456','鹿杖客',1,'11.jpg',5,'2007-02-01',3,'2023-12-15 17:03:05','2023-12-15 17:03:05'),(12,'hebiweng','123456','鹤笔翁',1,'12.jpg',5,'2008-08-18',3,'2023-12-15 17:03:05','2023-12-15 17:03:05'),(13,'fangdongbai','123456','方东白',1,'13.jpg',5,'2012-11-01',3,'2023-12-15 17:03:05','2023-12-15 17:03:05'),(14,'zhangsanfeng','123456','张三丰',1,'14.jpg',2,'2002-08-01',2,'2023-12-15 17:03:05','2023-12-15 17:03:05');
3.配置MyBatis
在springboot项目中,可以编写application.properties文件,配置数据库连接信息。我们要连接数据库,就需要配置数据库连接的基本信息。
#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接的url
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis
#输入自己的数据库的用户名和密码
#连接数据库的用户名
spring.datasource.username=root
#连接数据库的密码
spring.datasource.password=root
4.目录搭建mapper,pojo文件夹
5.pojo包存放实体类,搭建Emp,User实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Emp {
private Integer id;
private String username;
private String password;
private String name;
private Short gender;
private String image;
private Short job;
private LocalDate entrydate; //LocalDate类型对应数据表中的date类型
private Integer deptId;
private LocalDateTime createTime;//LocalDateTime类型对应数据表中的datetime类型
private LocalDateTime updateTime;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private Integer id; //id(主键)
private String name; //姓名
private Short age; //年龄
private Short gender; //性别
private String phone; //手机号
//省略GET, SET方法
}
6.在mapper包下创建一个接口 UserMapper ,这是一个持久层接口(Mybatis的持久层接口规范一般都叫 XxxMapper)。
@Mapper//@Mapper注解:表示是mybatis中的Mapper接口
public interface UserMapper {
//查询所有用户数据
@Select("select id, name, age, gender, phone from user")
List<User> list();
}
7.编写测试类,在src下的test目录下,已经自动帮我们创建好了测试类 ,该测试类在运行时,会自动通过引导类加载Spring的环境(IOC容器)。我们要测试那个bean对象,就可以直接通过@Autowired注解直接将其注入进行,然后就可以测试了。
@SpringBootTest
public class MyBatisApplicationTests{
@Autowired
private UserMapper userMapper;
@Test
public void testList(){
List<User> userList = userMapper.list();
for (User user : userList) {
System.out.println(user);
}
}
}
8.一起看看运行结果怎么样
User(id=1, name=白眉鹰王, age=55, gender=1, phone=18800000000)
User(id=2, name=金毛狮王, age=45, gender=1, phone=18800000001)
User(id=3, name=青翼蝠王, age=38, gender=1, phone=18800000002)
User(id=4, name=紫衫龙王, age=42, gender=2, phone=18800000003)
User(id=5, name=光明左使, age=37, gender=1, phone=18800000004)
User(id=6, name=光明右使, age=48, gender=1, phone=18800000005)
MyBatis的优缺点
1. Mybait的优点:
(1) 简单易学, 容易上手(相比于Hibernte) 基于SQL编程;
(2) JDBC相比,减少了50%以上的代码量,消除了JDBC业量冗余的代码,不是要手动开关连接;
(3) 很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库, 所以只要DBC支持的数据库MyBatis都支持,而JDBC提供了可扩展性,所以只要这个数据库有针对Java的Jar包就可以就可以与MyBatis兼容), 开发人员不需要考虑数据库的差异性。
(4) 提供了很多第三方插件(分页插件/逆向工程)
(5) 能够与Spring很好的集成;
(6) MyBamybatistis相当灵活,不会对应用程序或者数据库的现有设计强加任何影响, SQL写在XML里, 从程序代码中彻底分离,解除sql与程序代码的耦合,便于统一管理和优化, 并可重用。
(7) 提供XML标签,支持编写动态SQL语句。
(8) 提供映射标签,支持对象与数据库的ORM字段关系映射。
(9) 提供对象关系映射标签,支持对象关系组建维护。
2. MyBatis框架的缺点:
(1) SQL语句的编写工作量较大,尤其是字段多、关联表多时,更是如此,对开发人员编写SQL语句的功底有一定要求。
(2) SQL语句依赖于数据库, 导致数据库移植性差,不能随意更换数据库。
与JDBC技术对比
jdbc缺点
原始的JDBC程序,存在以下几点问题:
-
数据库链接的四要素(驱动、链接、用户名、密码)全部硬编码在java代码中
-
查询结果的解析及封装非常繁琐
-
每一次查询数据库都需要获取连接,操作完毕后释放连接, 资源浪费, 性能降低
Mybatis优点
-
数据库连接四要素(驱动、链接、用户名、密码),都配置在springboot默认的配置文件 application.properties中
-
查询结果的解析及封装,由mybatis自动完成映射封装,我们无需关注
-
在mybatis中使用了数据库连接池技术,从而避免了频繁的创建连接、销毁连接而带来的资源浪费。
数据库连接池
我们所讲解的mybatis中,使用了数据库连接池技术,避免频繁的创建连接、销毁连接而带来的资源浪费。
数据库连接池是个容器,负责分配、管理数据库连接(Connection)
-
程序在启动时,会在数据库连接池(容器)中,创建一定数量的Connection对象
允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
-
客户端在执行SQL时,先从连接池中获取一个Connection对象,然后在执行SQL语句,SQL语句执行完之后,释放Connection时就会把Connection对象归还给连接池(Connection对象可以复用)
释放空闲时间超过最大空闲时间的连接,来避免因为没有释放连接而引起的数据库连接遗漏
-
客户端获取到Connection对象了,但是Connection对象并没有去访问数据库(处于空闲),数据库连接池发现Connection对象的空闲时间 > 连接池中预设的最大空闲时间,此时数据库连接池就会自动释放掉这个连接对象
数据库连接池的好处:
-
资源重用
-
提升系统响应速度
-
避免数据库连接遗漏