传统Dao封装与动态代理Dao封装

使用到的工具类

package com.java.utils;

import java.io.IOException;
import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class MybatisUtils {
	
	private static SqlSessionFactory sqlSessionFactory;
	
	static {
		try {
			//创建SqlSessionFactoryBuilder对象
			SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
			//创建核心配置文件的输入流
			InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
			//通过输入流创建SqlSessionFactory对象
			sqlSessionFactory = ssfb.build(inputStream);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	//获取SqlSessionFactory
	public static SqlSessionFactory getSqlSessionFactory() {
		return sqlSessionFactory;
	}
	
}

一、原始Dao开发方法

新建个UserDao接口
public interface UserDao {
	
	/**根据用户ID查询用户信息
	 * @param id
	 * @return
	 */
	User getUserById(Integer id);
	
	/**
	 * 根据用户名查找用户列表
	 * @param name
	 * @return
	 */
	List<User> getUserByUserName(String name);
	
	/**
	 * 添加用户
	 * @param user
	 */
	void insertUser(User user);
}

创建一个UserDaoImpl 实现UserDao方法

public class UserDaoImpl implements UserDao {

	@Override
	public User getUserById(Integer id) {
		SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession();
		User user = sqlSession.selectOne("user.getUserById", id);
		sqlSession.close();
		return user;
	}

	@Override
	public List<User> getUserByUserName(String name) {
		SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession();
		List<User> list = sqlSession.selectList("user.getUserByName", name);
		sqlSession.close();
		return list;
	}

	@Override
	public void insertUser(User user) {
		SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession();
		sqlSession.insert("user.insertUser", user);
		sqlSession.commit();
		sqlSession.close();
	}

}

使用测试类

public class UserDaoTest {

	@Test
	public void testGetUserById() {
		UserDao userDao = new UserDaoImpl();
		User user = userDao.getUserById(30);
		System.out.println(user);
	}

	@Test
	public void testGetUserByUserName() {
		UserDao userDao = new UserDaoImpl();
		List<User> list = userDao.getUserByUserName("张");
		for (User user : list) {
			System.out.println(user);
		}
	}

	@Test
	public void testInsertUser() {
		UserDao userDao = new UserDaoImpl();
		User user = new User();
		user.setUsername("张飞3");
		user.setPassword("fgaseeogi");
		userDao.insertUser(user);
	}

}

二、动态代理Dao

(1)动态代理dao开发规则

1、namespace必需是接口的全路径名
2、接口的方法名必需与映射文件的sql id一致
3、接口的输入参数必需与映射文件的parameterType类型一致
4、接口的返回类型必须与映射文件的resultType类型一致

(2)动态代理dao开发步骤

1、创建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">

	<!-- 
		动态代理开发规则
		1、namespace必须是接口的全路径名
		2、接口的方法名必须与sql的id一致
		3、接口的入参必须与parameterType类型一致
		4、接口的返回值必须与resultType一致
	 -->

<mapper namespace="com.java.mapper.UserMapper" >
	<!-- id:方法名
		parameterType:定义参数类型
		resultType:返回值类型. 如果方法返回值是 list,在 resultType 中写 List 的泛型,
		因为 mybatis
		对 jdbc 封装,一行一行读取数据
	-->
    <select id="getUserById" parameterType="int" resultType="com.java.pojo.User">
	    <!-- #{id}相当于jdbc的问号? -->
	    select id,username,password from stus where id = #{id}
    </select>
    
    <select id="getUserByUsername" parameterType="string" resultType="com.java.pojo.User">
	    <!-- ${}:字符串拼接指令,如果入参为普通数据类型,括号里面只能写value -->
	    select id,username,password from stus where username like '%${value}%'
    </select>
    
    <insert id="insertUser" parameterType="com.java.pojo.User">
    	INSERT INTO `php`.`stus`(`username`, `password`) VALUES (#{username}, #{password});
    </insert>
    
</mapper>

2、创建UserMapper接口

package com.java.mapper;

import java.util.List;
import com.java.pojo.User;

public interface UserMapper {
	/*
	 * 根据id查询用户信息
	 */
	User getUserById(Integer id);
	
	/*
	 * 模糊查询
	 */
	List<User> getUserByUsername(String userName);
	
	/*
	 * 增加用户
	 */
	void insertUser(User user);
}

3、加载UserMapper.xml

<mappers>
		加载映射文件
		<mapper resource="mybatis/UserMapper.xml"/>
	</mappers>

测试类

package com.java.text;

import java.util.List;
import org.apache.ibatis.session.SqlSession;
import com.java.mapper.UserMapper;
import com.java.pojo.User;
import com.java.utils.MybatisUtils;

public class MapperUserTest {
	
	public void testGetById() {
		SqlSession session = MybatisUtils.getSqlSessionFactory().openSession();
		//获取接口的代理实现类
		UserMapper userMapping = session.getMapper(UserMapper.class);
		User user = userMapping.getUserById(21);
		System.out.println(user);
		session.close();
	}
	
	public void testGetByUserName() {
		SqlSession session = MybatisUtils.getSqlSessionFactory().openSession();
		//获取接口的代理实现类
		UserMapper userMapping = session.getMapper(UserMapper.class);
		List<User> user = userMapping.getUserByUsername("l");
		for (User user2 : user) {
			System.out.println(user2);
		}
		session.close();
	}
	
	public void testInsertUser() {
		SqlSession session = MybatisUtils.getSqlSessionFactory().openSession();
		//获取接口的代理实现类
		UserMapper userMapping = session.getMapper(UserMapper.class);
		User user = new User();
		user.setId(23);
		user.setUsername("林嘉");
		user.setPassword("fjdasioef");
		userMapping.insertUser(user);
		session.commit();
		session.close();
	}
	
	public static void main(String[] args) {
		MapperUserTest demo = new MapperUserTest();
		demo.testInsertUser();
	}
}

传统的Dao:需要创建一个实现类来实现Dao接口,然后在测试类调用实现类来实现数据库的增删改查
动态代理Dao:不需要创建类来实现Dao接口,直接在测试类使用UserMapper userMapping = session.getMapper(UserMapper.class); 来实现数据库增删给查操作

猜你喜欢

转载自blog.csdn.net/Woo_home/article/details/89448250
DAO
今日推荐