1.开发规范

Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法。


Mapper接口开发需要遵循以下规范:

(1)、 Mapper.xml文件中的namespace与mapper接口的类路径相同。

(2)、 Mapper接口方法名和Mapper.xml中定义的每个statement的id相同

(3)、 Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同

(4)、 Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同


2.mapper映射文件

将UserMapper.xml放在config下mapper目录下

<?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">
<!-- namespace:命名空间,用于隔离sql,还有一个很重要的作用,后面会讲 -->
<mapper namespace="com.skiff.www.mapper.UserMapper">

	<!-- id:statement的id 或者叫做sql的id -->
	<!-- parameterType:声明输入参数的类型 -->
	<!-- resultType:声明输出结果的类型,应该填写pojo的全路径 -->
	<!-- #{}:输入参数的占位符,相当于jdbc的? -->
	<select id="queryUserId" parameterType="int"
		resultType="com.skiff.www.domain.User">
		select * from user where id = #{id}
	</select>

	<!-- 如果返回多个结果,mybatis会自动把返回的结果放在list容器中 -->
	<!-- resultType的配置和返回一个结果的配置一样 -->
	<select id="queryUserByUsername1" parameterType="string"
		resultType="com.skiff.www.domain.User">
		SELECT * FROM user WHERE username LIKE #{username}
	</select>

	<!-- 如果传入的参数是简单数据类型,${}里面必须写value -->
	<select id="queryUserByUsername2" parameterType="string"
		resultType="com.skiff.www.domain.User">
		SELECT * FROM `user` WHERE username LIKE '%${value}%'
	</select>

	<!-- 插入语句中values中括号的字段和数据库中的表中的数据是一一对应的 而value后面的数据是实体的对象中对应的属性 -->
	<!-- 保存用户 -->
	<insert id="saveUser" parameterType="com.skiff.www.domain.User">
		<!-- selectKey 标签实现主键返回 -->
		<!-- keyColumn:主键对应的表中的哪一列 -->
		<!-- keyProperty:主键对应的pojo中的哪一个属性 -->
		<!-- order:设置在执行insert语句前执行查询id的sql,在执行insert语句之后执行查询id的sql -->
		<!-- resultType:设置返回的id的类型 -->
		<selectKey keyColumn="id" keyProperty="id" order="AFTER"
			resultType="int">
			SELECT LAST_INSERT_ID()
		</selectKey>
		INSERT INTO `user`
		(username,birthday,sex,address) VALUES
		(#{name},#{birthday},#{sex},#{address})
	</insert>

	<!-- 更新用户 -->
	<update id="updateUserById" parameterType="com.skiff.www.domain.User">
		UPDATE `user` SET
		username = #{name},
		address = #{address},
		birthday = #{birthday} WHERE id = #{id}
	</update>

	<!-- 删除用户 -->
	<delete id="deleteUserById" parameterType="int">
		delete from user where
		id=#{id}
	</delete>



</mapper>




3.UserMapper接口文件

/**     
 * @文件名称: UserMapper.java   
 * @描述: TODO  
 * @作者:  一叶扁舟(skiff)
 * @时间:2018年1月9日 下午3:18:05  
 * @版本:V1.0     
 */ 
package com.skiff.www.mapper;

import java.util.List;

import com.skiff.www.domain.User;

/**  
 * @类功能说明:    
 * @作者: 一叶扁舟 (skiff)
 * @创建时间:2018年1月9日 下午3:18:05  
 * @版本:V1.0  
 */
public interface UserMapper {

	   //遵循四个原则
		//接口 方法名  == User.xml 中 id 名
		//返回值类型  与  Mapper.xml文件中返回值类型要一致
		//方法的入参类型 与Mapper.xml中入参的类型要一致
		//命名空间 绑定此接口
		public User findUserById(Integer id);
		
		public List<User> queryUserByUsername1(String name);
		
}




4.sqlMapConfig.xml文件中添加UserMapper.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<!-- 和spring整合后 environments配置将废除 -->
	<environments default="development">
		<environment id="development">
			<!-- 使用jdbc事务管理 -->
			<transactionManager type="JDBC" />
			<!-- 数据库连接池 -->
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver" />
				<property name="url"
					value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
				<property name="username" value="root" />
				<property name="password" value="123456" />
			</dataSource>
		</environment>
	</environments>
	<mappers>
		<mapper  resource="sqlmap/User.xml"/>
		<mapper  resource="sqlmap/Order.xml"/>
	</mappers> 

</configuration>




5.测试


/**     
 * @文件名称: UserMapperTest.java   
 * @描述: TODO  
 * @作者:  一叶扁舟(skiff)
 * @时间:2018年1月9日 下午6:14:34  
 * @版本:V1.0     
 */ 
package test.com.skiff.www.testUser;

import java.io.InputStream;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import com.skiff.www.domain.User;
import com.skiff.www.mapper.OrderMapper;
import com.skiff.www.mapper.UserMapper;

/**  
 * @类功能说明:    
 * @作者: 一叶扁舟 (skiff)
 * @创建时间:2018年1月9日 下午6:14:34  
 * @版本:V1.0  
 */
public class UserMapperTest {
	private SqlSessionFactory sqlSessionFactory;

	@Before
	public void init() throws Exception {
		InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
		this.sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
	}
	@Test
	public void testQueryName(){
		SqlSession session = this.sqlSessionFactory.openSession();
		UserMapper mapper = session.getMapper(UserMapper.class);
		List<User> users = mapper.queryUserByUsername1("无悔");
		for (User user2 : users) {
			System.out.println(user2);
		}
		
		
		
	}

}



6.注意:


(1).采用原始Dao开发模式,在测试类中要创建userDaoImpl对象,再调用dao中中的方法


如:

//注入session工厂
UserDao userDao = new UserDaoImpl(sqlSessionFactory);
//调用dao方法查询出结果
User user = userDao.selectUserById(31); 
然而在mapper动态代理方式中是如下方式:
 
            SqlSession session = this.sqlSessionFactory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
List<User> users = mapper.queryUserByUsername1("无悔");



(2).原始dao开发,是dao直接操作数据库,可以在dao中编写sql语句,而是使用mapper动态代理开发时,使用mapper接口调用sql,sql都是在xxxMapper.xml文件中(注意mapper规范)。因此这两种方式都是可以直接操作数据库的,在项目实际开发中一般采用的是,controller--->service--->dao---->mapper--->sql