Mybatis使用过程中,相对于hibernate更为灵活、简洁之处就在于它利用mybatis封装的标签配置sql语句,在代码中加载配置文件执行sql。咱采取“先做,再总结”方针,方便大家理解。诸位客官请往下看。
现对一个Message实体类进行操作:
1、创建实体类
/**
* @author Max1209
* 实体类
*
public class Message {
private int id;
private String command;
private String description;
private String content;
//此处省略getter setter 方法
}
2、创建配置文件,通过xml文件对该实体进行查询、删除、批量删除的相关配置:
<?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="Message">
<!-- TYPE message类路径 -->
<resultMap type="cn.max.domain.Message" id="MsgResult">
<id column="Id" jdbcType="INTEGER" property="id"/>
<result column="command" jdbcType="VARCHAR" property="command"/>
<result column="content" jdbcType="VARCHAR" property="content"/>
<result column="description" jdbcType="VARCHAR" property="description"/>
</resultMap>
<select id="queryMsgList" parameterType="cn.max.domain.Message"
resultMap="MsgResult">
select Id,command,content,description from message where 1=1
<if test="command !=null and !"".equals(command.trim())">
and command=#{command}
</if>
<!--等同于 command!=null && !"".equals(command.trim()) -->
<if test="description !=null and !"".equals(command.trim())">
and description like '%' #{description} '%'
</if>
</select>
<delete id="deleteOne" parameterType="int">
delete from message where Id='{_parameter}'
</delete>
<delete id="deleteBatch" parameterType="java.util.List">
delete from massage where Id in(
<foreach collection="list" item="item" separator=",">
#{item}
</foreach>
)
</delete>
</mapper>
配置文件详解:
3、在配置文件【Configuration.xml】中添加Message实体配置文件【同hibernate原理】
<mappers>
<mapper resource="config1/Message.xml"/>
</mappers>
4、程序中读取配置,以传参的方式【namespace.标签id】加载配置文件执行数据操作
/**通过mybatis创建数据库连接
* @param command
* @param description
* @return List<Message>
*/
public class MessageDao {
DBAccess dbAccess=new DBAccess();
SqlSession sqlSession=null;
public List<Message> queryMsgList(String command,String description)
{
List<Message> msgList=new ArrayList<Message>();
try{
Message msg=new Message();
msg.setCommand(command);
msg.setDescription(description);
//读取配置,创建sqlSession对象
sqlSession=dbAccess.getSqlSesion();
//通过sqlsession执行sql语句-----配置文件已包含
//namespace.select 标签的id
msgList=sqlSession.selectList("Message.queryMsgList",msg);
}catch(IOException e)
{
e.printStackTrace();
}finally
{
if(sqlSession!=null)
{
sqlSession.close();
}
}
return msgList;
}
/*
* 单条删除
*/
public void deleteOne(int id)
{
try{
//获得数据库和对应实体表
sqlSession=dbAccess.getSqlSesion();
//执行sql语句 参数 (配置文件namespace.标签id ,传参)
sqlSession.delete("Message.deleteOne",id);
sqlSession.commit();
}catch (Exception e) {
e.printStackTrace();
}finally
{
sqlSession.close();
}
}
public void deleteBatch(List<Integer> ids)
{
try{
//获取sqlsession对象
//执行sql语句
sqlSession=dbAccess.getSqlSesion();
sqlSession.delete("Message.deleteBatch", ids);
sqlSession.commit();
}catch (Exception e) {
e.printStackTrace();
}finally{
sqlSession.close();
}
}
所有MyBatis执行增删改查,都不再是通过在程序中嵌入sql,或是类似于hibernate封装一套hql面向对象进行查询,而是整体通过mybatis标签,将对实体进行所有的数据sql都配置到select\delete\insert标签中,并通过方法读取配置文件,加载标签id便可执行查询。这种基于XML映射配置文件配置来实现更利于管理优化。而且程序通过获取sqlSession对象的crud方法,传入配置文件的【命名空间+查询标签ID】参数进行调用,非常方便,十分灵活。
同时这也要求学习者对OGNL表达式和EL使用熟练,才能使用mybatis标签灵活配置满足复杂需求的sql拼接。