java Mybatis框架入门
Mybatis简介
mybatis是一个持久层的框架,是对JDBC操作数据库的封装,使开发者只需要关注业务本身,不需要花费精力去处理加载驱动、创建数据库连接对象、创建statement语句对象、参数设置、结果集处理等一系列繁杂的过程代码。
mybatis通过xml或注解进行配置,将java对象与sql语句中的参数自动映射生成最终执行的sql语句,并将sql语句执行结果自动映射成java对象,返回给业务层(service)应用。
其实说得通俗一点就是Mybatis简化了对数据库的操作,使用者不用去进行JDBC的操作。
Mybatis的基本使用
创建文件什么的直接跳过,我们来看看Mybatis的具体使用:
1.将Mybatis源码中的Configuration.xml文件导入到项目,并进行JDBC驱动和数据库的配置
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
<property name="" value=""/>
</transactionManager>
<dataSource type="UNPOOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/micro_message"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
2.在DB层获取数据库会话;
// 通过配置文件获取数据库连接信息
Reader reader = Resources.getResourceAsReader("com/imooc/config/Configuration.xml");
// 通过配置信息构建一个SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
// 通过sqlSessionFactory打开一个数据库会话
SqlSession sqlSession = sqlSessionFactory.openSession();
return sqlSession;
- 核心配置文件完成后,我们需要通过SQL语句与数据库进行交互,将User.xml文件导入到项目中,并进行文件的配置:
对resultMap、select标签内容进行修改:resultMap:type、column、property,select:id、resultMap,标签内的代码。
需要注意的是:resultMap中主键用id标签,普通的列用result标签。select里的resultMap要与resultMap标签里的id相同
另外:resultMap可替换为resultType并将resultMap去掉
注意:
使用resultType时必须保证表中的列名与java的属性名相同,即通过名称配置对应关系(不区分大小写)。
而resultMap是通过标签配置对应关系,所以不用保证名称是否相同,且在resultMap中可以在property后面用resultHandler进行数据类型的转换
使用resultMap标签
<resultMap type="com.imooc.bean.Message" id="MessageResult">
<id column="ID" jdbcType="INTEGER" property="id" resultHandler="String"/>
<result column="COMMAND" jdbcType="VARCHAR" property="command"/>
<result column="DESCRIPTION" jdbcType="VARCHAR" property="description"/>
<result column="CONTENT" jdbcType="VARCHAR" property="content"/>
</resultMap>
<select id="queryMessageList" parameterType="com.imooc.bean.Message" resultMap="MessageResult">
select ID,COMMAND,DESCRIPTION,CONTENT from MESSAGE
</select>
使用resultType标签
<select id="queryMessageList" parameterType="com.imooc.bean.Message" resultType="com.imooc.bean.Message">
select ID,COMMAND,DESCRIPTION,CONTENT from MESSAGE
</select>
4.在DAO层里通过sqlSession执行SQL语句
DBAccess dbAccess = new DBAccess();
List<Message> messageList = new ArrayList<Message>();
SqlSession sqlSession = null;
try {
Message message = new Message();
message.setCommand(command);
message.setDescription(description);
sqlSession = dbAccess.getSqlSession();
// 通过sqlSession执行SQL语句
messageList = sqlSession.selectList("Message.queryMessageList", message);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if(sqlSession != null) {
sqlSession.close();
}
}
return messageList;
关于SQL语句的动态拼接
动态拼接的目的就是根据特定的参数查找数据
DAO层中通过sqlSession传入参数,传入参数只能有一个
messageList = sqlSession.selectList("Message.queryMessageList", message);
编写User.xml文件中select标签的parameterType,parameterType后面跟传入的数据类型,注意:只能传入一个数据,若需要传入多个数据可过自定义类实现
<select id="queryMessageList" parameterType="com.imooc.bean.Message" resultMap="MessageResult">
select ID,COMMAND,DESCRIPTION,CONTENT from MESSAGE
<where>
<if test="command != null and !"".equals(command.trim())">
and COMMAND=#{command}
</if>
<if test="description != null and !"".equals(description.trim())">
and DESCRIPTION like '%' #{description} '%'
</if>
</where>
</select>
这里的if标签其实很好理解,就是当test内的内容成立时,将标签里的语句拼接到SQL语句后面,需要说明的是,由于test的双引号与判断语句的双引号冲突了,所以用"进行转译。
另外,在Mybatis配置文件的标签里我们会用到OGNL表达式,以下为一些OGNL表达式。
Mybatis的标签
上面是Mybatis的基本使用方法,这里对一些在上面的例子中没有出现的标签进行一个补充。
<select id="queryMessageList" parameterType="com.imooc.bean.Message" resultMap="MessageResult">
select <include refid="columns"> from MESSAGE
<where>
<if test="command != null and !"".equals(command.trim())">
and COMMAND=#{command}
</if>
<if test="description != null and !"".equals(description.trim())">
and DESCRIPTION like '%' #{description} '%'
</if>
</where>
</select>
<sql id="columns">ID,COMMAND,DESCRIPTION,CONTENT</sql>
这个例子是关于sql和include标签的使用,即sql将一段SQL语句封装好,然后include通过sql标签的id进行调用,当需要重复使用某一段SQL语句时,这两个标签可以简化编写过程。
<choose>
<when test="">
</when>
<when test="">
</when>
<otherwise></otherwise>
</choose>
choose标签的作用可以理解为java里的if-else或者switch-case
<tirm prefix="" suffix="" prefixOverrides="" suffixOverrides="">
</tirm>
tirm标签是一个非常灵活的标签,prefix是在标签里的字符串前加上双引号里的字符,suffix则是在字符串后面加上字符,而两个Overrides则是在字符串前/后删除目标字符。
Mybatis配置文件里的标签很多,这里暂时举一两个例子,其他标签在具体使用时可以去查询。