java Mybatis框架入门

  • Mybatis简介
  • Mybatis的基本使用
  • 关于SQL语句的动态拼接
  • 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;
  1. 核心配置文件完成后,我们需要通过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的双引号与判断语句的双引号冲突了,所以用&quot进行转译。

另外,在Mybatis配置文件的标签里我们会用到OGNL表达式,以下为一些OGNL表达式。

JAVA mybatis模板调用 java中mybatis_JAVA mybatis模板调用


JAVA mybatis模板调用 java中mybatis_sql_02

Mybatis的标签

上面是Mybatis的基本使用方法,这里对一些在上面的例子中没有出现的标签进行一个补充。

JAVA mybatis模板调用 java中mybatis_SQL_03

<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配置文件里的标签很多,这里暂时举一两个例子,其他标签在具体使用时可以去查询。