Mybatis与普通ORM框架不同,Mybatis并不是真正的ORM框架,它只是一个半自动的SQL映射框架。(实际上Mybatis官方也称Mybatis是基于SQL的数据映射工具)
半自动带来的灵活性
Mybatis需要开发者自己编写SQL语句,因此开发者可以充分对SQL进行优化。
Mybatis需要开发者自己定义ResultSet与对象之间的映射关系,因此可以更简单的避免循环依赖的问题。
Mybatis的Mapper配置文件的标签
<?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="cn.bookstudy.dao.NewsMapper">
<insert id="saveNews">
insert into news_inf
values (null, #{title}, #{content})
</insert>
<insert id="updateNews">
update news_inf
set news_title=#{title},news_content=#{content}
where news_id=#{id}
</insert>
<update id="deleteNews">
delete from news_inf where news_id=#{id}
</update>
</mapper>
上面update语句使用了<insert>标签,delete语句使用了<update>标签,这有什么问题吗?
当然是没什么问题。文件中的<insert>、<update>、<delete>元素的功能差不多,只是出于可读性考虑,才建议用<insert>来定义insert语句,事实上完全可以用<insert>定义update语句,这样<insert>元素执行时会删除记录。
public static void updateTest(SqlSession sqlSession) {
HashMap<String, String> news = new HashMap<>();
news.put("id", "1");
news.put("title", "java8");
news.put("content", "Java8挺好的");
int n = sqlSession.insert("cn.bookstudy.dao.NewsMapper.updateNews", news);
System.out.printf("修改了%d条数据%n", n);
sqlSession.commit();
sqlSession.close();
}
上面这段代码中,sqlSession调用了insert方法,但是执行的是修改语句,这样也是可以的。因为Mybatis底层是调用PreparedStatement执行DML语句都用excute()方法。不过为了可读性好一点,最好还是用操作对应的方法。