zoukankan      html  css  js  c++  java
  • Spring Boot学习笔记(二二)

     

    Mybatis集成

    Spring Boot中的JPA部分默认是使用的hibernate,而如果想使用Mybatis的话就需要自己做一些配置。使用方式有两种,第一种是Mybatis官方提供的 mybatis-spring-boot-starter ,第二种是类似 mybatis-spring的方式,需要自己写一些代码。但是可以更方便地控制Mybatis的各项配置。

    mybatis-spring-boot-starter

    这种方式只需要在application.properties中配置相关的Mybatis属性就可以了。数据源使用的是Spring Boot默认的数据源

    mybatis.mapperLocations: mapper配置文件的路径,支持通配符方式
    mybatis.typeAliasesPackage: 用来扫描Entity的包
    mybatis.config:mybatis-config.xml配置文件的路径
    mybatis.typeHandlersPackage:扫描typeHandlers的包
    mybatis.checkConfigLocation:检查配置文件是否存在
    mybatis.executorType:设置执行模式(SIMPLE, REUSE, BATCH),默认为SIMPLE

    mybatis-spring方式

    这种方式和平常的用法比较接近。需要添加mybatis依赖和mybatis-spring依赖。然后创建一个MyBatisConfig配置类:

    package com.freud.test.springboot;
    
    import javax.sql.DataSource;
    
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.mybatis.spring.SqlSessionFactoryBean;
    import org.mybatis.spring.SqlSessionTemplate;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
    import org.springframework.core.io.support.ResourcePatternResolver;
    import org.springframework.jdbc.datasource.DataSourceTransactionManager;
    import org.springframework.transaction.PlatformTransactionManager;
    import org.springframework.transaction.annotation.EnableTransactionManagement;
    import org.springframework.transaction.annotation.TransactionManagementConfigurer;
    
    /**
     * MyBatis基础配置
     *
     * @author Freud
     */
    @Configuration
    @EnableTransactionManagement
    public class MybatisConfig implements TransactionManagementConfigurer {
    
        @Autowired
        private DataSource dataSource;
    
        @Bean(name = "sqlSessionFactory")
        public SqlSessionFactory sqlSessionFactoryBean() {
            SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
            bean.setDataSource(dataSource);
            bean.setTypeAliasesPackage("com.freud.test.springboot");
    
            // 添加XML目录
            ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
            try {
                bean.setMapperLocations(resolver.getResources("classpath:mapper/*.xml"));
                return bean.getObject();
            } catch (Exception e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }
        }
    
        @Bean
        public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
            return new SqlSessionTemplate(sqlSessionFactory);
        }
    //
      * 因为添加了spring-boot-starter-
         * jdbc依赖,会触发DataSourceTransactionManagerAutoConfiguration这个自动化配置类
         * ,自动构造事务管理器,所以若只有一个数据源可以不必进行下面的配置
    @Bean public PlatformTransactionManager annotationDrivenTransactionManager() { return new DataSourceTransactionManager(dataSource); } }

    上面代码创建了一个SqlSessionFactory和一个SqlSessionTemplate,为了支持注解事务,增加了@EnableTransactionManagement注解,并且反回了一个PlatformTransactionManagerBean

    添加一个MyBatisMapperScannerConfig.java类,把mapper扫描单独放在这里配置(或者在Application 添加@MapperScan注解)

    如果想要扫描MyBatis的Mapper接口, 就需要配置MapperScannerConfigurer。

    package com.freud.test.springboot;
    
    import org.mybatis.spring.mapper.MapperScannerConfigurer;
    import org.springframework.boot.autoconfigure.AutoConfigureAfter;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    /**
     * MyBatis扫描接口
     * 
     * @author Freud
     */
    @Configuration
    // 注意,由于MapperScannerConfigurer执行的比较早,所以必须有下面的注解
    @AutoConfigureAfter(MybatisConfig.class)
    public class MyBatisMapperScannerConfig {
    
        @Bean
        public MapperScannerConfigurer mapperScannerConfigurer() {
            MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
            mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory");
            mapperScannerConfigurer.setBasePackage("com.freud.test.springboot.mapper");
            return mapperScannerConfigurer;
        }
    
    }

     

    实验

    本实验使用mybatis-spring-boot-starter方式。

    创建一个Maven项目

    /images/blog/spring-boot/22-integrate-with-mybatis/01-new-maven-project.png

    pom.xml

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.freud.test</groupId>
        <artifactId>spring-boot-22</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>jar</packaging>
    
        <name>spring-boot-22</name>
        <url>http://maven.apache.org</url>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        </properties>
    
        <dependencies>
            <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>1.0.0</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-jdbc</artifactId>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-dependencies</artifactId>
                    <version>1.5.4.RELEASE</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    </project>

    application.yml

    spring:
      application:
        name: test-22
      jpa:
        generate-ddl: false
        show-sql: true
        hibernate: 
          ddl-auto: none
      datasource:
        platform: MYSQL
        continue-on-error: false
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3306/test?useSSL=false
        username: root
        password: root
        schema: classpath:schema.sql
        data: classpath:data.sql
    server:
      port: 9090
    mybatis: 
      mapper-locations: classpath:mapper/*.xml
      type-aliases-package: com.freud.test.springboot

    schema.sql

    DROP TABLE IF EXISTS `user`;
    
    CREATE TABLE `user` (
      `id` int(20) NOT NULL AUTO_INCREMENT,
      `name` varchar(50) NOT NULL,
      `age` int(10) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    DELETE FROM `user`;

    data.sql

    insert into user(id, name, age) values(1,'Freud1',29);
    insert into user(id, name, age) values(2,'Freud2',29);
    insert into user(id, name, age) values(3,'Freud3',29);
    insert into user(id, name, age) values(4,'Freud4',29);
    insert into user(id, name, age) values(5,'Freud5',29);

    UserMapper.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
    PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
    "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
    <mapper namespace="com.freud.test.springboot.mapper.UserMapper">
    
        <resultMap id="user" type="com.freud.test.springboot.bean.User">
            <id property="id" jdbcType="INTEGER" column="ID"/>
            <result property="name" jdbcType="VARCHAR" column="NAME"/>
            <result property="age" jdbcType="INTEGER" column="AGE"/>
        </resultMap>
        
        <select id="getById" resultMap="user">
            SELECT 
                ID,
                NAME,
                AGE
            FROM USER
            WHERE ID = #{id}
        </select>
        
        <insert id="insert">
            INSERT INTO USER 
            (   
                NAME,
                AGE
            )
            VALUES
            (
                #{name},
                #{age}
            )
        </insert>
        
        <delete id="delete">
            DELETE FROM USER
            WHERE ID = #{id}
        </delete>
        
    </mapper>

    User.java

    package com.freud.test.springboot.bean;
    
    /**
     * @author Freud
     */
    public class User {
    
        private long id;
        private String name;
        private int age;
    
        public long getId() {
            return id;
        }
    
        public void setId(long id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
    }

    UserController.java

    package com.freud.test.springboot.controller;
    
    import java.util.List;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    
    import com.freud.test.springboot.bean.User;
    import com.freud.test.springboot.mapper.UserMapper;
    
    /**
     * @author Freud
     */
    @RestController
    @RequestMapping("/user")
    public class UserController {
    
        public static final String RESULT_SUCCESS = "success";
        public static final String RESULT_FAILED = "failed";
    
        @Autowired
        private UserMapper userMapper;
    
        @GetMapping("/all")
        public List<User> all() {
            return userMapper.getAll();
        }
    
        @GetMapping("/find")
        public User find(@RequestParam("id") long id) {
            return userMapper.getById(id);
        }
    
        @GetMapping("/save")
        public String save(User user) {
            try {
                userMapper.insert(user);
                return RESULT_SUCCESS;
            } catch (Exception e) {
                return RESULT_FAILED;
            }
        }
    
        @GetMapping("/delete")
        public String delete(@RequestParam("id") long id) {
            try {
                userMapper.delete(id);
                return RESULT_SUCCESS;
            } catch (Exception e) {
                return RESULT_FAILED;
            }
        }
    }

    UserMapper.java

    package com.freud.test.springboot.mapper;
    
    import java.util.List;
    
    import org.apache.ibatis.annotations.Param;
    import org.apache.ibatis.annotations.Select;
    
    import com.freud.test.springboot.bean.User;
    
    /**
     * @author Freud
     */
    public interface UserMapper {
    
        @Select("SELECT * FROM USER")
        public List<User> getAll();
    
        public User getById(@Param("id") long id);
    
        public void insert(User user);
    
        public void delete(@Param("id") long id);
    }

    App.java

    package com.freud.test.springboot;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    /**
     * @author Freud
     */
    @SpringBootApplication
    public class App {
    
        public static void main(String[] args) {
            SpringApplication.run(App.class, args);
        }
    
    }

    项目结构

    /images/blog/spring-boot/22-integrate-with-mybatis/02-project-hierarchy.png

    运行及结果

    访问http://localhost:9090/user/all,查看所有的用户列表:

    /images/blog/spring-boot/22-integrate-with-mybatis/03-explorer-result-all.png

    通过浏览器的Get请求创建一个新的用户http://localhost:9090/user/save?name=kang&age=30

    /images/blog/spring-boot/22-integrate-with-mybatis/04-explorer-result-add.png

    重新访问http://localhost:9090/user/all,查看所有的用户列表:

    /images/blog/spring-boot/22-integrate-with-mybatis/05-explorer-result-all.png

    通过ID查询某个用户信息http://localhost:9090/user/find?id=2

    /images/blog/spring-boot/22-integrate-with-mybatis/06-explorer-result-find-by-id.png

    通过ID删除某个用户信息http://localhost:9090/user/delete?id=1

    /images/blog/spring-boot/22-integrate-with-mybatis/07-explorer-result-remove.png

    重新访问http://localhost:9090/user/all,查看所有的用户列表:

    /images/blog/spring-boot/22-integrate-with-mybatis/08-explorer-result-all.png

    参考资料

  • 相关阅读:
    POJ1125-Stockbroker Grapevine【Floyd】(模板题)
    Codeforces 862B (二分图染色)
    hdu3047 Zjnu Stadium【带权并查集】
    HDU1532 网络流最大流【EK算法】(模板题)
    hdu 2063 过山车【匈牙利算法】(经典)
    HDU-2066-一个人的旅行 【Dijkstra】
    HDU 3625 Examining the Rooms【第一类斯特灵数】
    HDU4372-Count the Buildings【第一类Stirling数】+【组合数】
    HDU 6114 Chess【逆元+组合数】(组合数模板题)
    HDU1211 密文解锁 【扩展欧几里得】【逆元】
  • 原文地址:https://www.cnblogs.com/zyy1688/p/10118932.html
Copyright © 2011-2022 走看看