MyBatis中Mapper代理开发方式

MyBatis中Mapper代理开发方式

一、说在前面

上文(MyBatis原始Dao开发方式)结尾处提到,原始的dao开发方式存在一些问题,为了解决掉这些问题,现在采用mapper代理方式进行开发。

Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象。
Mapper接口开发需要遵循以下规范:
1、 Mapper.xml文件中的namespace与mapper接口的类路径相同。
2、 Mapper接口方法名和Mapper.xml中定义的每个statement的id相同 
3、 Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同
4、 Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同

二、实例代码

数据库文件以及用户实体类都和上文(MyBatis原始Dao开发方式)一模一样,在此不再赘述。
1、 UserMapper.java

package cn.at.mybatis.mapper;

import java.util.List;

import cn.at.mybatis.po.User;
/*
 * mapper接口 , 相当于dao接口,用户管理
 */
public interface UserMapper {

	//根据用户id查询用户信息
	public User findUserById(int id) throws Exception;
	
	//根据用户名称查询多条用户信息
	public List<User> findUserByName(String name) throws Exception;
	
	//添加用户
	public void insertUser(User user) throws Exception;
	
	//更加用户id删除用户
	public void deleteUser(int id) throws Exception;
}
2、UserMapper.xml

<?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进行分类化管理,理解sql隔离
注意:使用mapper代理方法开发,namespace有特殊重要的作用
 -->
<mapper namespace="cn.at.mybatis.mapper.UserMapper">
	<!-- 在映射文件中配置很多sql语句 -->
	<!-- 通过id查询用户表的记录 -->
	<!-- 通过select来执行数据库的查询
		id:标识映射文件的sql,
		将sql语句封装到mappedStatement对象中,所以称之为statement的id
		#{}表示一个占位符
		#{id}:其中的id表示接受输入的参数,参数名称就是id,如果输入参数是简单类型,#{}中的参数名可以任意,可以是value或者其他名称
		resultType:指定sql输出结果所映射的java对象类型,SELECT指定resultType表示将单条记录映射成java对象。
		
	 -->
	<select id="findUserById" parameterType="int" resultType="cn.at.mybatis.po.User">
		SELECT * FROM user WHERE id=#{id}
	</select>
	
	<!-- 根据用户名称模糊查询用户信息 , 可能返回多条
		resultType: 指的就是单条记录所映射的java对象类型
		${}:表示拼接sql串,将接受到的参数的内容不加任何修饰的拼接到sql中
		使用${}拼接sql,会引起sql注入
		${value}:接受输入参数的内容,如果传入的类型是简单类型,${}中只能是用value
	-->
	<select id="findUserByName" parameterType="String" resultType="cn.at.mybatis.po.User">
		SELECT * FROM user WHERE username LIKE '%${value}%'
	</select>
	
	<!-- 添加用户 -->
	<insert id="insertUser" parameterType="cn.at.mybatis.po.User">
		<!-- 将插入数据的主键返回,返回到user对象中
			keyProperty:将查询到的主键设置到parameterType指定对象的属性中
			order:指的是SELECT LAST_INSERT_ID()的执行顺序,相对于insert来说。
			resultType:指定SELECT LAST_INSERT_ID()的结果类型
		 -->
		<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
			SELECT LAST_INSERT_ID()
		</selectKey>
		INSERT INTO user (username,birthday,sex,address) VALUES (#{username},#{birthday},#{sex},#{address})
	</insert>
	
	<!-- 删除用户 
		根据用户的id删除,需要输入用户的id
	-->
	<delete id="deleteUser" parameterType="int">
		DELETE FROM user WHERE id=#{id}
	</delete>
	
	<!-- 更新用户信息
		parameterType指定user对象,包括id和更新的信息,id必须存在
	 -->
	<update id="updateUser" parameterType="cn.at.mybatis.po.User">
		UPDATE user SET username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} WHERE id=#{id}
	</update>
</mapper>
3、SqlMapConfig.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="111111" />
			</dataSource>
		</environment>
	</environments>
	
	<!-- 加载映射文件 -->
	<mappers>
		<mapper resource="sqlmap/User.xml"/>
		
		<!-- 在这里别忘记加载映射文件了 -->
		<mapper resource="mapper/UserMapper.xml"/>
		
	</mappers>
	
</configuration>
4、UserMapperTest.java测试类

package cn.at.mybatis.mapper;

import static org.junit.Assert.*;

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 cn.at.mybatis.po.User;

public class UserMapperTest {

	private SqlSessionFactory sqlSessionFactory;
	
	//此方法是在执行testFindUserById之前执行
	@Before
	public void setUp() throws Exception {
		//创建sqlSessionFactory
		
		//读取配置文件
		String resource = "SqlMapConfig.xml";
		
		//得到配置文件流
		InputStream inputStream = Resources.getResourceAsStream(resource);
		
		//创建会话工厂
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
	}

	//Mapper代理方式通过id进行查询
	@Test
	public void testFindUserById() throws Exception {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		
		//创建UserMapper对象,mybatis自动生成代理对象
		UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
		
		//调用UserMapper的方法
		User user = userMapper.findUserById(29);
		System.out.println("Mapper代理方式通过id进行查询====》"+user);
	}
	
	//Mapper代理方式通过用户名称进行查询
	@Test
	public void testFindUserByName() throws Exception {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		
		//创建UserMapper对象,mybatis自动生成代理对象
		UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
		
		//调用UserMapper的方法
		List<User> list = userMapper.findUserByName("小明");
		System.out.println("Mapper代理方式通过用户名称进行查询====》"+list);
	}

}
5、测试结果

DEBUG [main] - Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 161733249.
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@9a3da81]
DEBUG [main] - ==>  Preparing: SELECT * FROM user WHERE username LIKE '%luoyepiaoxue%' 
DEBUG [main] - ==> Parameters: 
DEBUG [main] - <==      Total: 2
Mapper代理方式通过用户名称进行查询====》[User [id=26, username=luoyepiaoxue2014, sex=null, birthday=Fri Sep 01 00:00:00 CST 2017, address=安徽], User [id=29, username=luoyepiaoxue, sex=男, birthday=Sun Sep 17 00:00:00 CST 2017, address=北京市]]

By luoyepiaoxue2014
微博地址:  http://weibo.com/luoyepiaoxue2014  点击打开链接



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章