Springboot能够与JPA(使用Hibernate实现)进行很好的对接之外,其与目前企业开发中主流的ORM(Object Relational Mapping)框架Mybatis也可以很好的进行集成,但需要注意,要明确指定Mybatis的版本。Hibernate和Mybatis的优缺点就不详细展开,Hibernate框架封装的更好,开发时,相对Mybatis简单,但是效率没有M的高,另外M也更好的使用需求的变化,想必也是因为这两点,目前80%左右的企业在用M的原因。下面就与SpringBoot的集成进行展示:

首先最重要的是在POM中增加依赖:

<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>1.3.2</version>
		</dependency>

然后就是增加仓储层的实现,有两种方式,一种是通过接口+XML的形式,一种通过接口+注解的形式,此处使用注解的形式:

@Repository
@Mapper
public interface UserDao {
	
	//注意,注解中有一个大括号,在大括号中填入相应的sql语句
	@Insert({"insert into user(name, password) values (#{name}, #{password})"})
	int addUser(User user);
	
	@Select({"select * from user order by id desc"})
	List<User> getAllUsers();
	
	@Select({"select * from user u where u.name=#{name}"})
	User getUserByName(String name);
	
	@Select({"select * from user u where u.name=#{name} and u.password=#{password}"})
	User getUserByNameAndPassword(String name);
	
	@Update({"update user u set u.name=#{name}, u.password=#{password} where u.id=#{id}"})
	void updateUser(User user);
	
	@Delete({"delete from user u where u.id=#{id}"})
	void deleteUser(int id);
}

注意看,mybatis全部使用的原生SQL,而hibernate一般会用HQL的方式进行面向对象的编程,使用原声SQL的缺点就是依赖于特定的数据库,性能优化和问题排查相对简单一些。另外需要在接口处增加@Mapper的注解,告诉Mybatis框架此类是仓储类,需要进行解析实现;注解中编写SQL时,一定要注意有{}和#{},不要弄反。如果实体类的属性和数据库属性不一致,可以在实体类中进行@Column注解的指定,可以在@Select注解下方再加上@Results注解:

@Results({
     @Result(column = "name",property = "userName")
})

仓储层定义后,则可以直接将其注入到Services层进行使用,不再进行赘述。

而如果想用接口+XML的形式,接口依然要增加@Mapper的注解,另外需要在resouce下创建mybatis.xml和对应接口的map*.xml文件,在文件中进行接口方法的sql编写,最后,需要在springboot的application.properties中增加xml文件的指定:

mybatis.config-locations=classpath:mybatis/config.xml
mybatis.mapper-locations=classpath:mybatis/mapping/*.xml

详细代码,点击github链接:查看源码

在使用Mybatis时,由于框架作为一款半自动化的持久层框架,其SQL语句都要我们自己手动编写,这个时候当然需要防止SQL注入,SQL注入相比大家都很清楚,是一个很常见,也很严重的数据库侵入技术,因此大家需要重视起来,可以查看相关的内容进行学习。