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>
三、数据库配置跟上一篇文章的一样
四、使用注解的方式实现
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包
测试结果:
五、使用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文件的配置格式,
导致这里配置了,一直报错!!!!一直访问不了!!!啊啊啊啊啊。
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>
将原先注解部分注释掉
启动项目,重新请求:
另外说明一下:
如果出现这种情况的话,是因为idea2017年版的一个小bug并不影响项目的正常运行。
网上推荐了几个解决办法:
第二个: