前言
上一期我们讲完Spring的配置文件以及日志的设置,这一期我们就来谈谈mybatis操作数据库的一些操作,使用这个框架可以极大地简化JDBC的冗长代码,大大增强了生产力,只需我们提供简单的sql语句以及对应的注解就可以操作数据库
我们说web应用程序主要分为三层 Controller Service Dao
前两层我们都在之前的文章中谈论过,但是之前我们的底层数据都是使用moke的方式产生的,现在我们就来学习Spring与数据库的交互
废话不多说,我们现在就开始认识一下Mybatis
回顾JDBC
为了更好的了解java操作数据库的代码操作,我们先回顾一下之前使用JDBC是如何操作数据库的
1.创建数据库连接池
2.使用DataSourse获取数据库连接Connection
3.编写带?占位符的SQL语句
4.通过Connection以及SQL创建操作命令对象statement
5.替换占位符,确定替换的字段类型以及替换的值需要一一对应
6.使用statement执行sql语句
7.查询操作,返回结果集.....
8.处理结果集
9.释放资源
这里我们发现增删改查都有一些共性的代码,比如都需要创建数据库连接池,都需要建立连接,需要使用带占位符的SQL语句等,我们就想能不能用一套注解将其封装起来,这样我们就只需要书写对应的SQL语句以及集合容器就可以获得所有的数据库数据
1.什么是Mybatis
Mybatis是一个优秀的持久层框架,主要用于简化JDBC的开发
首先我们创建一个项目,注意这里记得勾选Mybatis和MySQL的驱动
注意这里项目创建成功会自动在pom文件中导入需要的依赖
注:这里的SpringBoot框架的版本号记得与Mybatis对应
参考网址 MyBatis中文网
2.数据准备
这里我们首先需要创建一个数据库以便测试使用
CREATE DATABASE mybatis_test DEFAULT CHARACTER SET utf8mb4;
然后创建表往表里面插入对应的数据
-- 使⽤数据数据 USE mybatis_test; -- 创建表[⽤⼾表] DROP TABLE IF EXISTS userinfo; CREATE TABLE `userinfo` ( `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(), PRIMARY KEY ( `id` ) ) ENGINE = INNODB DEFAULT CHARSET = utf8mp4
插入用户信息
-- 添加⽤⼾信息 INSERT INTO mybatis_test.userinfo ( username, `password`, age, gender, phone ) VALUES ( 'admin', 'admin', 18, 1, '18612340001' ); INSERT INTO mybatis_test.userinfo ( username, `password`, age, gender, phone ) VALUES ( 'zhangsan', 'zhangsan', 18, 1, '18612340002' ); INSERT INTO mybatis_test.userinfo ( username, `password`, age, gender, phone ) VALUES ( 'lisi', 'lisi', 18, 1, '18612340003' ); INSERT INTO mybatis_test.userinfo ( username, `password`, age, gender, phone ) VALUES ('wangwu', 'wangwu', 18, 1, '18612340004' );
此时我们可以使用可视化工具或者是对应的数据库客户端查看是否插入成功,博主这里使用的是navicat
配置文件设置
spring: datasource: url: jdbc:mysql://127.0.0.1:13306/mybatis_test?characterEncoding=utf8&useSSL=false username: root password: abc123 driver-class-name: com.mysql.cj.jdbc.Driver
注:这里的数据库以及对应的密码用户,数据库名称都记得修改成自己的,否则会出现报错信息
比如密码错误等等
3.Mybatis实现数据库操作
首先我们想实现一个select*语句
在这之前,我们先得创建一个UserInfo类用来保存每一条数据库信息
@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; }
1.实现select语句
@Mapper public interface UserInfoMapper { @Select("select * from userinfo") List<UserInfo> getUserInfoAll(); }
Mybatis的持久层接口规范主要是叫xxxMapper
@Mapper注解表示是Mybatis中的Mapper接口
程序运行时框架就会自动生成其实现类对象交给SpringIOC管理
这里我们使用一个@Select注解来表示这里需要写一条selct语句
因为这里程序中有多条数据,所以我们使用list集合来装返回的对象数据
我们这里的返回数据测试在test单元测试中测试
在上述接口中按住alt+insert点击test
然后勾上对应的接口
然后再test的文件夹下就会出现对应的测试代码
我们只需要注入对应的对象,执行获取到返回的对象列表打印即可看到数据库中的结果
最后结果如下,点击箭头所指的小三角即可执行
我们可以和数据库中的数据进行对比一下
这里就会发现后面的几个时间选项没有展示出来,这一点我们将在下篇进行讲解
2.打印日志
这里有时候为了对比输入输出参数,我们也是需要打印参数查看的
只需要在yml文件中添加一行打印日志
mybatis: configuration: # 配置打印 MyBatis⽇志 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
3.参数传递
我们知道其他的语句在写入数据库的时候一定得有传参,所以下面我们来谈谈对参数传递的操作
我们只需要将接口中的方法带有参数,然后和对应的语句中进行参数绑定即可
比如下面我们尝试获取id为2的用户数据
注:如果是使用阿里云虚拟的时候需要使用重命名对应参数与sql中的对应
使用@Parma("")即可修改对应的名称
下面我们来实现对应的增删改查
4.insert
这里和上面的其实是类似的,我们只需要使用对应的
@insert注解即可,我们开始演示
我们发现数据库已经更新了
如果这里使用了重命名,我们需要使用对象.属性来传参
比如
这时候我们就需要使用对象名.属性来传参
5.delete
此时我们将刚刚更新的数据进行删除
使用@Delete注解
这是一开始的数据表状态
执行成功后,我们就成功的将数据表的id=6的信息删除成功了
6.update
和上面一样的操作,这次我们将id为5的数据名称改为赵雷
7.获取自增主键
我们在数据库中设置的id是自增主键,我们可以尝试获取id
直接获取是不会获取到的
我们可以使用一个注解完成 @Options
可能出现的错误小总结
1.sql错误
2.mysql配置信息错误
3.未配置数据库,没有填写配置信息..
4.数据库名填写错误
5.表不存在或名称填写错误
6.方法名重复