一、JDBC操作回顾
新增数据操作代码如下:
public static void main(String[] args) throws SQLException { Scanner sc = new Scanner(System.in); System.out.println("请输入id"); int id = sc.nextInt(); System.out.println("请输入name"); String name = sc.next(); //1、建立数据源 DataSource dataSource = new MysqlDataSource(); ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java110?characterEncoding=utf8&&useSSL=false"); ((MysqlDataSource)dataSource).setUser("root"); ((MysqlDataSource)dataSource).setPassword("123456"); //2、和数据库服务器建立连接 Connection connection = dataSource.getConnection(); //3、构造sql String sql = "insert into student values(?,?)";//?作为占位符 //预处理 PreparedStatement statement = connection.prepareStatement(sql); statement.setInt(1, id); statement.setString(2, name); //4、把构造好的sql发送的数据库服务器里执行 int n = statement.executeUpdate(); System.out.println(n); //5、回收必要的资源 statement.close(); connection.close(); }
之前博客的详细介绍:Java的JDBC编程-CSDN博客
从上述代码和操作流程可以看出来,对于JDBC来说,整个操作都非常繁琐,我们不但要拼接每一个参数,而且还有按照模板代码的方式,一步步的操作数据库,并且每次操作完,还要手动关闭连接等。所有的这些操作步骤,都需要再每个方法中重复书写,那有没有一种方法,可以更简单、更方便操作数据库呢?肯定有,这也是我们要学习MyBatis的真正原因,它可以帮助我们更方便、更快速的操作数据库。
二、什么是MyBatis?
1、MyBatis是一块优秀的 持久层 框架,用于简化JDBC的开发。
2、MyBatis本是Apache的一个开源项目iBatis,2010年这个项目由Apache迁移到了google code,并且改名为MyBaits。2013年11月迁移到Github。
3、官网:MyBatis中文网 。
4、持久层:指的就是持久化操作的层,通常指数据访问层(dao),是用来操作数据库的。
简单来说,MyBatis是更简单完成程序和数据库交互的框架,也就是更简单的操作和读取数据库工具。
三、MyBatis入门
MyBatis操作数据库的步骤:
1、准备工作(创建Spring Boot工程、数据库表准备、实体类)。
2、引入Mybatis的相关依赖,配置Mybatis(数据库连接信息)。
3、编写SQL语句(注解 / XML)。
4、测试。
1、准备工作
(1)创建工程
创建Spring Boot 工程,并且导入MyBatis的起步依赖、MySQL驱动包。
MyBatis是一个持久层框架,具体的数据存储和数据操作还是在MySQL中操作的,所以需要添加MySQL驱动。
项目工程创建完成后,会自动在pom.xml文件中导入MyBatis依赖和MySQL驱动依赖,如图:
代码:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>3.0.3</version> </dependency>
它们的版本会随着SpringBoot版本发生变化,SpringBoot 3.X 对应 MyBatis版本为 3.X,对应关系参考:mybatis-spring-boot-autoconfigure – Introduction ,如图:
(2)数据准备
创建用户表,代码如下:
-- 创建数据库 DROP DATABASE IF EXISTS mybatis_test; 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 = utf8mb4; -- 添加用户信息 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' );
创建对应的实体类,代码如下:
@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; }
2、配置数据库连接字符串
MyBatis中要连接数据库,需要数据库相关的参数配置:MySQL驱动类、登录名、密码、数据库连接字符串。
application.yml文件,配置内容如下:
spring: datasource: url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=false username: root password: 1234 driver-class-name: com.mysql.cj.jdbc.Driver
注意事项:如果MySQL是 5.X 之前的使用的是 “com.mysql.jdbc.Driver”,如果是大于5.X使用的是“com.mysql.cj.jdbc.Driver”。
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=1234
3、写持久层代码
在项目中,创建持久层接口UserInfoMapper,如图:
代码如下:
import com.example.mybatisdemo.model.UserInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Select; import java.util.List; @Mapper public interface UserInfoMapper { @Select("select * from userinfo") List<UserInfo> getUserInfoAll(); }
MyBatis的持久层接口规范一般都叫XxxMapper。@Mapper注解:表示是MyBatis中的Mapper接口。
程序运行时,MyBatis框架会自动生成接口的实现类对象(代理对象),并交给Spring的IOC容器管理。
@Select注解:代表的就是select查询,也就是注解对应方法的具体实现内容。
4、单元测试
在Spring Boot工程下中,src下的test目录中,已经自动帮我们创建好了测试类,我们可以直接使用这个测试类来进行测试,代码如下:
import com.example.mybatisdemo.mapper.UserInfoMapper; import com.example.mybatisdemo.model.UserInfo; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.util.List; @SpringBootTest class MybatisDemoApplicationTests { @Autowired private UserInfoMapper userInfoMapper; @Test void contextLoads() { List<UserInfo> userInfos = userInfoMapper.getUserInfoAll(); System.out.println(userInfos); } }
测试类添加了注解@SpringBootTest,该测试类在运行时,就会自动加载Spring的运行环境。我们通过@Autowired这个注解,注入我们要测试的类,就可以开始进行测试了。
运行结果如下:
返回对应的结果,可以看到,只有SQL语句中查询的列中,只有和对应的列名一样,才会有显示(如果和数据库列名一样,就会有显示对应的信息)。如图:
(1)使用IDEA自动成成测试类
在你要测试的类中,鼠标右键 -> Generate -> Test -> 勾上对应要测试的方法,这里使用UserInfoMapper类做演示,如图:
点击OK,会在test目录下生成对应的测试类,如图:
测试类代码如下:
import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest class UserInfoMapperTest { @Autowired private UserInfoMapper userInfoMapper; @Test void getUserInfoAll() { System.out.println(userInfoMapper.getUserInfoAll()); } }
记得加@SpringBootTest注解。
运行结果如下:
(2)使用程序运行代码,编写controller类,service类
controller类代码如下:
@RequestMapping("/user") @RestController public class UserController { @Autowired private UserService userService; @RequestMapping("/getUserAll") public List<UserInfo> getUserAll() { return userService.getUserAll(); } }
service类代码如下:
@Service public class UserService { @Autowired private UserInfoMapper userInfoMapper; public List<UserInfo> getUserAll() { return userInfoMapper.getUserInfoAll(); } }
浏览器访问:127.0.0.1:8080/user/getUserAll ,结果如下:
四、常见问题错误
1、SQL错误
如图:下面from和userinfo连在一起,没有空格分开。
双引号中多些一个空格都不行,不然就会报错,如图:
2、配置信息错误(检查账户密码)
3、未配置数据库
把application.yml配置内容注释掉,如图:
测试用例报错如下:创建dataSource失败了,解决方案是检查配置
程序启动代码报错如下:
如果配置内容格式不对,如图:
依然会报错上面这种错误。
4、数据库不存在
修改配置文件内容,其中这个数据库是不存在的,如图:
运行测试类代码,报错如下:
5、表不存在
修改代码如下:
运行测试类,报错如下:
6、方法名重复
UserInfoMapper类的方法名重复,修改代码如下:
运行测试类,报错如下: