如何用注解的方式實(shí)現(xiàn)Mybatis插入數(shù)據(jù)時(shí)返回自增的主鍵Id
用注解實(shí)現(xiàn)Mybatis插入數(shù)據(jù)返回自增的主鍵Id
我們?cè)跀?shù)據(jù)庫(kù)表設(shè)計(jì)的時(shí)候,一般都會(huì)在表中設(shè)計(jì)一個(gè)自增的id作為表的主鍵。這個(gè)id也會(huì)關(guān)聯(lián)到其它表的外鍵。
這就要求往表中插入數(shù)據(jù)時(shí)能返回表的自增id,用這個(gè)ID去給關(guān)聯(lián)表的字段賦值。下面講一下如何通過(guò)注解的方式實(shí)現(xiàn)插入數(shù)據(jù)時(shí)返回自增Id。
設(shè)計(jì)數(shù)據(jù)庫(kù)表
CREATE TABLE `tbl_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL DEFAULT '', `age` int(4) NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
設(shè)計(jì)Java bean對(duì)象
public class User
{
private int userId = -1;
private String name = "";
private int age = -1;
@Override
public String toString()
{
return "name:" + name + "|age:" + age;
}
public int getUserId()
{
return userId;
}
public void setUserId(int userId)
{
this.userId = userId;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
}
添加mapper接口
@Mapper
public interface UserMapper
{
@Insert("insert into tbl_user (name, age) values (#{name}, #{age})")
@Options(useGeneratedKeys=true, keyProperty="userId", keyColumn="id")
void insertUser(User user);
}
通過(guò)以上幾個(gè)步驟就可以實(shí)現(xiàn)在插入user到數(shù)據(jù)庫(kù)時(shí)返回自增ID。數(shù)據(jù)插入成功后,id值被反填到user對(duì)象中,調(diào)用getUserId()就可以獲取。
上面的寫(xiě)法有個(gè)地方需要注意一下: 如果insertUser使用了@Param注解,如:void insertUser(@Param(“user”) User user),keyProperty需要指定為 user.userId。
Mybatis注解增(返回自增id) 刪查改以及(一對(duì)一,一對(duì)多,多對(duì)多)
數(shù)據(jù)庫(kù)表




目錄結(jié)構(gòu)

導(dǎo)入坐標(biāo)(包)
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.32</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
</dependencies>
配置文件
jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/springboot jdbc.username=root jdbc.password=111111
sqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="jdbc.properties"/>
<!-- 別名-->
<typeAliases>
<package name="com.zyw.domain"/>
</typeAliases>
<!-- 注冊(cè)自定義類型處理器-->
<typeHandlers>
<typeHandler handler="com.zyw.typeHandler.TypeHandler"/>
</typeHandlers>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<package name="com.zyw.mapper"/>
</mappers>
</configuration>
log4j.properties
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=c:/mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### set log levels - for more verbose logging change 'info' to 'debug' ###
log4j.rootLogger=debug, stdout實(shí)體類
Order
package com.zyw.domain;
public class Order {
private Integer id;
private String ordername;
private Integer ordernum;
private User user;
@Override
public String toString() {
return "Order{" +
"id=" + id +
", ordername='" + ordername + '\'' +
", ordernum=" + ordernum +
", user=" + user +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getOrdername() {
return ordername;
}
public void setOrdername(String ordername) {
this.ordername = ordername;
}
public Integer getOrdernum() {
return ordernum;
}
public void setOrdernum(Integer ordernum) {
this.ordernum = ordernum;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
Role
package com.zyw.domain;
import java.util.List;
public class Role {
private Integer id;
private String roleName;
private String roleDesc;
private List<User> userList;
public void setUser(List<User> userList) {
this.userList = userList;
}
public List<User> getUser() {
return userList;
}
@Override
public String toString() {
return "Role{" +
"id=" + id +
", roleName='" + roleName + '\'' +
", roleDesc='" + roleDesc + '\'' +
", user=" + userList +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
public String getRoleDesc() {
return roleDesc;
}
public void setRoleDesc(String roleDesc) {
this.roleDesc = roleDesc;
}
}
User
package com.zyw.domain;
import java.util.Date;
import java.util.List;
public class User {
private Integer id;
private String username;
private String email;
private String password;
private Long phoneNum;
private Date birthday;
private List<Order> orderList;
public List<Order> getOrderList() {
return orderList;
}
public void setOrderList(List<Order> orderList) {
this.orderList = orderList;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public void setPhoneNum(Long phoneNum) {
this.phoneNum = phoneNum;
}
public Long getPhoneNum() {
return phoneNum;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", email='" + email + '\'' +
", password='" + password + '\'' +
", phoneNum=" + phoneNum +
", birthday=" + birthday +
", orderList=" + orderList +
'}';
}
}
mapper接口編寫(xiě)
OrderMapper
public interface OrderMapper {
@Select("select * from orders ")
@Results({
@Result(column = "id",property = "id"),
@Result(column = "ordername",property = "ordername"),
@Result(column = "ordernum",property = "ordernum"),
@Result(
property = "user",
column = "uid",
javaType = User.class,
one = @One(select = "com.zyw.mapper.UserMapper.findById")
)
})
public List<Order> findAll();
@Select("select * from orders where uid=#{uid}")
public List<Order> findByUid(Integer uid);
}
RoleMapper
public interface RoleMapper {
@Select("select * from sys_role")
@Results({
@Result(column = "id",property = "id"),
@Result(column = "roleName",property = "roleName"),
@Result(column = "roleDesc",property = "roleDesc"),
@Result(
property = "userList",
column = "id",
javaType = List.class,
many = @Many(select = "com.zyw.mapper.UserMapper.findUserAndRoleById")
)
})
public List<Role> findRoleAndUser();
}
UserMapper (注意自增id是返回到實(shí)體類)
public interface UserMapper {
@Select("select * from sys_user")
public List<User> findAll();
@Select("select * from sys_user where id=#{id}")
public User findById(Integer id);
@Insert("insert into sys_user values(#{id},#{username},#{email},#{password},#{phoneNum},#{birthday})")
@Options(useGeneratedKeys=true, keyProperty="id", keyColumn="id")
public void insertUser(User user);
@Update("update sys_user set password=#{password} where id=#{id}")
public void updateUser(User user);
@Delete("delete from sys_user where id=#{id}")
public void deleteUser(Integer id);
@Select("select * from sys_user")
@Results({
@Result(column = "id",property = "id"),
@Result(column = "username",property = "username"),
@Result(column = "password",property = "password"),
@Result(column = "email",property = "email"),
@Result(column = "phoneNum",property = "phoneNum"),
@Result(column = "birthday",property = "birthday"),
@Result(
property = "orderList", //封裝的屬性名稱
column = "id", //根據(jù)哪個(gè)字段去查詢order表中的數(shù)據(jù)
javaType = List.class, //返回類型
many = @Many(select = "com.zyw.mapper.OrderMapper.findByUid")
)
})
public List<User> findUserAndOrder();
@Select("select * from sys_user u,sys_user_role ur where u.id=ur.userId and ur.roleId=#{id}")
public List<User> findUserAndRoleById(Integer id);
}
測(cè)試
單表增刪查改
AnnoTest
public class AnnoTest {
private UserMapper mapper ;
@Before
public void before() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = build.openSession(true);
mapper=sqlSession.getMapper(UserMapper.class);
}
@Test
public void testFindAll(){
List<User> userList = mapper.findAll();
for (User user : userList) {
System.out.println(user);
}
}
@Test
public void testFindById(){
User byId = mapper.findById(1);
System.out.println(byId);
}
@Test
public void testInsertUser(){
User user=new User();
user.setUsername("小張");
user.setPassword("951753");
user.setPhoneNum(13449484984L);
user.setEmail("951@qq.com");
user.setBirthday(new Date());
mapper.insertUser(user);
System.out.println(user.getId());
}
@Test
public void testUpdateUser(){
User user=new User();
user.setId(1);
user.setPassword("123456");
mapper.updateUser(user);
}
@Test
public void testDeleteUser(){
mapper.deleteUser(9);
}
一對(duì)一
AnnoTestOneToOne
public class AnnoTestOneToOne {
private OrderMapper mapper ;
@Before
public void before() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = build.openSession(true);
mapper=sqlSession.getMapper(OrderMapper.class);
}
@Test
public void testDemo(){
List<Order> orderList = mapper.findAll();
for (Order order : orderList) {
System.out.println(order);
}
}
}
一對(duì)多
AnnoTestOneToMany
public class AnnoTestOneToMany {
private UserMapper mapper ;
@Before
public void before() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = build.openSession(true);
mapper=sqlSession.getMapper(UserMapper.class);
}
@Test
public void testDemo(){
List<User> userList = mapper.findUserAndOrder();
for (User user : userList) {
System.out.println(user);
}
}
}
多對(duì)多
AnnoTestManyToMany
public class AnnoTestManyToMany {
private RoleMapper mapper ;
@Before
public void before() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = build.openSession(true);
mapper=sqlSession.getMapper(RoleMapper.class);
}
@Test
public void testDemo(){
List<Role> roleList = mapper.findRoleAndUser();
for (Role role : roleList) {
System.out.println(role);
}
}
}
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java基礎(chǔ)之 “==”與“equals”區(qū)別詳解
這篇文章主要介紹了java基礎(chǔ)之 “==”與“equals”區(qū)別詳解,需要的朋友可以參考下2020-02-02
java識(shí)別一篇文章中某單詞出現(xiàn)個(gè)數(shù)的方法
這篇文章主要介紹了java識(shí)別一篇文章中某單詞出現(xiàn)個(gè)數(shù)的方法,涉及java字符解析操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10
Mybatis中updateBatch實(shí)現(xiàn)批量更新
本文主要介紹了Mybatis中updateBatch實(shí)現(xiàn)批量更新,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
java使用文件流實(shí)現(xiàn)查看下載次數(shù)
這篇文章主要為大家詳細(xì)介紹了java使用文件流實(shí)現(xiàn)查看下載次數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07
Java實(shí)現(xiàn)克隆的三種方式實(shí)例總結(jié)
這篇文章主要介紹了Java實(shí)現(xiàn)克隆的三種方式,結(jié)合實(shí)例形式總結(jié)分析了java淺復(fù)制、深復(fù)制以及使用serializable實(shí)現(xiàn)深復(fù)制的相關(guān)操作技巧,需要的朋友可以參考下2018-08-08
spring-boot中spring-boot-maven-plugin報(bào)紅錯(cuò)誤及解決
這篇文章主要介紹了spring-boot中spring-boot-maven-plugin報(bào)紅錯(cuò)誤及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
Spring創(chuàng)建bean的幾種方式及使用場(chǎng)景
本文主要介紹了Spring創(chuàng)建bean的幾種方式及使用場(chǎng)景,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
一文搞懂SpringMVC中@InitBinder注解的使用
@InitBinder方法可以注冊(cè)控制器特定的java.bean.PropertyEditor或Spring Converter和 Formatter組件。本文通過(guò)示例為大家詳細(xì)講講@InitBinder注解的使用,需要的可以參考一下2022-06-06

