以下的代码和配置文件请参考:
Mybatis入门系列之(二)——查询入门案例
https://blog.csdn.net/guo20082200/article/details/80086648
insert语句
在UserMapper.java中添加如下方法:
/**
* 添加一个用户
* @param sysUser
* @return
*/
int insert(SysUser sysUser);
在UserMapper.xml文件中添加
<!--
insert:表明这里需要插入一条数据
属性
id:命名空间的唯一标识,用来表示该插入语句
parameterType:即将传入的语句参数的全限定类名或别名,这个参数是可选的
因为mybatis可以推断出传入语句的具体参数,因此不建议书写
flushCache:默认值为true,任何时候只要语句被调用,都会清空一级和二级缓存
timeout:设置在抛出异常前,驱动程序等待数据库返回请求结果的秒数
statementType:对于STATEMENT,PREPARED,CALLABLE,MyBatis会分别使用
Statement,PreparedStatement,CallableStatement,默认值为PREPARED
useGeneratedKeys:默认值为false,如果设置为true,MyBatis会使用JDBC的
getGeneratedKeys方法来取出由数据库内部生成的主键
keyProperty:MyBatis通过getGeneratedKeys方法获取到主键后将要复制的属性名。
如果希望得到多个数据库自动生成的列,属性值也可以是以逗号分隔的属性名称列表
keyColumn:仅对INSERT和UPDATE语句有用,通过生成的键值设置表中的列名,这个设置仅在
某些数据库(PostgreSQL)中是必须的。当主键列不是表中的第一列时,需要设置。
如果希望得到多个生成的列,也可以是以逗号分隔的属性名称列表
databaseId:后面再说
对SQL的说明如下:
通过#{property}方式从参数中取出属性的值
BLOB对应的类型是:ByteArrayInputStream,就是二进制数据流
由于数据库区分date,time,timestamp类型,所以这里指定JDBC类型为TIMESTAMP
-->
<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,jdbcType=BLOB},
#{createTime,jdbcType=TIMESTAMP})
</insert>
测试代码:
@Test
public void testInsert(){
SqlSession sqlSession = getSqlSession();
try {
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
SysUser user = new SysUser();
user.setUserName("test1");
user.setUserPassword("123456");
user.setUserEmail("test1@mybatis.tk");
user.setUserInfo("test info");
user.setHeadImg(new Byte[]{1,2,3});
user.setCreateTime(new Date());
int insert = userMapper.insert(user);
//只插入一条记录
Assert.assertEquals(1,insert);
//返回插入之后的id
Assert.assertNull(user.getId());
}finally {
//为了不影响其他测试,这里选择回滚
//由于默认的sqlSessionFactory.openSession();是不自动提交的
//因此不执行commit操作,数据不会进入数据库
sqlSession.rollback();
sqlSession.close();
}
}
执行结果如下:
[DEBUG] 2018-04-27 14:37:47,549 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
==> Preparing: INSERT INTO sys_user (id,user_name,user_password,user_email,user_info,head_img,create_time) VALUES (?,?,?,?, ?,?, ?)
[DEBUG] 2018-04-27 14:37:47,580 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
==> Parameters: null, test1(String), 123456(String), test1@mybatis.tk(String), test info(String), java.io.ByteArrayInputStream@4f83df68(ByteArrayInputStream), 2018-04-27 14:37:45.403(Timestamp)
[DEBUG] 2018-04-27 14:37:47,636 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
<== Updates: 1
将UserMapper.xml文件中insert语句对应的日期类型修改为DATE,结果如下
<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,jdbcType=BLOB},
#{createTime,jdbcType=DATE})
</insert>
再次执行测试语句(注意黑色加粗字体):
[DEBUG] 2018-04-27 14:41:47,015 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
==> Preparing: INSERT INTO sys_user (id,user_name,user_password,user_email,user_info,head_img,create_time) VALUES (?,?,?,?, ?,?, ?)
[DEBUG] 2018-04-27 14:41:47,055 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
==> Parameters: null, test1(String), 123456(String), test1@mybatis.tk(String), test info(String), java.io.ByteArrayInputStream@4f83df68(ByteArrayInputStream), 2018-04-27(Date)
[DEBUG] 2018-04-27 14:41:47,106 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159)
<== Updates: 1
将UserMapper.xml文件中insert语句对应的日期类型修改为TIME,结果报错:
Data truncation: Incorrect datetime value: ‘14:43:23’ for column ‘create_time’ at row 1
如何获取插入数据库记录的主键值???两种方式
使用jdbc方式返回主键自增的值
UserMapper.java中添加
/** * 添加一个用户,返回主键的方式 * @param sysUser * @return */ int insert2(SysUser sysUser);
UserMapper.xml中添加
<insert id="insert2" useGeneratedKeys="true" keyColumn="id"> INSERT INTO sys_user (user_name,user_password,user_email,user_info,head_img,create_time) VALUES (#{userName},#{userPassword},#{userEmail}, #{userInfo},#{headImg,jdbcType=BLOB}, #{createTime,jdbcType=TIMESTAMP}) </insert>
这里使用了useGeneratedKeys属性,当该属性值为true时,mtbatis会使用jdbc的getGeneratedKeys方法来取出由数据库内部生成的主键。获得主键后将其赋值给keyProperty配置的id属性。当需要设置多个属性时,使用逗号隔开,这种情况下通常还需要设置keyColumn属性,按照指定的数据库的列,这里列的值会和keyProperty配置的属性一一对应。
测试代码:
@Test public void testInsert2(){ SqlSession sqlSession = getSqlSession(); try { UserMapper userMapper = sqlSession.getMapper(UserMapper.class); SysUser user = new SysUser(); user.setUserName("test1"); user.setUserPassword("123456"); user.setUserEmail("test1@mybatis.tk"); user.setUserInfo("test info"); user.setHeadImg(new Byte[]{1,2,3}); user.setCreateTime(new Date()); int insert = userMapper.insert2(user); System.out.println(user.getId()); //只插入一条记录 Assert.assertEquals(1,insert); //返回插入之后的id Assert.assertNull(user.getId()); }finally { sqlSession.rollback(); sqlSession.close(); } }
测试结果返回主键值为null,这是因为这里设置了rollback(),改为commit即可。。
使用selectKey返回主键的值
UserMapper.java中添加如下代码:
/** * 添加一个用户,使用selectKey的方式 * @param sysUser * @return */ int insert3(SysUser sysUser);
UserMapper.xml添加如下配置:
<!-- selectKey标签属性解析: keyColumn:列的值 keyProperty:属性值 resultType:设置返回值的类型 order:这里写AFTER,是因为mysql数据库是在该语句插入成功之后,才会返回主键的值 如果是Oracle数据库,该值设置为before --> <insert id="insert3"> INSERT INTO sys_user (user_name,user_password,user_email,user_info,head_img,create_time) VALUES (#{userName},#{userPassword},#{userEmail}, #{userInfo},#{headImg,jdbcType=BLOB}, #{createTime,jdbcType=TIMESTAMP}) <selectKey keyColumn="id" resultType="long" keyProperty="id" order="AFTER"> SELECT LAST_INSERT_ID() </selectKey> </insert>
测试代码:
@Test public void testInsert3(){ SqlSession sqlSession = getSqlSession(); try { UserMapper userMapper = sqlSession.getMapper(UserMapper.class); SysUser user = new SysUser(); user.setUserName("test1"); user.setUserPassword("123456"); user.setUserEmail("test1@mybatis.tk"); user.setUserInfo("test info"); user.setHeadImg(new Byte[]{1,2,3}); user.setCreateTime(new Date()); int insert = userMapper.insert3(user); System.out.println(user.getId()); }finally { sqlSession.rollback(); sqlSession.close(); } } /*---------------------------------------------------------------------------------- [DEBUG] 2018-04-27 14:58:45,286 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159) ==> Preparing: INSERT INTO sys_user (user_name,user_password,user_email,user_info,head_img,create_time) VALUES (?,?,?, ?,?, ?) [DEBUG] 2018-04-27 14:58:45,322 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159) ==> Parameters: test1(String), 123456(String), test1@mybatis.tk(String), test info(String), java.io.ByteArrayInputStream@4f83df68(ByteArrayInputStream), 2018-04-27 14:58:43.662(Timestamp) [DEBUG] 2018-04-27 14:58:45,363 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159) <== Updates: 1 [DEBUG] 2018-04-27 14:58:45,365 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159) ==> Preparing: SELECT LAST_INSERT_ID() [DEBUG] 2018-04-27 14:58:45,365 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159) ==> Parameters: [TRACE] 2018-04-27 14:58:45,397 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.trace(BaseJdbcLogger.java:165) <== Columns: LAST_INSERT_ID() [TRACE] 2018-04-27 14:58:45,397 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.trace(BaseJdbcLogger.java:165) <== Row: 1011 [DEBUG] 2018-04-27 14:58:45,398 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:159) <== Total: 1 1011 ----------------------------------------------------------------------------------*/
update语句
在UserMapper.java中增加如下代码:
/**
* 根据主键id更新用户
* @param sysUser
* @return
*/
int updateById(SysUser sysUser);
UserMapper.xml添加如下配置:
<!--
更新语句
-->
<update id="updateById">
UPDATE sys_user
set user_name = #{userName},
user_password = #{userPassword},
user_email = #{userEmail},
user_info = #{userInfo},
head_img = #{headImg,jdbcType=BLOB},
create_time = #{createTime,jdbcType=TIMESTAMP}
where id = #{id}
</update>
测试代码略去。。。
如何批量更新,后面讲解
delete语句
在UserMapper.java中增加如下代码:
/**
* 根据主键id删除用户
*
* 将该方法修改为 int deleteById(SysUser sysUser);也是正确的
*
* @param id
* @return
*/
int deleteById(Long id); xxxxxxxxxx <!-- delete标签 --> <delete id="deleteById"> DELETE FROM sys_user where id = #{id} </delete>
UserMapper.xml添加如下配置:
<!--
delete标签
-->
<delete id="deleteById">
DELETE FROM sys_user where id = #{id}
</delete>
测试代码略去。。。