• 中文
    • English
  • 注册
  • 查看作者
    • SpringBoot和Mybatis的整合

      一.  获取数据库连接

      1. 之前新建项目时,在Dependencies窗口下,我们只选择了web中的spring-web-starter,现在我们新建一个项目,点击SQL,并勾选以下内容

      SpringBoot和Mybatis的整合

      2.  数据库的连接池这次我们不再使用用阿里家的Druid,而是使用SpringBoot为我们提供的com.zaxxer:HikariCP:3.2.0

      ps.  如果想使用Druid,我们还需要在主配置文件中为其配置type:

      spring:
           datasource:
          type: com.alibaba.druid.pool.DruidDataSource

      3.  在SSM框架中,数据源的相关配置都是在applicationContext.xml中导入jdbc.properties进行配置:

       <context:property-placeholder location="classpath:jdbc.properties"/>
       
          <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
              <property name="driverClassName" value="${jdbc.driver}"/> <!--    OGNL-->
              <property name="url" value="${jdbc.url}"/>
              <property name="username" value="${jdbc.username}"/>
              <property name="password" value="${jdbc.password}"/>
          </bean>

      而SpringBoot一大特点便是主动为我们提供了很多配置并能简化配置文件,我们点击项目中的External Libraries,找到Maven:org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:2.1.0,并依次按照下图的中的目录点击找到jdbc中的DataSourceAutoConfiguration

      SpringBoot和Mybatis的整合

      打开DataSourceAutoConfiguration,按住ctrl键,单击DataSourceProperties.class

      SpringBoot和Mybatis的整合

      进入DataSourceProperties.class后,可以看到前缀和相关配置项

      SpringBoot和Mybatis的整合

      接下来我们就可以在application.yml文件中,根据上面的前缀和配置属性对数据库信息进行配置:

      spring:
        datasource:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost:3306/gagamall?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
          username: root
          password: zhangjia
          # type: com.alibaba.druid.pool.DruidDataSource 这里不再采用Druid连接池,而是采用SpringBoot自带的HikariCP

      4.  最后编写测试类Springboot06ApplicationTests.java将DataSource注入,即可获取到数据库链接

      package io.zhangjia.springboot06;
      
      import org.junit.Test;
      import org.junit.runner.RunWith;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.boot.test.context.SpringBootTest;
      import org.springframework.test.context.junit4.SpringRunner;
      
      import javax.sql.DataSource;
      import java.sql.Connection;
      import java.sql.SQLException;
      
      @RunWith(SpringRunner.class)
      @SpringBootTest
      public class Springboot06ApplicationTests {
      
          @Autowired
          private DataSource dataSource;
      
          @ Test   //@和Test中间并无空格,为避免编辑器bug,所以添加了空格显示 
          public void contextLoads() throws SQLException {
              Connection connection = dataSource.getConnection();
              System.out.println(connection);
              System.out.println(connection.getClass());
              connection.close();
      
          }
      
      }
      
      输出:
      HikariProxyConnection@1834755909 wrapping com.mysql.jdbc.JDBC4Connection@44b29496
      class com.zaxxer.hikari.pool.HikariProxyConnection

      二. SpringBoot整合Mybatis

      1.  首先在springboot3中新建mapper包,并编写BookMapper

      package io.zhangjia.springboot06.mapper;
      
      import io.zhangjia.springboot06.entity.Book;
      import org.springframework.stereotype.Component;
      
      import java.util.List;
      
      @Component
      public interface BookMapper {
          int doInsert(Book book);
      
          int doDelete(Integer bookId);
      
          int doUpdate(Book book);
      
          List<Book> queryAll();
      
          Book queryById(Integer bookId);
      
      }

      2.  接下来在resources中新建mapper包,并添加BookMapper.xml

      <?xml version="1.0" encoding="UTF-8" ?>
      <!DOCTYPE mapper
              PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
              "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
      
      <mapper namespace="io.zhangjia.springboot06.mapper.BookMapper">
          <select id="queryAll" resultType="book">
              select *
              from book;
          </select>
      
           <insert id="doInsert" useGeneratedKeys="true" keyProperty="bookId">
              INSERT INTO book (name, author, price) VALUE (#{name}, #{author}, #{price})
          </insert>
      
          <delete id="doDelete">
              DELETE
              FROM book
              WHERE BOOK_ID = #{bookId}
          </delete>
      
      
          <update id="doUpdate">
              UPDATE book
              SET price  = #{price},
                  author =#{author},
                  name   = #{name}
              WHERE book_id = #{bookId}
          </update>
          <select id="queryById" resultType="book">
              select *
              from book
              WHERE book_id = #{bookId};
          </select>
      
      
      </mapper>

      3.  编写BookService

      package io.zhangjia.springboot06.service;
      
      
      import io.zhangjia.springboot06.entity.Book;
      
      import java.util.List;
      
      public interface BookService {
      
      
          List<Book> books();
      
          Book getBook(Integer bookId);
      
          Book saveOrUpdate(Book book);
      
          Book delete(Integer id);
      
      }

      4.  实现BookServiceImpl,并添加@Service注解

      package io.zhangjia.springboot06.service.impl;
      
      
      import io.zhangjia.springboot06.entity.Book;
      import io.zhangjia.springboot06.mapper.BookMapper;
      import io.zhangjia.springboot06.service.BookService;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.stereotype.Service;
      
      import java.util.List;
      
      @Service("bookService")
      public class BookServiceImpl implements BookService {
          @Autowired
          private BookMapper bookMapper;
      
          @Override
          public List<Book> books() {
              return bookMapper.queryAll();
          }
      
          @Override
          public Book getBook(Integer bookId) {
              return bookMapper.queryById(bookId);
          }
      
          @Override
          public Book saveOrUpdate(Book book) {
      
              if (book.getBookId() == null) {
                  //添加
                  bookMapper.doInsert(book);
              } else {
                  //修改
                  bookMapper.doUpdate(book);
              }
              return book;
          }
      
          @Override
          public Book delete(Integer id) {
              Book book = getBook(id);
              bookMapper.doDelete(id);
              return book;
          }
      }

      5.  在SSM框架中,关于Mybatis的相关配置是在applicationContext.xml文件中完成的:

          <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
              <property name="dataSource" ref="dataSource" />
              <property name="configLocation" value="classpath:mybatis-config.xml" />
              <property name="mapperLocations" value="classpath:mapper/*.xml" />
              <property name="typeAliasesPackage" value="io.zhangjia.ssm.entity" />  <!--起别名-->
          </bean>
       
          <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer" >
              <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
              <property name="basePackage" value="io.zhangjia.ssm.mapper"/>
          </bean>

      SpringBoot也为我们提供了Mybatis的相关配置,点击项目中的External Libraries,找到Maven:org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:2.1.0,并依次找到jdbc中的autoconfigure中的MybatisAutoConfiguration,点击其中的{MybatisProperties.class}

      @EnableConfigurationProperties({MybatisProperties.class})

      即可看到Mybatis的配置前缀和相关配置信息:

      @ConfigurationProperties(
          prefix = "mybatis"
      )
      public class MybatisProperties {
          public static final String MYBATIS_PREFIX = "mybatis";
          private static final ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();
          private String configLocation;
          private String[] mapperLocations;
          private String typeAliasesPackage;
          ....
      }

      接下来在application.yml文件中,添加指定配置即可:

      #添加
      mybatis:
        mapper-locations: classpath:mapper/*.xml

      注意,关于basePackage的配置,不能在主配置中完成,需要在Springboot启动类Springboot3Application中,添加@MapperScan(“io.zhangjia.springboot3.mapper”)注解。

      package io.zhangjia.springboot06;
      
      import org.mybatis.spring.annotation.MapperScan;
      import org.springframework.boot.SpringApplication;
      import org.springframework.boot.autoconfigure.SpringBootApplication;
      
      @SpringBootApplication
      @MapperScan(basePackages = "io.zhangjia.springboot06.mapper")
      public class SpringBoot06Application {
      
          public static void main(String[] args) {
              SpringApplication.run(SpringBoot06Application.class, args);
          }
      
      }

      6.  编写BookController

      package io.zhangjia.springboot06.controller;
      
      
      import io.zhangjia.springboot06.aspect.LoggingAspect;
      import io.zhangjia.springboot06.entity.Book;
      import io.zhangjia.springboot06.service.BookService;
      import io.zhangjia.springboot06.util.R;
      
      import org.slf4j.Logger;
      import org.slf4j.LoggerFactory;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.web.bind.annotation.*;
      
      import java.util.List;
      
      
      @RestController
      public class BookController {
          @Autowired
          private BookService bookService;
      
          private Logger logger = LoggerFactory.getLogger(BookController.class);
      
      
          @GetMapping(value = "/books", produces = "application/json;charset=utf-8")
          public R books() {
              List<Book> books = bookService.books();
              return R.success(books);
          }
      
          @GetMapping(value = "/book/{bookId}", produces = "application/json;charset=utf-8")
          public R book(@PathVariable Integer bookId) {
              Book book = bookService.getBook(bookId);
              logger.info(book.toString());
              return R.success(book);
          }
      
          @PostMapping(value = "/book", produces = "application/json;charset=utf-8")
          public R save(Book book) {
              Book book2 = bookService.saveOrUpdate(book);
              return R.success(book2);
          }
      
          @PutMapping(value = "/book", produces = "application/json;charset=utf-8")
          public R update(Book book) {
              Book book2 = bookService.saveOrUpdate(book);
              return R.success(book2);
          }
      
          @DeleteMapping(value = "/book/{bookId}", produces = "application/json;charset=utf-8")
          public R delete(@PathVariable Integer bookId) {
      
              Book book = bookService.delete(bookId);
              return R.success(book);
          }
      }

      在之前的controller中,我们的方法的返回值都是String类型,如果想把从数据库查到的数据显示在页面中,需要先将查询到的数据转换成JSON字符串,然后再将其返回,但是给Controller添加@RestController注解后,SpringBoot可以直接将查询到的数据直接作为JSON字符串返回,此时访问http://localhost:8888/book,即可查看到查询的数据。关于R类,请查看本站《SpringBoot:使用JSON的工具类进行JSR303数据校验》一文。

    • 0
    • 0
    • 0
    • 1.9k
    • 请登录之后再进行评论

      登录

      赞助本站

      • 支付宝
      • 微信
      • QQ

      感谢一直支持本站的所有人!

      单栏布局 侧栏位置: