Spring Boot入门教程(五)---Spring Boot集成Mybatis

时间:2021-07-11 05:48:44
 
  MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。这是官网的介绍。传统的ORM框架Hibernate是以往做SSH项目中使用得最多的,但是随着业务需求不断的复杂化,Hibernate显得有些力不从心。Hibernate的底层封装了许多可以直接拿来使用的接口,早期开发大大的节约了时间,很方便。但是面对多表查询,复杂SQL的组装就显得有些不方便。 
MyBatis 是使用动态代理的方式,通过映射,同时需要开发人员进行sql的编写与维护,这样来说, sql是可控的。
先准备好数据,以下是参考:
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `phone` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

-- ----------------------------
-- Records of t_user
-- ----------------------------
INSERT INTO `t_user` VALUES ('1', '昌江', '13658096301');
INSERT INTO `t_user` VALUES ('2', '张淡泊', '13658421036');
INSERT INTO `t_user` VALUES ('3', '黄明', '13658421037');
INSERT INTO `t_user` VALUES ('4', '张敏', '13658421038');
INSERT INTO `t_user` VALUES ('5', '李天', '13658421039');
INSERT INTO `t_user` VALUES ('6', '张凡可', '13658421011');
一、环境
  • IDE : IntelliJ IDEA 2017.1.4 x64
  • JDK : 1.8
  • SpringBoot :2.0.2.RELEASE
  • mysql5.0+
二、引入相关依赖
<!-- Spring-Mybatis -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
注意如果没加入MySql依赖的,加入MySql依赖
<!-- MySQL连接 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>


三、数据库配置跟上一篇文章的一样
Spring Boot入门教程(五)---Spring Boot集成Mybatis

四、使用注解的方式实现
4.1在application.yml文件中加入:
mybatis: type-aliases-package: com.pdcourse.bean
4.2、UserMapper
以下为各层代码:
public interface UserMapper {
    //根据id获取用户信息
    @Select("select * from t_user where id=#{id}")
    public User getUserInfo(Integer id);

    //获取用户信息列表
    @Select("select * from t_user")
    public List<User> getUserList();

    //新增用户信息
    @Insert("insert into t_user(user_name,phone) values(#{userName},#{phone})")
    public int addUser(User user);

    //更新用户信息
    @Update("update t_user set user_name = #{user.userName} , phone = #{user.phone} WHERE id = #{id}")
    public int updateUser(Integer id, User user);

    //删除用户信息
    @Delete("delete from t_user where id=#{id}")
    public int deleteUser(Integer id);

}
4.3、service层改造
@Override
public User getUserInfo(Integer id) {
    /*List<User> userList = jdbcTemplate.query("select * from t_user where id = ?", new Object[]{id}, new BeanPropertyRowMapper(User.class));
    if (userList != null && userList.size() > 0) {
        return userList.get(0);
    } else {
        return null;
    }*/
    return userMapper.getUserInfo(id);
}

@Override
public List<User> getUserList() {
   /* List<User> list = jdbcTemplate.query("select * from t_user", new Object[]{}, new BeanPropertyRowMapper(User.class));
    if (list != null && list.size() > 0) {
        return list;
    } else {
        return null;
    }*/
    return userMapper.getUserList();
}

@Override
public int addUser(User user) {
    /*return jdbcTemplate.update("insert into t_user(user_name, phone) values(?, ?)",
            user.getUserName(), user.getPhone());*/
    return userMapper.addUser(user);
}

@Override
public int updateUser(Integer id, User user) {
    return userMapper.updateUser(id,user);
    /*return jdbcTemplate.update("UPDATE t_user SET user_name = ? , phone = ? WHERE id=?",
            user.getUserName(), user.getPhone(), id);*/

}

@Override
public int deleteUser(Integer id) {
    return userMapper.deleteUser(id);
   // return jdbcTemplate.update("DELETE from t_user where id = ? ", id);
}




在启动类中加入扫描mapper包
Spring Boot入门教程(五)---Spring Boot集成Mybatis

测试结果:
Spring Boot入门教程(五)---Spring Boot集成Mybatis
五、使用xml的方式实现
在application.yml文件中加入一下配置:
mybatis:
mapper-locations: classpath*:mybatis/mapper/*.xml
type-aliases-package: com.pdcourse.bean
这里特别,特别,特别强调!!!
mybatis:
mapper-locations: classpath*:mybatis/mapper/*.xml
type-aliases-package: com.pdcourse.bean
这个配置必须定格配置,不然坑死自己!!!一开始我就是不知道yml文件的配置格式,
导致这里配置了,一直报错!!!!一直访问不了!!!啊啊啊啊啊。
Spring Boot入门教程(五)---Spring Boot集成Mybatis
userMapper.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.pdcourse.mapper.UserMapper">
    <resultMap id="BaseResultMap" type="com.pdcourse.bean.User">
        <id column="id" property="id" jdbcType="INTEGER"/>
        <result column="user_name" property="userName" jdbcType="VARCHAR"/>
        <result column="phone" property="phone" jdbcType="VARCHAR"/>
    </resultMap>
    <sql id="Base_Column_List">
        id, user_name,phone
    </sql>
    <select id="getUserList" resultMap="BaseResultMap">
        SELECT
        <include refid="Base_Column_List"/>
        FROM t_user
    </select>
    <select id="getUserInfo" parameterType="java.lang.Integer" resultMap="BaseResultMap">
        SELECT
        <include refid="Base_Column_List"/>
        FROM t_user
        WHERE id = #{id}
    </select>
    <insert id="addUser" parameterType="com.pdcourse.bean.User">
        INSERT INTO
        t_user
        (user_name,phone)
        VALUES
        (#{userName}, #{phone})
    </insert>
    <update id="updateUser" parameterType="java.util.Map">
        UPDATE
        t_user
        SET
        user_name = #{user.userName},phone = #{user.phone}
        WHERE
        id = #{id}
    </update>

    <delete id="deleteUser" parameterType="java.lang.Integer">
        DELETE FROM
        t_user
        WHERE
        id = #{id}
    </delete>
</mapper>
将原先注解部分注释掉
Spring Boot入门教程(五)---Spring Boot集成Mybatis
启动项目,重新请求:
Spring Boot入门教程(五)---Spring Boot集成Mybatis

Spring Boot入门教程(五)---Spring Boot集成Mybatis
另外说明一下:
Spring Boot入门教程(五)---Spring Boot集成Mybatis
如果出现这种情况的话,是因为idea2017年版的一个小bug并不影响项目的正常运行。
网上推荐了几个解决办法:
Spring Boot入门教程(五)---Spring Boot集成Mybatis
第二个:
Spring Boot入门教程(五)---Spring Boot集成Mybatis