这里以UserMapper为例,首先需要创建对应的实体类User类,我们通过观察可以看出多个类拥有同一些字段,我们可以把这些字段抽取成一个公共基类这样方便我们管理。
package com.zjq.store.entity;
import java.io.Serializable;
import java.util.Date;
public class BaseEntity implements Serializable {
private String createdUser;
private Date createdTime;
private String modifiedUser;
@Override
public String toString() {
return "BaseEntity{" +
"createdUser='" + createdUser + '\'' +
", createdTime=" + createdTime +
", modifiedUser='" + modifiedUser + '\'' +
", modifiedTime=" + modifiedTime +
'}';
}
public String getCreatedUser() {
return createdUser;
}
public void setCreatedUser(String createdUser) {
this.createdUser = createdUser;
}
public Date getCreatedTime() {
return createdTime;
}
public void setCreatedTime(Date createdTime) {
this.createdTime = createdTime;
}
public String getModifiedUser() {
return modifiedUser;
}
public void setModifiedUser(String modifiedUser) {
this.modifiedUser = modifiedUser;
}
public Date getModifiedTime() {
return modifiedTime;
}
public void setModifiedTime(Date modifiedTime) {
this.modifiedTime = modifiedTime;
}
private Date modifiedTime;
}
此时我们再去创建实体类
package com.zjq.store.entity;
import java.io.Serializable;
public class User extends BaseEntity implements Serializable {
private Integer uid ;
private String username;
private String password;
private String salt ;
private String phone;
private String email;
private Integer gender ;
private String avatar ;
private Integer isDelete ;
@Override
public String toString() {
return "User{" +
"uid=" + uid +
", username='" + username + '\'' +
", password='" + password + '\'' +
", salt='" + salt + '\'' +
", phone='" + phone + '\'' +
", email='" + email + '\'' +
", gender=" + gender +
", avatar='" + avatar + '\'' +
", isDelete=" + isDelete +
'}';
}
public User(String username, String password, String salt, String phone, String email, Integer gender, String avatar, Integer isDelete) {
this.username = username;
this.password = password;
this.salt = salt;
this.phone = phone;
this.email = email;
this.gender = gender;
this.avatar = avatar;
this.isDelete = isDelete;
}
public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getSalt() {
return salt;
}
public void setSalt(String salt) {
this.salt = salt;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Integer getGender() {
return gender;
}
public void setGender(Integer gender) {
this.gender = gender;
}
public String getAvatar() {
return avatar;
}
public void setAvatar(String avatar) {
this.avatar = avatar;
}
public Integer getIsDelete() {
return isDelete;
}
public void setIsDelete(Integer isDelete) {
this.isDelete = isDelete;
}
}
创建好实体类之后去创建mapper接口,为了springboot能扫qidongl描到我们写的接口,我们可以选择给每个接口头上加一个@Mapper注解或者在启动类上加一个自动扫描包的注解,更加建议使用后一种。
package com.zjq.store;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.zjq.store.mapper")
public class StoreApplication {
public static void main(String[] args) {
SpringApplication.run(StoreApplication.class, args);
}
}
然后我们就可以编写查询语句了。在resource目录下建立一个mapper文件夹专门用于存放mapper.xml文件。为了这些文件能被扫描到,首先他的名字必须和接口名称一致,其次需要在application.yaml中配置xml文件的路径
mybatis:
mapper-locations: classpath:mapper/*.xml
这里以UserMapper为例,先创建一个空的mapper.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">
<!--通过namespace来绑定一个Mapper接口-->
<mapper namespace="com.zjq.store.mapper.UserMapper" >
</mapper>
在里面编写查询语句,首先是insert语句,这里可以注意一下的是当我们的主键是自增的时候,mybatis并不会帮我们自动插入主键,这时候我们需要开启useGeneratedKeys功能并用keyProperty绑定需要自增的主键。
<!--查询语句-->
<insert id="insert" parameterType="com.zjq.store.entity.User" useGeneratedKeys="true" keyProperty="uid" >
insert into store.t_user
(username ,
password ,
salt ,
phone ,
email ,
gender,
avatar ,
is_delete ,
created_user ,
created_time ,
modified_user,
modified_time)
values (
#{username} ,
#{password },
#{salt} ,
#{phone} ,
#{email },
#{gender},
#{avatar },
#{isDelete} ,
#{createdUser} ,
#{createdTime },
#{modifiedUser},
#{modifiedTime}
)
</insert>
查询语句:需要注意实体类名称与表字段名称不同时(因为命名规则不同,实体类使用驼峰命名)需要创建一个resultMap去对应字段名称。
UserMapper.xml:
<resultMap id="userMap" type="com.zjq.store.entity.User">
<!--id用于绑定 resultMap="id"-->
<!--type用于指定实体类-->
<id column="uid" property="uid"></id>
<!--主键字段是必须写的-->
<!--其余与表字段一致的就可以不写-->
<result column="created_user" property="createdUser"></result>
<!--column是表字段名 property是绑定实体类中的属性-->
<result column="created_time" property="createdTime"></result>
<result column="modified_user" property="modifiedUser"></result>
</resultMap>
<select id="findByUsername" resultMap="userMap">
select * from store.t_user where username=#{username}
</select>
也可以使用application.yaml开启自动驼峰命名规则映射
mybatis:
configuration:
map-underscore-to-camel-case: true
或者在application.yaml中绑定一个配置文件在配置文件中开启驼峰命名(不建议这样做,尽量把所有的配置都整合在application.yaml中)
mybatis:
configLocation: classpath:/mybatis-config.xml
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
单元测试!
为了进行规范的单元测试我们需要建立起一个规范的包结构。和src下的目录结构一致。
package com.zjq.store.mapper;
import com.zjq.store.entity.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@SpringBootTest
@RunWith(SpringRunner.class)
//自己写的测试类必须加这两个注解
public class UserMapperTests {
@Autowired
UserMapper userMapper;
@Test
public void insert() {
Integer insert = userMapper.insert(new User("zjq", "12234", "1", "134234342", "234234@qq.com", 1, "ggfdsddfg", 0));
System.out.println(insert);
}
}
测试结果成功!