<insert … />元素通常用于定义一条insert语句。需要指定如下一个关键属性:
- id :SQL语句的唯一标识。需要与Mapper接口的方法名相同。
如果你用@Insert注解,id不需要(直接修饰Mapper接口的方法)。
<insert…/>元素还支持大量的额外属性,如果使用@Insert注解,需要配置@Options注解来指定这些额外的属性。
主要是对MySQL这种自持自增长的数据库有效。
(1) useGeneratedKeys属性(只对<insert…/>元素有效)设置为true
(2) 通过keyProperty告诉MyBatis将自动生成主键值传给参数对象哪个属性。
主类
package lee;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.itcheng.app.dao.NewsMapper;
import org.itcheng.app.domain.News;
public class NewsManager
{
// SqlSessionFactory应该是应用级别
private static SqlSessionFactory sqlSessionFactory;
public static void main(String[] args) throws IOException
{
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// 1. 创建SqlSessionFactory
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 2. 打开SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 保存消息
// saveNews(sqlSession);
/* 结果
* DEBUG [main] org.itcheng.app.dao.NewsMapper.saveNews ==> Preparing: insert into news_inf values (null, ?, ?)
* DEBUG [main] org.itcheng.app.dao.NewsMapper.saveNews ==> Parameters: 测试标题(String), 测试内容(String)
* DEBUG [main] org.itcheng.app.dao.NewsMapper.saveNews <== Updates: 1
* 新插入的news的id为:10
* */
// 查询消息
selectNews(sqlSession);
/* 结果
* class com.sun.proxy.$Proxy17
* DEBUG [main] org.itcheng.app.dao.NewsMapper.findNews ==> Preparing: select news_id id, news_title title, news_content content from news_inf where news_id > ?
* DEBUG [main] org.itcheng.app.dao.NewsMapper.findNews ==> Parameters: -1(Integer)
* DEBUG [main] org.itcheng.app.dao.NewsMapper.findNews <== Total: 9
* [News [id=1, title=修改的标题, content=修改的内容],
* News [id=3, title=22, content=2222222222222],
* News [id=4, title=33, content=3333333333333],
* News [id=5, title=44, content=4444444444444],
* News [id=6, title=55, content=5555555555555],
* News [id=7, title=66, content=6666666666666],
* News [id=8, title=77, content=7777777777777],
* News [id=9, title=测试标题, content=测试内容],
* News [id=10, title=测试标题, content=测试内容]]
*
* */
}
public static void saveNews(SqlSession sqlSession)
{
News news = new News(null, "测试标题", "测试内容");
NewsMapper newsMapper = sqlSession.getMapper(NewsMapper.class);
newsMapper.saveNews(news);
// 由于设置了useGeneratedKey属性为true,并将keyProperty设为id
// 因此程序即可通过news对象的id属性来获取数据库底层生成的自增长主键的值
System.out.println("新插入的news的id为:" + news.getId());
// 4. 提交事务
sqlSession.commit();
// 5. 关闭资源
sqlSession.close();
}
public static void selectNews(SqlSession sqlSession)
{
// 此处的NewsMapper只是一个接口
// MyBatis会使用JDK的动态代理为Mapper接口生成实现类
NewsMapper newsMapper = sqlSession.getMapper(NewsMapper.class);
System.out.println(newsMapper.getClass());
List<?> list = newsMapper.findNews(-1);
System.out.println(list);
// 4. 提交事务
sqlSession.commit();
// 5. 关闭资源
sqlSession.close();
}
}
映射文件 insert标签useGeneratedKeys属性和keyProperty属性组合使用
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 根元素是mapper,该元素的namespace属性值相当于该mapper的唯一标识 -->
<mapper namespace="org.itcheng.app.dao.NewsMapper">
<!--
useGeneratedKeys属性设为true,将数据库生成的自增长主键值返回给参数对象
keyProperty告诉MyBatis将自增长的主键值返回给参数对象的id属性
-->
<insert id="saveNews" useGeneratedKeys="true" keyProperty="id">
insert into news_inf values (null, #{title}, #{content})
</insert>
<select id="findNews" resultType="news">
select news_id id, news_title title, news_content content from news_inf where news_id > #{id}
</select>
</mapper>
接口文件
package org.itcheng.app.dao;
import java.util.List;
import org.itcheng.app.domain.News;
// Mapper组件相当于DAO组件
public interface NewsMapper
{
int saveNews(News news);
List<News> findNews(Integer id);
}