如何用注解的方式實(shí)現(xiàn)Mybatis插入數(shù)據(jù)時返回自增的主鍵Id
用注解實(shí)現(xiàn)Mybatis插入數(shù)據(jù)返回自增的主鍵Id
我們在數(shù)據(jù)庫表設(shè)計的時候,一般都會在表中設(shè)計一個自增的id作為表的主鍵。這個id也會關(guān)聯(lián)到其它表的外鍵。
這就要求往表中插入數(shù)據(jù)時能返回表的自增id,用這個ID去給關(guān)聯(lián)表的字段賦值。下面講一下如何通過注解的方式實(shí)現(xiàn)插入數(shù)據(jù)時返回自增Id。
設(shè)計數(shù)據(jù)庫表
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è)計Java bean對象
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); }
通過以上幾個步驟就可以實(shí)現(xiàn)在插入user到數(shù)據(jù)庫時返回自增ID。數(shù)據(jù)插入成功后,id值被反填到user對象中,調(diào)用getUserId()就可以獲取。
上面的寫法有個地方需要注意一下: 如果insertUser使用了@Param注解,如:void insertUser(@Param(“user”) User user),keyProperty需要指定為 user.userId。
Mybatis注解增(返回自增id) 刪查改以及(一對一,一對多,多對多)
數(shù)據(jù)庫表
目錄結(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> <!-- 注冊自定義類型處理器--> <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接口編寫
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ù)哪個字段去查詢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); }
測試
單表增刪查改
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); }
一對一
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); } } }
一對多
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); } } }
多對多
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); } } }
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
java基礎(chǔ)之 “==”與“equals”區(qū)別詳解
這篇文章主要介紹了java基礎(chǔ)之 “==”與“equals”區(qū)別詳解,需要的朋友可以參考下2020-02-02java識別一篇文章中某單詞出現(xiàn)個數(shù)的方法
這篇文章主要介紹了java識別一篇文章中某單詞出現(xiàn)個數(shù)的方法,涉及java字符解析操作的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-10-10Mybatis中updateBatch實(shí)現(xiàn)批量更新
本文主要介紹了Mybatis中updateBatch實(shí)現(xiàn)批量更新,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03java使用文件流實(shí)現(xiàn)查看下載次數(shù)
這篇文章主要為大家詳細(xì)介紹了java使用文件流實(shí)現(xiàn)查看下載次數(shù),具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-07-07Java實(shí)現(xiàn)克隆的三種方式實(shí)例總結(jié)
這篇文章主要介紹了Java實(shí)現(xiàn)克隆的三種方式,結(jié)合實(shí)例形式總結(jié)分析了java淺復(fù)制、深復(fù)制以及使用serializable實(shí)現(xiàn)深復(fù)制的相關(guān)操作技巧,需要的朋友可以參考下2018-08-08spring-boot中spring-boot-maven-plugin報紅錯誤及解決
這篇文章主要介紹了spring-boot中spring-boot-maven-plugin報紅錯誤及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03Spring創(chuàng)建bean的幾種方式及使用場景
本文主要介紹了Spring創(chuàng)建bean的幾種方式及使用場景,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04一文搞懂SpringMVC中@InitBinder注解的使用
@InitBinder方法可以注冊控制器特定的java.bean.PropertyEditor或Spring Converter和 Formatter組件。本文通過示例為大家詳細(xì)講講@InitBinder注解的使用,需要的可以參考一下2022-06-06