MyBatis 原始dao与mapper代理

一.原始Dao开发 

 原始Dao开发,我们需要些dao接口和dao的实现类,向dao实现类中注入SqlSessionFactory,在方法体内通过SqlSessionFactory创建SqlSession。

public class UserDaoImpl implements UserDao {

	// 需要向dao实现类中注入SqlSessionFactory
	// 这里通过构造方法注入
	private SqlSessionFactory sqlSessionFactory;

	public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
		this.sqlSessionFactory = sqlSessionFactory;
	}

	@Override
	public User findUserById(int id) throws Exception {
		SqlSession sqlSession = sqlSessionFactory.openSession();

		User user = sqlSession.selectOne("test.findUserById", id);

		// 释放资源
		sqlSession.close();

		return user;

	}
上述代码中的

User user = sqlSession.selectOne("test.findUserById", id);

1.sqlSession方法,将statement的id硬编码

2.sqlSession方法id应该是int,但是当传入String类型的时候,因为该方法使用泛型,编译阶段不会出错,不利于开发


二.mapper代理开发

我们编写mapper.xml映射文件, mybatis可以自动生成mapper接口实现类代理对象。但是mapper代理的实现,需要遵循以下4个开发规则

1、在mapper.xml中namespace等于mapper接口地址

<!-- namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离 
注意:使用mapper代码方法开发,namespace要等于mapper接口地址 -->
<mapper namespace="cn.itcast.mybatis.mapper.UserMapper">

2、mapper.java接口中的方法名和mapper.xml中statement的id一致

mapper.java接口方法

	//根据id查询用户
	public User findUserById(int id) throws Exception;
mapper.xml中statement的id

	<select id="findUserById" parameterType="int"
		resultType="cn.itcast.mybatis.po.User">
		select * from USER where id = #{id}
	</select>

3、mapper.java接口中的方法输入参数类型和mapper.xml中statement的parameterType指定的类型一致。

  在规则2的代码中可以看出


4、mapper.java接口中的方法返回值类型和mapper.xml中statement的resultType指定的类型一致。

 同规则2的代码


完整代码

  Usermapper接口

package cn.itcast.mybatis.mapper;
import java.util.List;

import cn.itcast.mybatis.po.User;

/**
 * UserMapper 2016年9月21日18:00:30
 * mapper接口,相当于dao接口
 * @author fxq
 *
 */
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;
	//删除用户信息
	public void deleteUser(int id) throws Exception;
}

  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.itcast.mybatis.mapper.UserMapper">
	<!-- 在映射文件中配置很多sql语句 -->
	<!-- 需求:通过id查询用户表的记录 -->
	<!-- 通过select执行数据库的查询 -->
	<!-- id:标识映射文件中的sql -->
	<!-- 将sql语句封装到mappedStatement对象中,所以将id成为statement 的id -->

	<select id="findUserById" parameterType="int"
		resultType="cn.itcast.mybatis.po.User">
		select * from USER where id = #{id}
	</select>
	<!-- 自定义条件查询用户列表 -->
	<!-- resultType:指定就是单条记录所映射的java对象类型 -->
	<select id="findUserByName" parameterType="java.lang.String"
		resultType="cn.itcast.mybatis.po.User">
		select * from USER where username like '%${value}%'
	</select>

	<!-- 添加用户 parameterType:指定输入参数类型是pojo(包括:用户信息) #{}中指定pojo的属性名,接收到pojo对象的属性值,mybatis通过OGNL获取对象的属性值; -->
	<insert id="insertUser" parameterType="cn.itcast.mybatis.po.User">
		<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
			SELECT
			LAST_INSERT_ID()
		</selectKey>
		insert into USER (id,username,birthday,sex,address)
		values(#{id},#{username},#{birthday},#{sex},#{address})
	</insert>

	<!-- 删除 -->
	<delete id="deleteUser" parameterType="java.lang.Integer">
		delete from USER WHERE id
		= #{id}
	</delete>
	<!-- 更新 -->
	<update id="updateUser" parameterType="cn.itcast.mybatis.po.User">
		update USER set username =
		#{username},birthday=#{birthday},sex=#{sex},address=#{address} where
		id = #{id}
	</update>
</mapper>

  测试类

package cn.itcast.mybatis.mapper;

import java.io.InputStream;
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.itcast.mybatis.po.User;

public class UserMapperTest {

	private SqlSessionFactory sqlSessionFactory;
	@Before
	public void setUp() throws Exception{
		//创建sqlSessionFactory
		String resource= "SqlMapConfig.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
	}
	
	@Test
	public void testFindUserById() throws Exception {
		
		SqlSession sqlSession = sqlSessionFactory.openSession();
		//创建UserMapper对象,mybatis自动生成mapper代理对象;
		<strong>UserMapper userMapper=sqlSession.getMapper(UserMapper.class);</strong>
		User user = userMapper.findUserById(1);		
		System.out.println(user);
	}

}

三.总结

  mapper代理开发遵循一定的开发规范,减少了错误的概率,提高了开发效率。同时对于数据类型的控制,从原始Dao的运行阶段到了mapper代理的编译阶段,更利于开发。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 28
    评论
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值