1. 主键回调
插入数据时 如果数据库设置了自增长的话 那么无需设置主键会自动由数据库生成 我们插入的时候可以进行配置 使得插入的时候将插入成功生成的主键自动设置到实体类中
例子
实体类User:
package com.hqq.entity;
import java.io.Serializable;
/**
* User
* Created by heqianqian on 2017/4/27.
*/
public class User implements Serializable{
private static final long serialVersionUID = 6464657673344930397L;
private Integer id;
private String name;
private Integer age;
public User() {
}
public User(String name, Integer age) {
this.name = name;
this.age = age;
}
public User(Integer id, String name, Integer age) {
this.id = id;
this.name = name;
this.age = age;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
数据库表users
这里数据库MySQL 主键设置了自增长
再配置Mapper.xml文件
<!--增加一个用户-->
<insert id="addUser" parameterType="user"
keyProperty="id" useGeneratedKeys="true">
/*keyProperty配置主键对应实体类的属性 useGeneratedKeys是否是自增长*/
insert into users(name,age) values (#{name},#{age});
</insert>
这里只需要配置keyProperty为主键对应实体类的属性名称 useGeneratedKeys设置为true
这样插入之后就会将主键回调到实体类中
@Test
public void testInsert() throws Exception {
String statement = "com.hqq.entity.User.insertUser";
User user = new User("hqq", 22);
int insert = sqlSession.insert(statement, user);
LOGGER.info("Insert:{}",insert);
LOGGER.info("User: {}",user.toString());
}
输出结果:
2017-08-16 14:43:03.941 [main] INFO TestCRUDByXmlMapper - Insert:1
2017-08-16 14:43:04.331 [main] INFO TestCRUDByXmlMapper - User: User{id=12, name='hqq', age=22}
2. 自定义主键
有时候我们不需要使用数据库的自增长 而是自定义主键
例如:当表中无数据时 插入时ID设置为1 当存在数据时 插入的ID为当前表中最大ID+2
修改Mapper.xml文件
<insert id="insertUser" parameterType="user">
<selectKey keyProperty="id" resultType="int" order="BEFORE">
select if(max(id) is null,1,max(id)+2) as newId from users
</selectKey>
insert into users(id,name,age) values (#{id},#{name},#{age});
</insert>
测试
@Test
public void testInsert() throws Exception {
String statement = "com.hqq.entity.User.insertUser";
User user = new User("Jack", 22);
int insert = sqlSession.insert(statement, user);
LOGGER.info("Insert:{}",insert);
LOGGER.info("User: {}",user.toString());
insert = sqlSession.insert(statement, new User("Tom",10));
LOGGER.info("Insert:{}",insert);
LOGGER.info("User: {}",user.toString());
}
测试结果
2017-08-16 15:09:52.838 [main] INFO TestCRUDByXmlMapper - Insert:1
2017-08-16 15:09:52.841 [main] INFO TestCRUDByXmlMapper - User: User{id=23, name='Jack', age=22}
2017-08-16 15:09:52.878 [main] INFO TestCRUDByXmlMapper - Insert:1
2017-08-16 15:09:52.879 [main] INFO TestCRUDByXmlMapper - User: User{id=25, name='Tom', age=10}