这里使用的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的返回值