MyBatis实现Dao的三种方式
MyBatis实现Dao方便在哪里?
解决SQL参数封装的问题
- 我们先看看以前是怎么传参的。

- 在看看现在是如何传参的

相对比起来,是不是要简单多了?原始的方法是将所有参数放在一个集合中,
很麻烦。现在用了Mybatis,我们就可以直接传入映射好的bean对象。
所以这应该是使用Mybatis的第一个好处吧!
————————————————–
解决结果集处理映射的问题
我们先来看看简单映射(数据库的字段名和Java Model的属性名一致)

这个是使用了一个小框架——Spring JDBC,看起来确实也很简便,会自动给我们映射。
我们在来看一个稍微复杂一点的映射(多表查询)

这里就简单涉及了两张表,一个一对多的查询。这种就无法使用上面的框架映射了,只能用JDBC的方法,自己一一映射。
下面我们看看用Mybatis做简单映射

只需要写清楚要映射转换的类型即可。
再看看用Mybatis做复杂的映射

是不是比用原生的JDBC的结果集转换简单多了!!!
最后我们看看做更复杂的映射(多表查询)

这里涉及了一对一、一对多、多对多的多表查询!一对比,便知道,这就是使用Mybatis的第二个好处了!
————————————————–
解决数据库表列名和Java对象的属性名不同的问题
数据库中的字段名(下划线:person_job)和Java的属性名(小驼峰:personJob)都有各自的命名规范。
若是做查询时的结果集映射(数据库映射到Bean上)

只需要开启Mybatis的驼峰映射即可!开启后,既可以实现形如如:created_time =>createdTime 的映射了
若是做更改和增加传入的参数(Bean映射到数据库中)

只需要将数据库的字段名(column)和Bean对象的属性名(property)写正确即可!
————————————————–
小结
这应该就是单独使用Mybatis框架,主要的便利之处吧!!!了解了这些,我们来看看有哪几种方法用Mybatis来实现Dao层
先来看看实现的思维导图(自己做的)

这是所用到的skill表

- 定义接口,且自定义dao实现类
- SkillDaoImpl代码
public class SkillDaoImpl implements SkillDao {
@Override
public boolean delete(Integer id) {
try (SqlSession session = Mybatises.openSession(true)) {
return session.delete("skill.delete",id) > 0;
}
}
@Override
public boolean update(Skill skill) {
try (SqlSession session = Mybatises.openSession(true)) {
return session.update("skill.update",skill) > 0;
}
}
@Override
public boolean save(Skill skill) {
try (SqlSession session = Mybatises.openSession(true)) {
return session.insert("skill.save",skill) > 0;
}
}
@Override
public Skill get(Integer id) {
try (SqlSession session = Mybatises.openSession()) {
return session.selectOne("skill.get",id);
}
}
@Override
public List<Skill> list() {
try (SqlSession session = Mybatises.openSession()) {
return session.selectList("skill.list");
}
}
}
- 映射的配置文件代码
<mapper namespace="skill">
<sql id="getListAll" >
SELECT * FROM skill
</sql>
<select id="list" resultType="Skill">
<include refid="getListAll" />
</select>
<select id="get" resultType="Skill">
<include refid="getListAll" /> WHERE id = #{id}
</select>
<delete id="delete" parameterType="int">
DELETE FROM skill WHERE id = #{id}
</delete>
<update id="update" parameterType="Skill">
UPDATE skill SET name = #{name}, level = #{level} WHERE id = #{id}
</update>
<insert id="save" parameterType="Skill" keyProperty="id" useGeneratedKeys="true">
INSERT skill(name, level) VALUES (#{name}, #{level})
</insert>
</mapper>
小结
这种自定义接口,且自己写实现的方法,思路非常清晰。可是这样写,不仅写起来麻烦,且实现其他dao的时候会有大量重复代码,不推荐使用!
- 自定义接口,用xml配置文件实现
- 实现代码
<mapper namespace="com.zhiyan.dao.SkillDao">
<sql id="getListAll" >
SELECT * FROM skill
</sql>
<select id="list" resultType="Skill">
<include refid="getListAll" />
</select>
<select id="get" resultType="Skill">
<include refid="getListAll" /> WHERE id = #{id}
</select>
<delete id="delete" parameterType="int">
DELETE FROM skill WHERE id = #{id}
</delete>
<update id="update" parameterType="Skill">
UPDATE skill SET name = #{name}, level = #{level} WHERE id = #{id}
</update>
<insert id="save" parameterType="Skill" keyProperty="id" useGeneratedKeys="true">
INSERT skill(name, level) VALUES (#{name}, #{level})
</insert>
<resultMap id="rmConstructor" type="Skill">
<constructor>
<arg column="name" name="name"/>
<arg column="level" name="level"/>
</constructor>
</resultMap>
<select id="testGetConstructor" resultMap="rmConstructor">
<include refid="getListAll" /> WHERE id = #{id}
</select>
</mapper>
- 注意点
- 映射的配置文件中,namespace必须写dao的全类名,如下图所示。

- xml文件方法的id名,必须和dao接口定义的方法名保持一致,如下图所示。

小结
这种方式实现dao就方便了许多,而且这个配置文件,不会被打包成字节码文件,方便修改资源,
这种方法,一般使用在需要经常修改SQL语句、批量插入、sql较为复杂的地方
- 只定义接口,使用注解实现
- 实现代码
public interface SkillDao {
@Delete("DELETE FROM skill WHERE id = #{id}")
boolean delete(Integer id);
@Update("UPDATE skill SET name = #{name}, level = #{level} WHERE id = #{id}")
boolean update(Skill skill);
@Insert("INSERT skill(name, level) VALUES(#{name}, #{level})")
@SelectKey(keyProperty = "id",before = false, statement = "SELECT LAST_INSERT_ID()", resultType = Integer.class)
boolean save(Skill skill);
@Select("SELECT * FROM skill WHERE id = #{id}")
Skill get(Integer id);
@Select("SELECT * FROM skill")
List<Skill> list();
@Select("SELECT * FROM skill LIMIT #{start}, #{size}")
List<Skill> listByStartAndSize(@Param("start") int start, @Param("size") int size);
}
- 注意点
- mybatis配置文件中mapper标签必须写全类名,如下图所示。

- 可理解为Dao就是一个简化的xml配置文件
小结
这种方式在开发中比较常用,相比起来最简便,但是会将SQL语句一并打包编译成字节码文件,不方便修改资源。
总结
三种方式,除了第一种不常用以外,其余两种自定义接口的方式。没有谁好谁坏,各有所长。
小马过河,因人而异,各取所需。还可以两种方式混合使用(可以自己实现一下)!
本章节是单独使用mybatis来简化持久层的开发。听说用Spring整合了Mybatis,使用起来更简单。
标注:以上文章,是本阶段的理解输出!哥子们给点意见指导指导呗!