mybatis的insert语句

这里使用的Mapper接口的方式来处理

接口:

public interface EmpMapper {
    public void addEmp(Emp emp);
}

对应的mapper文件,注意这里的parameterType本来是要写完全限定名,但是由于做了别名,所以可以直接写emp

  <insert id="addEmp" parameterType="emp" >
  	insert into emp(empno,last_name,salary) 
  	values
  	(#{empno},#{lastName},#{salary})
  </insert>

test部分:

(由于是单独使用mybatis,没有使用spring,所以需要这样来创建工厂和session,如果调用openSession时参数为true,就会自动提交,不需要自己commit)

public class MybatisTest {
	SqlSessionFactory sqlSessionFactory;
	SqlSession sqlSession;
	@Before
	public void before() throws IOException{
		String resource = "mybatis-config.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
		sqlSession = sqlSessionFactory.openSession();
	}
        @Test
	public void testAddEmp(){
                EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
		Emp emp = new Emp(1,"Ash",1000);
		mapper.addEmp(emp);
		sqlSession.commit();
        }
}

如果面对主键一开始不知道的情况,怎么插入新纪录的同时又能获取到主键的值呢?

主键获取情况:

1.主键自增

2.主键为UUID

主键自增的情况:

接口:

public void addEmp(Emp emp);

mapper文件

useGeneratedKeys="true",是说明主键是自动生成的,默认为false。

keyProperty="empno",是说先生成主键,赋值给emp类中的empno属性,然后执行语句


<insert id="addEmp" parameterType="emp" useGeneratedKeys="true"
  keyProperty="empno">
  	insert into emp(empno,last_name,salary) 
  	values
  	(#{empno},#{lastName},#{salary})
</insert>
 
 

 
 

所以在调用的时候就不需要先给emp的empno赋值(而且也不能赋值,因为是自动生成的,赋值就会破坏规则)

test:

        @Test
	public void testAddEmp(){
                EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
		Emp emp = new Emp("Ash",1000);
		mapper.addEmp(emp);
		sqlSession.commit();
        }


主键为UUID的情况:

接口:

public void addEmp(Emp emp);


mapper文件:

由于主键不是自动递增,需要指定,所以使用selectKey

keyProperty="id",是指将获取到的值赋值给person类的id属性。

resultType="string",是指id属性的类型,由于mybatis中已经声明了基本属性的别名,所以String和string是一样的。

order="BEFORE",是指在执行insert语句之前执行selectKey中的语句,而mysql中获取UUID并去掉"-"的方法如下所示


  <insert id="addPerson" parameterType="person">
  	<selectKey keyProperty="id" resultType="string" order="BEFORE">
  		SELECT REPLACE(UUID(),'-','')
  	</selectKey>
  	insert person values(#{id},#{name})
  </insert>



test:


        @Test
	public void testAddPerson(){
                PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
		Person person = new Person("Ash");
		mapper.addPerson(person);
		sqlSession.commit();
        }


另外还有一点需要注意:

Integer Long Boolean都可以作为insert, delete, update的返回值

猜你喜欢

转载自blog.csdn.net/Luke_R/article/details/78494520