MyBatis的添加(insert)操作
一、MyBatis添加操作的完整流程
1. 编写Mapper接口方法
- 定义接口方法,用于添加数据。
- 方法参数通常是一个实体类对象(如Brand),返回值一般为void或int(表示影响的行数)。
示例:
void add(Brand brand);
- 这里的Brand是一个Java实体类,包含了品牌的所有属性(如brandName、companyName等)。
- 方法名add和SQL映射文件中的<insert id="add">要一致。
2. 编写SQL语句(SQL映射文件)
- 在对应的Mapper XML文件中,写<insert>标签,指定SQL语句。
- 用#{属性名}来引用参数对象的属性,MyBatis会自动把Brand对象的属性值填进去。
示例:
<insert id="add">insert into tb_brand (brand_name, company_name, ordered, description, status)values (#{brandName}, #{companyName}, #{ordered}, #{description}, #{status});
</insert>
- tb_brand是数据库表名。
- 括号里的字段名要和数据库表结构一致。
- #{brandName}等会自动取Brand对象的对应属性值。
3. 执行方法,测试功能
- 在Service或测试类中调用add方法,传入一个Brand对象即可完成添加。
示例:
Brand brand = new Brand();
brand.setBrandName("华为");
brand.setCompanyName("华为技术有限公司");
brand.setOrdered(1);
brand.setDescription("中国知名品牌");
brand.setStatus(1);
brandMapper.add(brand);
4. MyBatis事务管理
- MyBatis默认开启手动事务,即你执行完增删改操作后,必须手动提交事务,否则数据不会真正写入数据库。
- 通过sqlSession.commit()提交事务。
- 如果用openSession(true),则开启自动提交事务,增删改操作后会自动提交。
示例:
// 手动提交事务
SqlSession sqlSession = sqlSessionFactory.openSession();
BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
mapper.add(brand);
sqlSession.commit(); // 必须手动提交// 自动提交事务
SqlSession sqlSession = sqlSessionFactory.openSession(true);
BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
mapper.add(brand); // 自动提交,无需手动commit
二、添加过程中出现的ID 问题,如何获取ID
1. 关键属性说明
- useGeneratedKeys="true"
启用数据库的自增主键(auto_increment)功能,让MyBatis在插入数据后自动获取生成的主键值。
- keyProperty="id"
指定Java实体类中用来接收主键值的属性名。比如你的Brand类有private Integer id;,插入后MyBatis会自动把生成的主键赋值给brand.id。
2. 工作原理
- 当你执行add(brand)方法插入数据时,MyBatis会自动在数据库插入一条记录。
- 数据库生成自增主键(如id=1001)。
- MyBatis会自动把这个主键值赋给你传入的brand对象的id属性。
- 这样你在Java代码里就能直接拿到新插入数据的主键id了
3. 代码示例
BrandMapper.xml
<insert id="add" useGeneratedKeys="true" keyProperty="id">insert into tb_brand (brand_name, company_name, ordered, description, status)values (#{brandName}, #{companyName}, #{ordered}, #{description}, #{status});
</insert>
public class Brand {private Integer id; // 必须有getter/setterprivate String brandName;// ...其他属性
}
调用示例
Brand brand = new Brand();
brand.setBrandName("华为");
// ...设置其他属性
brandMapper.add(brand);
// 插入后,brand.getId() 就是数据库生成的主键id
System.out.println("新插入的id为:" + brand.getId());
4. 适用场景
- 适用于主键自增(如MySQL的auto_increment)。
- 常用于需要插入后马上用到主键id的场景(如插入主表后插入子表)。
5. 小结口诀
- useGeneratedKeys="true":让数据库自动生成主键。
- keyProperty="id":把主键值赋给Java对象的id属性。
- 插入后直接用对象.getId()获取新id。