MyBatis插入操作:生成主键

1.如果使用的数据库支持主键自动增长(如MySql和SQL Server),使用MyBatis生成主键具体配置示例如下。

<insert id="addUser" useGeneratedKeys="true" keyProperty="id" parameterType="com.lesour.po.User">
	insert into t_user(username , jobs , phone)
	values(#{username} , #{jobs} , #{phone})
insert>

SQL语句中的#{username}等要和实体类的属性名一样。
上述标签的几个属性中

  • parameterType 表示传入SQL语句句的参数类型,它可以是基本数据类型(如int,String,Date等),基本数据类型传参,只能传入一个,在SQL语句中通过#{参数名} 即可获取传入的值。也可以是复杂数据类型(Java实体类、Map),在SQL语句中通过#{属性名}或#{map的KeyName}即可获取传入的值 。
  • useGeneratedKeys (仅对l 门se叶和update 育用)此属性会使MyBatis 使用JDBC 的getGeneratedKeys()方法来获取由数据库内部生产的主键,其默认值为false
  • keyProperty (仅对 insert 和 update 有用)的作用是将插入或更新操作时的返回值赋值给PO 类的某个属性,通常会设置为主键对应的属性。如果需要设置联合主键,可以在多个值之间用逗号隔开。

使用以下语句来设置主键自增属性

alter table table_name modify id int auto_increment;

编写测试代码

    public void addUser(User user) {
    	SqlSession session = sqlSessionFactory.openSession();
    	int row = session.insert("UserMapper.addUser", user);
    	if(row > 0) {
    		System.out.println("成功插入一个用户数据。");
    	}else {
    		System.out.println("用户数据插入失败。");
    	}
    	session.commit();
    	session.close();
    }

2.如果使用的数据库不支持主键自动增长(如Oracle ),或者支持增长的数据库取消了主键自增的规则时,可以使用MyBatis 提供的另一种方式来自定义生成主键,具体配置示例如下。

<insert id="addUser" parameterType="com.lesour.po.User">
	<selectKey keyProperty="id" resultType="Integer" order="BEFORE">
		select if(max(id) is null , 1 , max(id) +1) as newld from t customer
	selectKey>
	insert into t_user( id, username , jobs , phone)
	values(#{id} , #{username} , #{jobs} , #{phone})
insert>

在执行上述示例代码时, 元素会首先运行,它会通过自定义的语句来设置数据
表中的主键(如果t_customer 表中没有记录,则将id 设置为1 ,否则就将id 的最大值加1 ,来
作为新的主键),然后再调用插入语句。
在上述 标签的几个属性中

  • resultType 从SQL 语句中返回的结果的类型。它可以是基本数据类型(如int String等)也可以集合类型(List,ArrayList等),如果返回的是集合类型那么返回的应该是集合包含的类型,而不是集合本身,如果我们返回的是List则resultType应为User。
  • order 属性可以被设置为BEFORE 或AFTER 。如果设置为BEFORE ,那么它会首先执行元素中的配置来设置主键,然后执行插入语句;如果设置为AFTER ,那么它会先执行插入语句,然后执行元素中的配置内容。

你可能感兴趣的:(Java,EE)