简单的insert用法
首先在UserMapper.class中添加insert方法
...
@param sysUser
@return
int insert(SysUser sysUser);
接着,在UserMapper.xml中添加如下代码:
<insert id = "insert">
insert into sys_user(
id,user_name,user_password,user_email,user_info,head_img,create_time)
values(
#{id}, #{userName},#{userPassword},#{userEmail},#{userInfo},#{headImg, jdbc=BLOB},
***jdbcType就是允许用户访问任何形式的表格数据,BLOB对应的类型是ByteArrayInputStream,就是二进制数据流***
#{createTime, jdbc= TIMESTAMP})
</insert>
此处的SQL就是一个简单的insert语句,values中通过#{property}方式从参数中取出属性的值
为了防止类型错误,对于一些特殊的数据类型,要指定具体的jdbcType值,headImg指定BLOB类型,createTime指定的类型是TIMESTAMP,date、time、datetime对应的jdbc类型分别是DATE、TIME、TIMESTAMP
如下代码是在UserMapperTest测试类中增加一个方法来测试这个insert方法
@Test
public void testInsert() {
SqlSession sqlSession =getSqlSession();
try{
UserMapper userMapper =sqlSession.getMapper(UserMapper.class);
//创建一个User对象
SysUser user = new SysUser();
user.setUserName("test1");
user.setUserPassword("******");
user.setUserEmail("test@mybatis.com");
user.setUserInfo("test info");
//读入一张图片进入byte数组中
user.setHeadImg(new byte[] {1,2,3});
user.setCreateTime(new Date());
//将新建对象插入数据库中,result的返回值是执行SQL影响的行数
int result = userMapper.insert(user);
//只插入1条数据
Assert.assertEquals(1,result);
//id=null,数据库没有给id赋值,并且没有配置回写id的值
Assert.assertNull(user.getId());
}finally {
//选择回滚
SqlSession.rollback();
SqlSession.close();
}
}
JDBC方法返回主键自增的值(id回写)
这部分主要要学会两个概念,分别是useGeneratedKeys和keyProperty
首先,在UserMapper接口中增加insert2方法
...
@param sysUser
@return
int insert(SysUser sysUser);
int insert2(SysUser sysUser);
接着,在xml中新增insert2方法
<insert id = "insert2" useGeneratedKeys= "true" keyProperty ="id">
insert into sys_user(
~~id~~ ,user_name,user_password,user_email,user_info,head_img,create_time)
values(
~~#{id}~~ , #{userName},#{userPassword},#{userEmail},#{userInfo},#{headImg, jdbc=BLOB},
***jdbcType就是允许用户访问任何形式的表格数据,BLOB对应的类型是ByteArrayInputStream,就是二进制数据流***
#{createTime, jdbc= TIMESTAMP})
</insert>
useGeneratedKeys方法会使用jdbc的getGeneratedKeys方法获取数据库内部生成的主键,将其赋值给keyProprty配置的id属性,要设置多个属性的时候可以用逗号隔开,这里通常要设置keyColumn属性,按顺序指定数据库的列,这里的值会与keyProperty配置的属性一一对应。本例获取的是数据库返回的主键值,所以SQL中去掉了两处id,分别是id列和对应的#{id}属性
编写测试类:
@Test
public void testInsert2() {
SqlSession sqlSession =getSqlSession();
try{
UserMapper userMapper =sqlSession.getMapper(UserMapper.class);
//创建一个User对象
SysUser user = new SysUser();
user.setUserName("test1");
user.setUserPassword("******");
user.setUserEmail("test@mybatis.com");
user.setUserInfo("test info");
//读入一张图片进入byte数组中
user.setHeadImg(new byte[] {1,2,3});
user.setCreateTime(new Date());
//将新建对象插入数据库中,result的返回值是执行SQL影响的行数
int result = userMapper.insert(user);
//只插入1条数据
Assert.assertEquals(1,result);
//*因为本例中Id回写,故id不为空*
Assert.assertNotNull(user.getId());
}finally {
SqlSession.close();
}
}
selectKey返回主键的值
适用于提供或不提供自增功能的数据库,本例分MySql和Oracle数据库两个方法
首先在接口和xml中新增insert3方法,UserMapper.class代码:
...
@param sysUser
@return
int insert(SysUser sysUser);
int insert2(SysUser sysUser);
int insert3 (SysUser sysUser);
不同的是在UserMapper.xml中,代码如下:
<insert id = "insert3" >
insert into sys_user(
~~id~~ ,user_name,user_password,user_email,user_info,head_img,create_time)
values(
~~#{id}~~ , #{userName},#{userPassword},#{userEmail},#{userInfo},#{headImg, jdbc=BLOB},
***jdbcType就是允许用户访问任何形式的表格数据,BLOB对应的类型是ByteArrayInputStream,就是二进制数据流***
#{createTime, jdbc= TIMESTAMP})
</insert>
*<selectKey keyColumn = "id" resultType ="long" keyProperty ="id" order ="AFTER">*
//keyColumn通过生成的键值设置表中的列名,当主键列不是表中的第一列时需要设置,也可通过逗号分隔属性名称类型来获得多个生成的列
*SELECT LAST_INSERT_ID()*
//如果是Oracle,上句的写法是:SELECT SEQ_ID.nextval from dual
*</selectKey>*
selectKey keyColumn 中用于取值和映射,因为执行selectKey语句后id就已经有值了,需要把这个序列值作为主键值插入到数据库中,所以通过keyColumn来指定
order的值和数据库有关,在MySql中,order的值是AFTER,在Oracle中,值是BEFORE
Oracle中SELECT SEQ_ID.nextval from dual 是一个获取序列的SQL语句
MySql中 SELECT LAST_INSERT_ID() 是获取数据库中最后插入的数据的Id值