美文网首页
Spring Boot 整合MyBatis

Spring Boot 整合MyBatis

作者: 小昭文 | 来源:发表于2018-10-11 10:23 被阅读84次
    image.png

    一、准备工作

    1、添加依赖

    在pom.xml文件中,添加mybatis-spring-boot-starter依赖和mySql连接的依赖

    <!--MySQL数据库驱动,无需参与编译-->
    
    <dependency>
    
        <groupId>mysql</groupId>
    
        <artifactId>mysql-connector-java</artifactId>
    
        <version>5.1.40</version>
    
        <scope>runtime</scope>
    
    </dependency>
    
    <!--MyBatis-->
    
    <dependency>
    
        <groupId>org.mybatis.spring.boot</groupId>
    
        <artifactId>mybatis-spring-boot-starter</artifactId>
    
        <version>1.3.2</version>
    
    </dependency>
    

    2、在数据库中添加如下表

    # Dump of table role
    
    # ------------------------------------------------------------
    
    DROP TABLE IF EXISTS `role`;
    
    CREATE TABLE `role` (
    
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
    
    `name` varchar(50) NOT NULL DEFAULT '' COMMENT '角色名称',
    
    PRIMARY KEY (`id`)
    
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    LOCK TABLES `role` WRITE;
    
    /*!40000 ALTER TABLE `role` DISABLE KEYS */;
    
    INSERT INTO `role` (`id`, `name`)
    
    VALUES
    
      (1,'超级管理员'),
    
      (2,'一般用户');
    
    /*!40000 ALTER TABLE `role` ENABLE KEYS */;
    
    UNLOCK TABLES;
    

    3、配置数据库的用户名密码信息

    在resources的application.yml文件中添加如下节点

    spring:
      datasource:
        username: root
        password:
        url: jdbc:mysql://localhost:3306/student_manage?useUnicode=true&characterEncoding=UTF-8
        driver-class-name: com.mysql.jdbc.Driver
    

    二、建立相关类

    1、添加实体类

    新建一个domain的包,然后在此包中新增一个Role的类

    public class Role {
    
        /**
    
         * 主健ID (无默认值)
    
         */
    
        private Integer id;
    
        /**
    
         * 角色名称(必填项)  (默认值为: )
    
         */
    
        private String name;
    
        public Integer getId() {
    
            return id;
    
        }
    
        public void setId(Integer id) {
    
            this.id = id;
    
        }
    
        public String getName() {
    
            return name;
    
        }
    
        public void setName(String name) {
    
            this.name = name;
    
        }
    
    }
    

    2、添加dao层

    新建一个dao的包,然后在此包下新建一个RoleMapper的类

    /**
    
    * @Mapper 如果没有在SpringbootLearingApplication添加@MapperScan 注解的话,这里都需要一个这样的注解
    
    */
    
    public interface RoleMapper {
    
        /**
    
         * 查询所有的角色
    
         *
    
         * @return
    
         */
    
        List<Role> queryAll();
    
        /**
    
         * 查询单个
    
         *
    
         * @param id
    
         * @return
    
         */
    
        Role selectOne(Integer id);
    
        /**
    
         * 新增
    
         *
    
         * @param role
    
         * @return
    
         */
    
        int add(Role role);
    
        /**
    
         * 修改
    
         *
    
         * @param role
    
         * @return
    
         */
    
        int update(Role role);
    
        /**
    
         * 删除
    
         *
    
         * @param id
    
         * @return
    
         */
    
        int delete(Integer id);
    
    }
    

    3、添加service层

    新建一个service的包,然后在此包下新建一个RoleService的类,其中的@SuppressWarnings(“SpringJavaAutowireingInspection”) 注解是为了不让IDEA标红,可有可无

    @Service
    
    public class RoleService {
    
        @Autowired
    
        @SuppressWarnings("SpringJavaAutowiringInspection")
    
        private RoleMapper roleMapper;
    
        /**
    
         * 查询所有的角色
    
         *
    
         * @return
    
         */
    
        public List<Role> queryAll() {
    
            return this.roleMapper.queryAll();
    
        }
    
        /**
    
         * 查询单个
    
         *
    
         * @param id
    
         * @return
    
         */
    
        public Role selectOne(Integer id) {
    
            return this.roleMapper.selectOne(id);
    
        }
    
        /**
    
         * 新增
    
         *
    
         * @param role
    
         * @return
    
         */
    
        public int add(Role role) {
    
            return this.roleMapper.add(role);
    
        }
    
        /**
    
         * 修改
    
         *
    
         * @param role
    
         * @return
    
         */
    
        public int update(Role role) {
    
            return this.roleMapper.update(role);
    
        }
    
        /**
    
         * 删除
    
         *
    
         * @param id
    
         * @return
    
         */
    
        public int delete(Integer id) {
    
            return this.roleMapper.delete(id);
    
        }
    
    }
    

    4、添加控制器

    在controller包下新建一个RoleController的类,其他代码省略

    @RestController
    
    @RequestMapping("/api/role")
    
    public class RoleController {
    
        @Autowired
    
        private RoleService roleService;
    
        @RequestMapping("/list")
    
        public List<Role> queryAll() {
    
            return this.roleService.queryAll();
    
        }
    
    }
    

    5、配置全局Mapper包扫描

    在SpringbootLearningApplication文件的头部添加如下注解:

    /**
     * 这个注解是给指定包下的类自动添加@Mapper,省的com.xiaozhao.dao下的每个mapper类都得添加一个@Mapper注解了
     *
     * @author xiaozhao
     */
    
    @SpringBootApplication
    @MapperScan("com.xiaozhao.dao")
    public class SpringbootMybatisApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SpringbootMybatisApplication.class, args);
        }
    }
    
    
    

    三、配置MyBaits

    1.使用xml
    1.1 在resources文件夹下新建一个mybatis文件,然后新建一个核心配置文件mybatis-config.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
        <typeAliases>
            <typeAlias alias="Integer" type="java.lang.Integer"/>
            <typeAlias alias="Long" type="java.lang.Long"/>
            <typeAlias alias="HashMap" type="java.util.HashMap"/>
            <typeAlias alias="LinkedHashMap" type="java.util.LinkedHashMap"/>
            <typeAlias alias="ArrayList" type="java.util.ArrayList"/>
            <typeAlias alias="LinkedList" type="java.util.LinkedList"/>
        </typeAliases>
    </configuration>
    

    1.2然后在resources>mybatis 下再次新建一个mapper文件夹, 在这个mapper文件夹下新建一个RoleMapper.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="com.xiaozhao.dao.RoleMapper">
        <resultMap id="BaseResultMap" type="com.xiaozhao.domain.Role">
            <id column="id" property="id" jdbcType="INTEGER"/>
            <result column="name" property="name" jdbcType="VARCHAR"/>
        </resultMap>
    
        <sql id="Base_Column_List">
            id, name
        </sql>
    
        <!--查询全部-->
        <select id="queryAll" resultMap="BaseResultMap">
            SELECT
            <include refid="Base_Column_List"/>
            FROM role
        </select>
    
        <!--查询单个-->
        <select id="selectOne" parameterType="Integer" resultMap="BaseResultMap">
            SELECT
            <include refid="Base_Column_List"/>
            FROM role
            WHERE id=#{id}
        </select>
    
        <!--增加-->
        <insert id="add" parameterType="com.xiaozhao.domain.Role">
            INSERT INTO role(name) VALUES (#{name})
        </insert>
    
        <!--修改-->
        <update id="update" parameterType="com.xiaozhao.domain.Role">
            UPDATE role set name=#{name} WHERE id=#{id}
        </update>
    
        <!--删除-->
        <delete id="delete" parameterType="Integer">
            DELETE  FROM role WHERE id=#{id}
        </delete>
    
    </mapper>
    

    1.3 把配置信息告诉spring

    在application.yml文件中添加入下节点

    #    配置mybatis
    mybatis:
      config-location: classpath:mybatis/mybatis-config.xml
      mapper-locations: classpath:mybatis/mapper/*.xml
      type-aliases-package: com.xiaozhao.domain
    

    把最后测试运行,在浏览器中输入:http://localhost:8080/api/role/list ,得到如下结果:

    image.png

    2、使用注解的形式

    使用注解跟xml的区别主要体现在dao层,就是把sql语句以注解的形式写到代码中。然后修改下application.yml文件中的mybatis配置即可。

    2.1修改后的RoleMapper.java

    package com.xiaozhao.dao;
    
    import com.xiaozhao.domain.Role;
    
    import org.apache.ibatis.annotations.*;
    
    import org.apache.ibatis.type.JdbcType;
    
    import java.util.List;
    
    /**
    
    * @author xiaozhao
    
    * @date 2018/9/29上午10:40
    
    * <p>
    
    * 使用注解的形式
    
    */
    
    /**
    
    * @Mapper 如果没有在SpringbootLearingApplication添加@MapperScan 注解的话,这里都需要一个这样的注解
    
    */
    
    public interface RoleMapper {
    
        /**
    
         * 查询所有的角色
    
         *
    
         * @return
    
         */
    
        @Select("SELECT id, name FROM role")
    
        @Results({
    
                @Result(property = "id", column = "id", jdbcType = JdbcType.INTEGER),
    
                @Result(property = "name", column = "name", jdbcType = JdbcType.VARCHAR)
    
        })
    
        List<Role> queryAll();
    
        /**
    
         * 查询单个
    
         *
    
         * @param id
    
         * @return
    
         */
    
        @Select("SELECT id, name FROM role  WHERE id=#{id}")
    
        @Results({
    
                @Result(property = "id", column = "id", jdbcType = JdbcType.INTEGER),
    
                @Result(property = "name", column = "name", jdbcType = JdbcType.VARCHAR)
    
        })
    
        Role selectOne(Integer id);
    
        /**
    
         * 新增
    
         *
    
         * @param role
    
         * @return
    
         */
    
        @Insert(" INSERT INTO role(name) VALUES (#{name})")
    
        int add(Role role);
    
        /**
    
         * 修改
    
         *
    
         * @param role
    
         * @return
    
         */
    
        @Update(" UPDATE role set name=#{name} WHERE id=#{id}")
    
        int update(Role role);
    
        /**
    
         * 删除
    
         *
    
         * @param id
    
         * @return
    
         */
    
        @Delete("  DELETE  FROM role WHERE id=#{id}")
    
        int delete(Integer id);
    
    }
    

    2.2修改后的application.yml

    spring:
    
      # 数据库连接
    
      datasource:
    
        url: jdbc:mysql://127.0.0.1:3306/student_manage?useUnicode=true&characterEncoding=UTF-8
    
        username: root
    
        password:
    
        driver-class-name: com.mysql.jdbc.Driver
    
    mybatis:
    
      type-aliases-package: com.xiaozhao.domain
    

    打印sql语句

    使用logback来进行打印,可以参考文章:logback

    在resources文件夹下新建一个logback-spring.xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration debug="false">
    
        <!-- 控制台输出 -->
        <!-- 彩色日志 -->
        <!-- 彩色日志依赖的渲染类 -->
        <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
        <conversionRule conversionWord="wex"
                        converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
        <conversionRule conversionWord="wEx"
                        converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
        <!-- 彩色日志格式 -->
        <property name="CONSOLE_LOG_PATTERN"
                  value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
        <!-- Console 输出设置 -->
        <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                <pattern>${CONSOLE_LOG_PATTERN}</pattern>
                <charset>utf8</charset>
            </encoder>
        </appender>
    
    <!--用来设置某一个包或者具体的某一个类的日志打印级别-->
        <!--打印MyBatis的sql语句-->
        <logger name="com.xiaozhao.dao" level="DEBUG"></logger>
    
    
        <!-- 日志输出级别,生产环境下需要移除控制台输出 -->
        <root level="INFO">
            <appender-ref ref="STDOUT"/>
        </root>
    </configuration>
    

    注意其中的包名要是项目中mapper所在的包名,设置为DEBUG级别,然后就可以打印sql了。

    完整代码

    https://github.com/xiaozhaowen/spring-boot-in-action/tree/master/springboot-mybatis

    相关文章

      网友评论

          本文标题:Spring Boot 整合MyBatis

          本文链接:https://www.haomeiwen.com/subject/gggvaftx.html