Mybatis学习笔记(五)--mapper动态代理

版权声明:版权归JansonLin所有,转载请标明出处。 https://blog.csdn.net/Janson_Lin/article/details/83824200

Mapper介绍

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的类型相同、

Mapper编写

定义mapper映射文件UserMapper.xml和UserMapper接口

将UserMapper.xml放在mapper目录下,效果如下:

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">
<mapper namespace="com.janson.mapper.UserMapper">
	<!-- 查找用户 -->
	<!-- 
		属性:
			id:声明的唯一标识
			paramterType:传入参数类型
			resultType:返回值的类型
	 -->
	<select id="findById" parameterType="Integer" resultType="User">
		select * from user where id=#{v}
	</select>
	
	<!-- 通过名字模糊搜索用户 -->
	<select id="findUserByName" parameterType="String" resultType="User">
		select * from user where username like "%"#{v}"%"
	</select>
	
	<!-- 添加用户 -->
	<insert id="insertUser" parameterType="User">
		<selectKey keyProperty="id" resultType="Integer" order="AFTER">
		<!-- 这里是查找出最新插入数据库中的一ID值 -->
			select LAST_INSERT_ID()
		</selectKey>
		insert into user(username,sex,birthday,address) values(#{username},#{sex},#{birthday},#{address})
	</insert>
	
	<!-- 修改用户 -->
	<update id="updateUser" parameterType="User">
		update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}
	</update>
	
	<!-- 删除用户 -->
	<delete id="deleteUser" parameterType="Integer">
		delete from user where id = #{id}
	</delete>

</mapper>

这里的xml文件使用了别名,在这里介绍一下别名的书写,在SqlMapConfig.xml中配置<typeAliases>属性,注意这个属性不能在<properties>属性之前(<properties>是配置jdbc这类文件的标签)

<!-- 配置别名 -->
<typeAliases>
	<package name="com.janson.pojo"/>
</typeAliases>

package中可以配置类的路径,不过这里建议使用配用包名,这样在这个包下面的所有类就自动配上别名了,例如User.java这个类,我们的别可以使用user和User这两个都可以。

UserMapper.java

package com.janson.mapper;

import java.util.List;

import com.janson.pojo.User;

public interface UserMapper {
	//1.名字与xml中的id相同
	//2.返回值类型与xml中的resultType相同
	//3.传入的参数类型与xml中的parameterType相同
	//接口的名字要与xml的名字相同
	public User findById(Integer id);
	
	public List<User> findUserByName(String name);
	
	public void insertUser(User user);
	
	public void updateUser(User user);
	
	public void deleteUser(Integer id);
}

测试代码

package com.janson.test;

import java.io.IOException;
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.Test;

import com.janson.mapper.UserMapper;
import com.janson.pojo.User;

public class MybatisMapperTest {

	@Test
	public void findById() throws IOException {
		String resource = "sqlMapConfig.xml";
		InputStream inputStream = 
				Resources.getResourceAsStream(resource);
		//创建sqlsessoionFactory
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 
		
		//创建sqlsession
		SqlSession session = sqlSessionFactory.openSession();
		
		UserMapper userMapper = session.getMapper(UserMapper.class);
		User user = userMapper.findById(1);
		System.out.println(user);
	}
	
	@Test
	public void findByNameTest() throws Exception {
		//加载配置文件
		String resource = "sqlMapConfig.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		//创建sqlsessoionFactory
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 
		//创建sqlsession
		SqlSession session = sqlSessionFactory.openSession();
		UserMapper mapper = session.getMapper(UserMapper.class);
		List<User> list = mapper.findUserByName("janson");
		for (User user : list) {
			System.out.println(user);
		}
	}
	
	//添加用户
	@Test
	public void insertUserTest() throws Exception {
		//加载配置文件
		String resource = "sqlMapConfig.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		//创建sqlsessoionFactory
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 
		//创建sqlsession
		SqlSession session = sqlSessionFactory.openSession();
		UserMapper mapper = session.getMapper(UserMapper.class);
		User user = new User();
		user.setAddress("111");
		user.setUsername("linjanson");
		user.setSex("男");
		user.setBirthday(new Date());
		mapper.insertUser(user);
		session.commit();
		System.out.println(user.getId());
	}
	
	//修改用户
	@Test
	public void updateUserTest() throws Exception {
		//加载配置文件
		String resource = "sqlMapConfig.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		//创建sqlsessoionFactory
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 
		//创建sqlsession
		SqlSession session = sqlSessionFactory.openSession();
		UserMapper mapper = session.getMapper(UserMapper.class);
		User user = new User();
		user.setId(29);
		user.setAddress("22222");
		user.setUsername("jansonlin");
		user.setSex("男");
		user.setBirthday(new Date());
		mapper.updateUser(user);
		session.commit();
		System.out.println(user.getId());
	}
	
	//删除用户
	@Test
	public void deleteUserTest() throws Exception {
		//加载配置文件
		String resource = "sqlMapConfig.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		//创建sqlsessoionFactory
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 
		//创建sqlsession
		SqlSession session = sqlSessionFactory.openSession();
		UserMapper mapper = session.getMapper(UserMapper.class);
		mapper.deleteUser(29);
		session.commit();
		
	}
}

mapper动态代理编程比原始的Dao编程快捷,方便,建议使用mapper动态编程。

猜你喜欢

转载自blog.csdn.net/Janson_Lin/article/details/83824200