Mybatis面向接口编程

来源:互联网 发布:旅贸通软件 编辑:程序博客网 时间:2024/06/05 21:03

一、出发点

Mybatis面向接口编程主要解决一下接种问题

1.配置文件中namespce命名空间问题

2.sql关联id问题

3.返回值问题

4.传入参数问题


二、Message.xml配置文件

namespce为接口的全类名

id是接口方法名 

parameterType是对应方法的参数类型

返回值有resultMap或resultType决定

<?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="com.imooc.dao.IMessageDao">  <resultMap type="com.imooc.bean.Message" id="MessageResult">    <id column="id" jdbcType="INTEGER" property="id"/>    <result column="command" jdbcType="VARCHAR" property="command"/>    <result column="description" jdbcType="VARCHAR" property="description"/>    <result column="content" jdbcType="VARCHAR" property="content"/>  </resultMap><!-- select标签用于书写查询语句-->  <select id="queryMessageList" parameterType="com.imooc.bean.Message" resultMap="MessageResult">    select id,command,description,content from message    <where><!--     test中书写布尔表达式,如果成功则拼接下边的条件, command是parameterType中的成员变量    拼接sql的时候会将‘#{command}’替换成?,取值类似于ognl    -->    <if test="command != null and !"".equals(command.trim())">    and command=#{command}    </if>    <!-- like 查询一般会拼接concat()拼接两个字符串 -->    <if test="description != null and ''!=description.trim()">    and description like concat(concat('%',#{description}),'%')    </if>    </where>  </select>  </mapper>



三、接口IMssageDao.java

package com.imooc.dao;import java.util.List;import org.apache.ibatis.annotations.Param;import com.imooc.bean.Message;/** * 于Message配置文件对应的接口 * */public interface IMessageDao {/** * @description: 如果想要执行配置文件中的某天sql语句,就可以定义于配置文件中id相同的方法名 * @param: Message message 是配置文件中对应sql中需要的parameterType * @return: 返回类型即接口返回类型对应配置文件sql申明的返回类型决定 * */public List<Message> queryMessageList(Message message);}

四、使用

调用的时候通过获取到sqlSession中的方法,就可以调用

用法如下边的queryMesageList方法

注:这里感觉使用接口方法还需要多写一个接口类文件,并没有觉得有有什么优点,但是当使用mybatis遇上spring之后,下边的MessageDao.java是不用写的,我们只要写接口文件和对应的配置文件xxx.xml,其他的就交给mybatis管理

package com.imooc.dao;import java.util.HashMap;import java.util.List;import java.util.Map;import org.apache.ibatis.session.SqlSession;import com.imooc.bean.Message;import com.imooc.common.Page;import com.imooc.db.DBAccess;public class MessageDao {DBAccess dbAccess = new DBAccess();        //不是用接口方法public List<Message> queryMessageList2(String command, String description) throws Exception {List<Message> messagesList = null;SqlSession session = null;try {//获取SqlSessionsession = dbAccess.getSqlSession();Message message = new Message();message.setCommand(command);message.setDescription(description);SqlSession中提供了很多数据库操作的方法,如selectXXX实现对数据库的查询 *的方法Message.class.getName().queryMessageList获取配置文件中id=queryMessageList *对应的sql,message为传入的数据封装对象,一般只能传入一个对象,还可以常用map封装参数 *messagesList = session.selectList(Message.class.getName()+".queryMessageList", message);} catch (Exception e) {e.printStackTrace();throw new Exception(e.getMessage());} finally {if (session != null) {session.close();}}return messagesList;}//使用接口方法public List<Message> queryMessageList(String command, String description) throws Exception {List<Message> messagesList = null;SqlSession session = null;try {//获取SqlSessionsession = dbAccess.getSqlSession();Message message = new Message();message.setCommand(command);message.setDescription(description);/* * 使用动态代理原理 * MapperProxy implements InvocationHandler * 类里边有个MapperProxy.invoke() * Proxy.newPproxyInstance(类加载器,接口,MapperProxy对象) 返回一个IMssageDao的代理对象 * *因为:session.getMapper() == Proxy.newProxyInstance() *所以:IMssageDao imssageDao = Proxy.newProxyInstance() *imssageDao.queryMessageList() == MapperProxy.invoke() *  * */IMessageDao iMessageDao =  session.getMapper(IMessageDao.class);messagesList = iMessageDao.queryMessageList(message);} catch (Exception e) {e.printStackTrace();throw new Exception(e.getMessage());} finally {if (session != null) {session.close();}}return messagesList;}}

注:本案例思想由慕课网提供指导

1 0