Mybatis多表插入

很多时候我们会碰到这样一个需求,当前我有(用户)表和(角色)表,他们之间是多对多的关系,所以我们通常会创建一个关联表(用户_角色)表,现在我们有固定的角色,只需要添加用户即可,给用户指定角色,那我们怎么做呢,废话不多说了,下面给出思路:

        表 :user   /   role   /   user_role 

对应JavaBean如下:

用户表:

[java]  view plain  copy
  1. public class User implements Serializable {  
  2.   
  3.     // Fields  
  4.   
  5.     private Integer id;  
  6.     private String login;  
  7.     private String name;  
  8.     private String pass;  
  9.     private String phone;  
  10.     private String email;  
  11.     private Integer isadmin;  
  12.   
  13.        // get...set...  
  14. }  

角色表:

[java]  view plain  copy
  1. public class Role implements Serializable {  
  2.   
  3.     // Fields  
  4.   
  5.     private Integer roleId;  
  6.     private String roleName;  
  7.     private Date createdTime;  
  8.     private Date updateTime;  
  9.   
  10.     //get...set...  
  11. }  

用户_角色关联表(当然,它不创建也可以):

[java]  view plain  copy
  1. public class UserRole implements Serializable {  
  2.   
  3.     // Fields  
  4.   
  5.     private Integer id;  
  6.     private Integer userId;  
  7.     private Integer roleId;  
  8.   
  9.     //get...set...  
  10. }  

//**以下所有操作中,所有JavaBean使用别名(typeAlias)方式,不会的话自行百度

需求,添加用户并为当前用户指定多个角色,主要Sql:

1: 首先插入用户(实现插入用户并且返回插入用户的主键):

[sql]  view plain  copy
  1. <insert id="save" parameterType="User" useGeneratedKeys="true"  
  2.         keyProperty="id">  
  3.         insert into user(login,name,pass,phone,email,isadmin)  
  4.         values(#{login},#{name},#{pass},#{phone},#{email},${isadmin})  
  5. </insert>  
//useGeneratedKeys="true"  设置是否使用JDBC的getGenereatedKeys方法获取主键并赋值到keyProperty设置的主键字段中

//keyProperty="id"  指定JavaBean的主键字段


2:为用户匹配角色:

方式一(适用于除了插入被关联表的ID,还要插入被关联表中的其他信息,例如:角色类型( 当前设计中此字段不存在,仅仅用于举例子)):

[sql]  view plain  copy
  1. <insert id="saveUserOrRole" parameterType="map">  
  2.         insert into user_role(  
  3.         user_id,role_id,role_type  
  4.         )  
  5.         select u.id,r.role_id,r.role_type from user u,role r where  
  6.         u.id = ${userId} and  
  7.         r.role_id in  
  8.         <foreach collection="roleIds" item="rId" open="(" separator=","  
  9.             close=")">  
  10.             #{rId}  
  11.         </foreach>  
  12. </insert>  


方式二(适用于只需要插入被关联表的ID)

[sql]  view plain  copy
  1. insert into user_role(  
  2.         user_id,role_id  
  3.         ) values  
  4.         <foreach collection="roleIds" item="rId" separator=",">  
  5.             (${userId},#{rId})  
  6.         </foreach>  

//注意在执行完第一条插入用户sql后,在外部访问对象User的主键是已经存在的,类似hibernate持久化后对象已经拥有ID信息



这里把测试代码给出(Junit4):

[java]  view plain  copy
  1. @RunWith(SpringJUnit4ClassRunner.class)  
  2. @ContextConfiguration("classpath*:spring-*.xml")  
  3. public class TestSSM {  
  4.     @Resource  
  5.     protected UserMapper userMapper;  
  6.       
  7.       
  8.     @Test  
  9.     public void testInsert() {  
  10.         User user = new User();  
  11.         user.setEmail("yhq1913@sina.com");  
  12.         user.setLogin("ytzl");  
  13.         user.setName("云图智联");  
  14.         //密码加密  
  15.         user.setPass(DigestUtil.hmacSign("ytzl""yuntuzhilian"));  
  16.         user.setPhone("15910721339");  
  17.         user.setIsadmin(1);  
  18.         userMapper.save(user);  
  19.         Map<String, Object> saveParams = new HashMap<>();  
  20.         saveParams.put("userId", user.getId());  
  21.         //这里指定两个角色的ID进行测试  
  22.         saveParams.put("roleIds", Arrays.asList("1""2"));  
  23.         userMapper.saveUserOrRole(saveParams);  
  24.     }  
  25. }  

### 回答1: Spring Boot和MyBatis插入可以通过以下步骤完成: 1. 创建实体类和Mapper接口,分别对应多个。 2. 在Mapper接口中定义插入的方法,使用@Insert注解,并在SQL语句中使用多个的字段。 3. 在Service层中调用Mapper接口的插入方法,传入多个实体类对象。 4. 在Controller层中调用Service层的插入方法,返回插入结果。 示例代码如下: 实体类: ``` public class User { private Long id; private String name; private Integer age; // getter和setter方法省略 } public class Order { private Long id; private Long userId; private String orderNo; // getter和setter方法省略 } ``` Mapper接口: ``` public interface UserMapper { @Insert("INSERT INTO user(name, age) VALUES(#{name}, #{age})") int insertUser(User user); } public interface OrderMapper { @Insert("INSERT INTO order(user_id, order_no) VALUES(#{userId}, #{orderNo})") int insertOrder(Order order); } ``` Service层: ``` @Service public class UserService { @Autowired private UserMapper userMapper; @Autowired private OrderMapper orderMapper; @Transactional public void insertUserAndOrder(User user, Order order) { userMapper.insertUser(user); order.setUserId(user.getId()); orderMapper.insertOrder(order); } } ``` Controller层: ``` @RestController public class UserController { @Autowired private UserService userService; @PostMapping("/user") public String insertUserAndOrder(@RequestBody User user, @RequestBody Order order) { userService.insertUserAndOrder(user, order); return "success"; } } ``` 以上代码仅供参考,具体实现需要根据实际情况进行调整。 ### 回答2: 对于Springboot和Mybatis插入操作,需要掌握以下几个方面。 首先,需要建立好多个之间的关联,例如实体类之间的关联,关联的外键约束等。 其次,在实体类中需要定义好对应关联的各个属性,使得能够正确地进行间的插入操作。例如,在一个订单系统中,订单实体类需要关联用户和商品,在该实体类中应该定义好对应的用户实体类和商品实体类的属性,分别为user和goods。 然后,在Mybatis提供的Mapper文件中,需要使用join语句实现插入。例如,在订单插入用户和商品信息的例子中,我们可以使用insert into order (user_id, goods_id) values (#{user.id}, #{goods.id})语句。 最后,在Springboot中,需要使用相应的注解来实现插入。例如,在Controller层中,可以使用@Transactional注解来标注插入的操作,确保多个之间的插入操作的一致性和完整性。 总之,Springboot和Mybatis插入操作需要掌握好间的关联、实体类中对应关联的各个属性、Mybatis提供的Mapper文件中使用join语句以及Springboot中需要使用相应的注解来实现插入等方面,才能正确、高效地实现插入操作。 ### 回答3: 在SpringBoot中使用MyBatis进行插入可以采用以下步骤: 第一步:配置数据源 在application.yml文件中配置数据源: spring: datasource: url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false&maxReconnects=10&useSSL=false username: root password: root driver-class-name: com.mysql.jdbc.Driver 第二步:配置MyBatis 在application.yml文件中配置MyBatismybatis: mapper-locations: classpath:mapper/*.xml 第三步:创建Mapper接口 创建Mapper接口,并在接口中定义插入方法: public interface OrderUserMapper { void insertOrderAndUser(Order order, User user); } 第四步:编写Mapper.xml文件 在Mapper.xml文件中编写SQL语句: <insert id="insertOrderAndUser" parameterType="map"> <selectKey keyProperty="id" resultType="int" order="BEFORE"> SELECT max(id)+1 from order; </selectKey> insert into order(id, name, price, user_id) values(#{id},#{name},#{price},#{user.id}); insert into user(id, name) values(#{user.id},#{user.name}); </insert> 第五步:调用Mapper接口 在业务逻辑中调用Mapper接口: @Service public class OrderUserService { @Autowired private OrderUserMapper mapper; @Transactional public void insertOrderAndUser(Order order, User user) { mapper.insertOrderAndUser(order, user); } } 以上就是在SpringBoot中使用MyBatis进行插入的步骤,通过配置数据源、配置MyBatis、创建Mapper接口、编写Mapper.xml文件、调用Mapper接口,可以方便地实现插入功能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值