MyBatis入门
1.什么是MyBatis?
• MyBatis是⼀款优秀的 持久层 框架,⽤于简化JDBC的开发。
• MyBatis本是 Apache的⼀个开源项⽬iBatis,2010年这个项⽬由apache迁移到了google code,并且改名为MyBatis 。2013年11⽉迁移到Github.
• 官⽹:MyBatis中⽂⽹
在上⾯我们提到⼀个词:持久层
• 持久层:指的就是持久化操作的层, 通常指数据访问层(dao), 是⽤来操作数据库的.
简单来说 MyBatis 是更简单完成程序和数据库交互的框架,也就是更简单的操作和读取数据库⼯具
接下来,我们就通过⼀个入门程序,让⼤家感受⼀下通过Mybatis如何来操作数据库
2.准备工作
2.1.创建项目
(1)创建springboot项目
(2)导入 mybatis的起步依赖、mysql的驱动包
在pom.xml文件中会有两个依赖:
// MyBatis依赖
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.3.0</version>
</dependency>
//MySQL驱动依赖
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
2.2.MySQL数据准备
(1)创建数据库:
CREATE DATABASE mybatis_study DEFAULT CHARACTER SET utf8mb4;
(2)使用数据库
-- 使⽤数据数据
USE mybatis_study;
(3)创建用户表
-- 创建表[⽤⼾表]
CREATE TABLE `user_info` (
`id` INT ( 11 ) NOT NULL AUTO_INCREMENT,
`username` VARCHAR ( 127 ) NOT NULL,
`password` VARCHAR ( 127 ) NOT NULL,
`age` TINYINT ( 4 ) NOT NULL,
`gender` TINYINT ( 4 ) DEFAULT '0' COMMENT '1-男 2-⼥ 0-默认',
`phone` VARCHAR ( 15 ) DEFAULT NULL,
`delete_flag` TINYINT ( 4 ) DEFAULT 0 COMMENT '0-正常, 1-删除',
`create_time` DATETIME DEFAULT now(),
`update_time` DATETIME DEFAULT now() ON UPDATE now(),
PRIMARY KEY ( `id` )
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4;
(4)添加用户信息
-- 添加⽤⼾信息
INSERT INTO mybatis_study.user_info( username, `password`, age, gender, phone )
VALUES ( 'admin', 'admin', 18, 1, '18612340001' );
INSERT INTO mybatis_study.user_info( username, `password`, age, gender, phone )
VALUES ( 'zhangsan', 'zhangsan', 18, 1, '18612340002' );
INSERT INTO mybatis_study.user_info( username, `password`, age, gender, phone )
VALUES ( 'lisi', 'lisi', 18, 1, '18612340003' );
INSERT INTO mybatis_study.user_info( username, `password`, age, gender, phone )
VALUES ( 'wangwu', 'wangwu', 18, 1, '18612340004' );
2.3.创建对应的实体类
实体类的属性名与表中的字段名⼀⼀对应
@Data
public class UserInfo {
private Integer id;
private String username;
private String password;
private Integer age;
private Integer gender;
private String phone;
private Integer deleteFlag;
private Date createTime;
private Date updateTime;
}
注意:在实际开发中不管什么实体类都要设置删除标志、创建时间、修改时间
3.写配置文件和获取数据
3.1写配置文件
Mybatis中要连接数据库,需要数据库相关参数配置
• MySQL驱动类
• 登录名
• 密码
• 数据库连接字符串
在application.properties
文件中配置:
#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接的url
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mybatis_test? characterEncoding=utf8&useSSL=false
#连接数据库的⽤⼾名
spring.datasource.username=root
#连接数据库的密码
spring.datasource.password=root
在application.yml
文件中配置:
# 数据库连接配置
spring:
datasource:
# 如果 MySQL下载在本地电脑上用下面的方式
# url: jdbc:mysql://127.0.0.1:3306/mybatis_study?characterEncoding=utf8&useSSL=false
# MySQL在远程服务器上
url: jdbc:mysql://x.x.x.x:3306/mybatis_study?characterEncoding=utf8&useSSL=false
username: root #MySQL账号
password: root #MySQL密码
driver-class-name: com.mysql.cj.jdbc.Driver
注意事项:
如果使⽤ MySQL 是 5.x 之前的使⽤的是"com.mysql.jdbc.Driver",如果是⼤于 5.x 使⽤的是“com.mysql.cj.jdbc.Driver”
3.2 持久层代码
在项⽬中, 创建持久层接⼝UserInfoMapper:
@Mapper
public interface UserInfoMapper {
// 查询所有用户
@Select("select * from user_info")
List<UserInfo> selectAll();
}
Mybatis的持久层接⼝规范⼀般都叫 XxxMapper
@Mapper注解:表⽰是MyBatis中的Mapper接⼝
• 程序运⾏时, 框架会⾃动⽣成接⼝的实现类对象(代理对象),并给交Spring的IOC容器管理
• @Select注解:代表的就是select查询,也就是注解对应⽅法的具体实现内容.
4.单元测试
(1)在创建出来的SpringBoot⼯程中,在src下的test⽬录下,已经⾃动帮我们创建好了测试类 ,我们可以直接使⽤这个测试类来进⾏测试.
(2)需要测试的类中 右键
点击Test...
然后会进入到一个创建测试类的框框:
会出现下面的类:
class UserInfoMapperTest {
@BeforeEach
void setUp() {
}
@AfterEach
void tearDown() {
}
@Test
void selectAll() {
}
}
可以在里面写测试的内容,我们要测试的是利用MyBatis获取MySQL数据库中的内容:
//使用日志打印
@Slf4j
class UserInfoMapperTest {
@Autowired
private UserInfoMapper userInfoMapper;
@BeforeEach
void setUp() {
log.info("setUp");
}
@AfterEach
void tearDown() {
log.info("tearDown");
}
@Test
void selectAll() {
List<UserInfo> list = userInfoMapper.selectAll();
log.info(list.toString());
}
}
运行结果:
已经使用@Autowired
为什么是空指针呢?
答:运行时只是执行了该类,Spirng项目并没有运行,IoC容器中并没有UserInfoMapper的Bean
解决方法:在测试类上添加测试注解@SpringBootTest
:
@Slf4j
@SpringBootTest //启动Sring 容器
class UserInfoMapperTest {
@Autowired
private UserInfoMapper userInfoMapper;
//在测试方法运行之前启动
@BeforeEach
void setUp() {
log.info("setUp");
}
//在测试方法运行之后启动
@AfterEach
void tearDown() {
log.info("tearDown");
}
@Test
void selectAll() {
List<UserInfo> list = userInfoMapper.selectAll();
//把列表中的数据分行打印
for(Object item: list) {
log.info(item.toString());
}
}
}
运行结果:
下章讲解为什么打印的有空值
5.连接数据库时常见的错误
5.1 url 配置错误
检查url:
(1)使用的是远程数据库,ip地址填写错误
(2)端口号错误
(3)等等
5.2 MySQL账号密码错误
检查账号密码是否出错,改正后重新测试
5.3 找不到数据库
检查数据库名
5.4 表错误
检查Mapper类相关表的操作中表拼写错误
5.3 云服务器的端口没有开放
(1)进入到云服务器的控制台
(2)点击使用的云服务器
(3)点击 配置安全组规则
(4)添加规则
(5)开放端口