Mybatis与Jpa
当下市场上Mybatis仍是主流,而Jpa是未来的趋势,二者的区别主要在于Mybatis可以自己编写SQL,对于性能的优化等会更加方便,更加的底层。而Jpa则是贯彻了“约定大于配置”的理念,对于方法名有严格的要求,可以非常方便快捷的执行SQL。
Mybatis注解的使用
我们若是要通过Mybatis执行SQL就需要按照它的规范来,首先定义实体类,它将映射数据库中的实体,以Category为例来讲讲其用法:
import org.springframework.stereotype.Component;
import java.util.Date;
/**
* po(persistent object) 持久层对象
* pojo(plian ordinary java object) 普通的java对象
*/
public class Category {
private Integer id;
private Integer parentId;
private String name;
private Integer status;
private Integer sortOrder;
private Date createTime;
private Date updateTime;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getParentId() {
return parentId;
}
public void setParentId(Integer parentId) {
this.parentId = parentId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public Integer getSortOrder() {
return sortOrder;
}
public void setSortOrder(Integer sortOrder) {
this.sortOrder = sortOrder;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Date getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
@Override
public String toString() {
return "Category{" +
"id=" + id +
", parentId=" + parentId +
", name='" + name + '\'' +
", status=" + status +
", sortOrder=" + sortOrder +
", createTime=" + createTime +
", updateTime=" + updateTime +
'}';
}
}
该实例对应于数据库中的
之中。若是要实现通过Id来查询的功能,具体代码如下;
package com.imooc.mall.dao;
import com.imooc.mall.pojo.Category;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Component;
@Mapper
public interface CategoryMapper {
@Select("select * from mall_category where id = #{id}")
Category findById(@Param("id")Integer id);
}
这段代码的解读:
@Mapper就是Mabatis的注解,其主要功能有三个:
- 表明将该dao交给spring管理
- 可以不用再去编写xml文件了
- 可以根据mapper自动生成一个注解类;
注意
上述Category和mall_Category的字段并不对应,所以我们得出的结果中parentId和createTime以及updateTime都为null,这时候只要在yml配置中加上
就行了,问题就完美解决了;
用@MapperScan扫描代替@Mapper
上文中已经说明了用@Mapper的功能,但是如果每个dao下的接口都加一个@Mapper太麻烦了,这时候可以在启动类中加一个注解@MapperScan(basePackages = “com.xx.xx.xx”)来代替,就自动实现了扫描的功能。
Mybatis的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.imooc.mall.dao.CategoryMapper">
<select id="queryById" resultType="com.imooc.mall.pojo.Category">
select * from mall_category where id = #{id}
</select>
</mapper>
将在与xml文件同名的mapper接口中id即为接口名,resultType为返回值,而select标签中指定的就是要执行的sql;注意,需要在mybatis的配置中指定映射的路径,否则会报错,配置如下:
mybatis:
configuration:
map-underscore-to-camel-case: true
mapper-locations: classpath:mapper/*.xml
mapper-locations指定的classpath就是路径,未来的话注解开发应该会成为趋势,但目前许多公司的主流就是用xml文件,所以还是要会的。
Mybatis三剑客
Mybatis三剑客是mybatis开发的时候非常有用的
generator
generator主要的作用就是通过配置来生成与数据库对应的实体类以及dao接口等,generator的使用方式是先导入插件
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</version>
</plugin>
然后就可以使用了,但是千万要注意插件的版本,因为不同的版本会有不同的用法。
然而光这样运行还是会报错:
执行命令:mvn mybatis-generator:generate
报的错误:configfile /Users/maoyizheng/mallProject/mall/src/main/resources/generatorConfig.xml does not exist 即是缺少配置文件generatorConfig.xml ,这时候就在resources中引入该文件即可。
具体配置看文档:点击这里
当配置完成之后在pom文件中加入以下代码可以在执行相同文件时去覆盖原先的文件:
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</version>
<configuration>
<overwrite>true</overwrite>
</configuration>
</plugin>
MyBatis-plugin的下载
只要在IDEA中下载插件就行了,下完重启就可使用,直接可以通过接口找到对应的xml方法了。
mybatis-PageHelper
用于分页。