Mybatis面向接口编程

一、出发点

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 {
			//获取SqlSession
			session = 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 {
			//获取SqlSession
			session = 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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值