mybatis_day02_mapper动态代理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35537301/article/details/82223921

DAO开发方式

使用MyBatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper动态代理开发方法

原始DAO开发

映射文件

<?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:命名空间,作用:1.用于隔离sql 2.使用动态代理开发DAO,namespace必须和Mapper接口类路径一致 -->
<mapper namespace="test">
	<select id="selectUserById" parameterType="Integer" resultType="com.itheima.pojo.User">
		select * from user where id = #{id}
	</select>
	
	<!-- 根据用户名称模糊查询用户信息 -->
	<select id="selectUserByUsername" parameterType="String" resultType="com.itheima.pojo.User">
		select * from user where username like "%"#{username}"%"
	</select>
	
	<!-- 添加用户信息-->
	<insert id="saveUser" parameterType="com.itheima.pojo.User">
		<selectKey keyColumn="id" keyProperty="id" order="AFTER"
			resultType="int">
			SELECT LAST_INSERT_ID()
		</selectKey>
		insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
	</insert>
	
	<!-- 修改用户信息 -->
	<update id="updateUserById" parameterType="com.itheima.pojo.User">
		update user set username = #{username} where id=#{id}
	</update>
	
	<!-- 删除用户 -->
	<delete id="deleteUserById" parameterType="Integer">
		delete from user where id=#{id}
	</delete>
	
</mapper>

接口

package com.itheima.dao;

import java.util.List;

import com.itheima.pojo.User;

public interface UserDao {

	/**
	 * @MethodName:selectUserById
	 * @Description:
	 * @param id
	 * @return
	 */
	public User queryUserById(Integer id);

	/**
	 * @MethodName:selectUserByUsername
	 * @Description:
	 * @param username
	 * @return
	 */
	public List<User> queryUserByUsername(String username);

	/**
	 * @MethodName:saveUser
	 * @Description:
	 * @param user
	 */
	public void addUser(User user);
}

实现类

package com.itheima.dao.impl;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import com.itheima.dao.UserDao;
import com.itheima.pojo.User;

public class UserDaoImpl implements UserDao {

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

	@Override
	public User queryUserById(Integer id) {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		User user = sqlSession.selectOne("test.selectUserById", 27);
		sqlSession.close();
		return user;
	}

	@Override
	public List<User> queryUserByUsername(String username) {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		List<User> list = sqlSession.selectList("test.selectUserByUsername", "小");
		sqlSession.close();
		return list;
	}

	@Override
	public void addUser(User user) {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		sqlSession.insert("test.saveUser", user);
		sqlSession.close();
	}

}

测试类

package com.itheima.test;

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 com.itheima.dao.UserDao;
import com.itheima.dao.impl.UserDaoImpl;
import com.itheima.pojo.User;

public class UserDaoTest {

	private SqlSessionFactory sqlSessionFactory;
	@Before
	public void init() throws Exception {
		String resource = "SqlMapConfig.xml";
		//读取配置文件
		InputStream inputStream = Resources.getResourceAsStream(resource);
		//创建工厂
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
	}

	@Test
	public void selectUserById() throws Exception {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		UserDao userDao = new UserDaoImpl(this.sqlSessionFactory);
		// 执行查询
		User user = userDao.queryUserById(27);
		System.err.println(user);

	}
	
	@Test
	public void selectUserByUsername() throws Exception {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		UserDao userDao = new UserDaoImpl(this.sqlSessionFactory);
		// 执行查询
		List<User> list = userDao.queryUserByUsername("小");
		for (User user : list) {
			System.err.println(user);
		}
	}

}

Mapper动态代理的规范

  • Mapper.xml文件中的namespace与mapper接口的类路径相同。
  • Mapper接口方法名和Mapper.xml中定义的每个statement的id相同
  • Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同
  • Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同

案例

UserMapper.java

package com.itheima.mapper;

import java.util.List;

import com.itheima.pojo.User;

public interface UserMapper {

	/**
	 * @MethodName:selectUserById
	 * @Description:
	 * @param id
	 * @return
	 */
	public User selectUserById(Integer id);
	
	/**
	 * @MethodName:selectUserByUsername
	 * @Description:
	 * @param name
	 * @return
	 */
	public List<User> selectUserByUsername(String name);
	
	/**
	 * @MethodName:saveUser
	 * @Description:
	 * @param user
	 */
	public void saveUser(User user);
	
}

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:命名空间,作用:1.用于隔离sql 2.使用动态代理开发DAO,namespace必须和Mapper接口类路径一致 -->
<mapper namespace="com.itheima.mapper.UserMapper">

	<select id="selectUserById" parameterType="Integer" resultType="com.itheima.pojo.User">
		select * from user where id = #{id}
	</select>
	
	<!-- 根据用户名称模糊查询用户信息 -->
	<select id="selectUserByUsername" parameterType="String" resultType="com.itheima.pojo.User">
		select * from user where username like "%"#{username}"%"
	</select>
	
	<!-- 添加用户信息-->
	<insert id="saveUser" parameterType="com.itheima.pojo.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(#{username},#{birthday},#{sex},#{address})
	</insert>
	
	
</mapper>

 测试类

package com.itheima.test;

import java.io.InputStream;
import java.util.Date;
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.itheima.mapper.UserMapper;
import com.itheima.pojo.User;

public class UserMapperTest {

	private SqlSessionFactory sqlSessionFactory;
	@Before
	public void init() throws Exception {
		String resource = "SqlMapConfig.xml";
		//读取配置文件
		InputStream inputStream = Resources.getResourceAsStream(resource);
		//创建工厂
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
	}
	
	@Test
	public void selectOne() throws Exception {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		UserMapper mapper = sqlSession.getMapper(UserMapper.class);
		
		User user = mapper.selectUserById(1);
		System.err.println(user);
	}
	
	@Test
	public void select() throws Exception {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		UserMapper mapper = sqlSession.getMapper(UserMapper.class);
		
		List<User> list = mapper.selectUserByUsername("小");
		for (User user : list) {
			System.err.println(user);
		}
	}
	
	@Test
	public void save() throws Exception {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		UserMapper mapper = sqlSession.getMapper(UserMapper.class);
		
		User user = new User();
		user.setUsername("阿杰");
		user.setSex("1");
		user.setBirthday(new Date());
		user.setAddress("北京");
		mapper.saveUser(user);
	}

}

总结

selectOne和selectList

动态代理对象调用sqlSession.selectOne()和sqlSession.selectList()是根据mapper接口方法的返回值决定,如果返回list则调用selectList方法,如果返回单个对象则调用selectOne方法。

namespace

mybatis官方推荐使用mapper代理方法开发mapper接口,程序员不用编写mapper接口实现类,使用mapper代理方法时,输入参数可以使用pojo包装对象或map对象,保证dao的通用性

猜你喜欢

转载自blog.csdn.net/qq_35537301/article/details/82223921