• 中文
    • 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
  • 2.3k
  • 请登录之后再进行评论

    登录
    单栏布局 侧栏位置: