Mybatis简化jdbc操作

框架就是一个软件的半成品,许多实现的细节都已经实现。主要的功能就是可以帮助我们减少繁琐重复的操作。
Mybatis就是用来简化JDBC的开发,简化一些繁琐的操作。

之前我们在写jdbc的代码的时候就会需要进行获取连接对象,以及操作代码,自己封装结果集。如果我们的表的结构发生变化,基本很多很多的内容都需要我们去改,这是十分繁琐的事情,特别是当表比较多或者改的东西比较多的时候就显得很头疼。

image.png

存在的问题就是硬编码和操作繁琐

注册驱动、获取连接 上图标1的代码有很多字符串,而这些是连接数据库的四个基本信息,以后如果要将Mysql数据库换成其他的关系型 数据库的话,这四个地方都需要修改,如果放在此处就意味着要修改我们的源代码。 SQL语句 上图标2的代码。如果表结构发生变化,SQL语句就要进行更改。这也不方便后期的维护。

操作繁琐 手动设置参数 手动封装结果集 上图标4的代码是对查询到的数据进行封装,而这部分代码是没有什么技术含量,而且特别耗费时间的。

Mybatis就是用来简化一些繁琐的操作的。

image.png

说明:图片来自黑马ppt,和上诉部分说明来自黑马(真的很细致)。

可能刚开始还没有深刻认识,因为使用的不是很频繁,也没有做过太大的项目。后面多用用就可以了。还有就是框架的配置可能看起来比较麻烦,但是这样的框架对于后续的维护是非常方便的。

使用Mybatis框架

首先我们创建一个表

  1. create database mybatis;
  2. use mybatis;
  3. drop table if exists tb_user;
  4. create table tb_user(
  5. id int primary key auto_increment,
  6. username varchar(20),
  7. password varchar(20),
  8. gender char(1),
  9. addr varchar(30)
  10. );
  11. INSERT INTO tb_user VALUES (1, 'zhangsan', '123', '男', '北京');
  12. INSERT INTO tb_user VALUES (2, '李四', '234', '女', '天津');
  13. INSERT INTO tb_user VALUES (3, '王五', '11', '男', '西安');

然后我们要使用Mybatis框架,我们就在Maven核心配置文件里面进行导入。因为我们我们需要用到数据库,肯定需要导入驱动。如果需要单元测试那么需要junit,如果需要日志的话,就需要logback。
这些可以详细了解,然后之后用到的时候就去用好了,比较简单。
在pom.xml文件里面需要包含以下。其他的默认。

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.mybatis</groupId>
  4. <artifactId>mybatis</artifactId>
  5. <version>3.5.6</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>mysql</groupId>
  9. <artifactId>mysql-connector-java</artifactId>
  10. <version>8.0.19</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>junit</groupId>
  14. <artifactId>junit</artifactId>
  15. <version>4.13</version>
  16. <scope>test</scope>
  17. </dependency>
  18. <dependency>
  19. <groupId>ch.qos.logback</groupId>
  20. <artifactId>logback-classic</artifactId>
  21. <version>1.2.3</version>
  22. </dependency>
  23. <!-- 添加logback-core依赖 -->
  24. <dependency>
  25. <groupId>ch.qos.logback</groupId>
  26. <artifactId>logback-core</artifactId>
  27. <version>1.2.3</version>
  28. </dependency>
  29. </dependencies>

然后注意logback也需要在resource下面进行一下配置。
image.png
一定要注意结构层次。
内容

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <configuration>
  3. <!--
  4. CONSOLE :表示当前的日志信息是可以输出到控制台的。
  5. -->
  6. <appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
  7. <encoder>
  8. <pattern>[%level] %cyan([%thread]) %boldGreen(%logger{15}) - %msg %n</pattern>
  9. </encoder>
  10. </appender>
  11. <logger name="jgdabc" level="DEBUG" additivity="false">
  12. <appender-ref ref="Console"/>
  13. </logger>
  14. <!--
  15. level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL OFF
  16. 默认debug
  17. <root>可以包含零个或多个<appender-ref>元素,标识这个输出位置将会被本日志级别控制。
  18. -->
  19. <root level="DEBUG">
  20. <appender-ref ref="Console"/>
  21. </root>
  22. </configuration>

关于logback以及junit我们后面说明。

然后我们需要一个Mybatis的核心配置文件
image.png
关键信息

  1. <!--
  2. environments:配置数据库连接环境信息。可以配置多个environment,通过default属性切换不同的environment
  3. -->
  4. <environments default="development">
  5. <environment id="development">
  6. <transactionManager type="JDBC"/>
  7. <dataSource type="POOLED">
  8. <!--注意数据库驱动格式,并不是统一的,还有就是数据库url规范,系统的时区和
  9. 数据库的时区不一样也会报错,这些这里可以处理一下-->
  10. <!--数据库连接信息-->
  11. <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
  12. <property name="url" value="jdbc:mysql:///mybatis?serverTimezone=GMT"/>
  13. <property name="username" value="root"/>
  14. <property name="password" value="123456"/>
  15. </dataSource>
  16. </environment>
  17. <environment id="test">
  18. <transactionManager type="JDBC"/>
  19. <dataSource type="POOLED">
  20. <!--数据库连接信息-->
  21. <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
  22. <property name="url" value="jdbc:mysql:///mybatis?serverTimezone=GMT"/>
  23. <property name="username" value="root"/>
  24. <property name="password" value="123456"/>
  25. </dataSource>
  26. </environment>
  27. </environments>
  28. <mappers>
  29. <mapper resource="UserMapper.xml"/>
  30. <!-- 这个是映射-->
  31. </mappers>

关于映射文件,需要我们创建一个,然后在和Mybatis文件中指定路径。
image.png

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <!--
  6. namespace:名称空间
  7. -->
  8. <!---->
  9. <mapper namespace="test">
  10. <!--resultType作为返回的类型,返回一个User类-->
  11. <select id="selectAll" resultType="jgdabc.User">
  12. select *
  13. from tb_user;
  14. </select>
  15. <select id="selectById" resultType="jgdabc.User">
  16. -- select *
  17. -- from tb_user where id = #{id};
  18. </select>
  19. </mapper>

可以看到映射文件主要是封装了相关的sql操作语句。返回一个类型。返回的类型我们可以去创建相应的类型类。
image.png

  1. package jgdabc;
  2. public class User {
  3. private Integer id;
  4. private String username;
  5. private String password;
  6. private String gender;
  7. public Integer getId() {
  8. return id;
  9. }
  10. public void setId(Integer id) {
  11. this.id = id;
  12. }
  13. public String getUsername() {
  14. return username;
  15. }
  16. @Override
  17. public String toString() {
  18. return "User{" +
  19. "id=" + id +
  20. ", username='" + username + '\'' +
  21. ", password='" + password + '\'' +
  22. ", gender='" + gender + '\'' +
  23. ", addr='" + addr + '\'' +
  24. '}';
  25. }
  26. public void setUsername(String username) {
  27. this.username = username;
  28. }
  29. public String getPassword() {
  30. return password;
  31. }
  32. public void setPassword(String password) {
  33. this.password = password;
  34. }
  35. public String getGender() {
  36. return gender;
  37. }
  38. public void setGender(String gender) {
  39. this.gender = gender;
  40. }
  41. public String getAddr() {
  42. return addr;
  43. }
  44. public void setAddr(String addr) {
  45. this.addr = addr;
  46. }
  47. private String addr;
  48. }

这个User在测试类可以作为泛型
现在我们来看测试类

  1. package jgdabc_;
  2. import jgdabc.User;
  3. import org.apache.ibatis.io.Resources;
  4. import org.apache.ibatis.session.SqlSession;
  5. import org.apache.ibatis.session.SqlSessionFactory;
  6. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  7. import java.io.IOException;
  8. import java.io.InputStream;
  9. import java.util.List;
  10. public class MybatisDemo {
  11. public static void main(String[] args) throws IOException {
  12. // 加载mybatis的核心配置文件
  13. //1. 加载mybatis的核心配置文件,获取 SqlSessionFactory
  14. String resource = "mybatis-config.xml";
  15. InputStream inputStream = Resources.getResourceAsStream(resource);
  16. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  17. //2. 获取SqlSession对象,用它来执行sql
  18. SqlSession sqlSession = sqlSessionFactory.openSession();
  19. //3. 执行sql
  20. List<User> users = sqlSession.selectList("test.selectAll");
  21. System.out.println(users);
  22. //4. 释放资源
  23. sqlSession.close();
  24. }
  25. }

这些框架性的东西并不需要死记硬背,多用用就记住了。

我们运行一下。
image.png
image.png
自此,我们对这个Mybatis框架的第一遍尝试操作就到此。