Mybatis框架|原始dao开发方式


为了引出Mybatis的代理模式,先在Mybatis中使用原始dao开发方式进行操作。下面的代码演示了对数据库进行了一次查询和一次添加操作。

文章使用的数据库表仍然为之前测试时使用的user表—Mybatis框架|更新与删除

一、User.xml配置(增/查标签)

本次演示只使用到sql1查询标签,sql3增加标签。

<?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="test">
	<select id="sql1" parameterType="int" resultType="com.gql.pojo.User">
		SELECT id,username as name,sex,address,birthday FROM user WHERE id = #{id};
	</select>

	<insert id="sql3" parameterType="com.gql.pojo.User">
		<selectKey keyProperty="id" order="AFTER" resultType="int">
			select last_insert_ID();
		</selectKey>
		
		insert into user
		(username,sex,address,birthday)
		values(#{name},#{sex},#{address},#{birthday});
	</insert>
</mapper>

二、UserDao接口

定义两个方法进行测试,getUserById(int id);通过id进行查询和saveUser(User user);保存对象。

package com.gql.dao;

import com.gql.pojo.User;
/**
 * 类说明:
 *		dao层接口
 * @guoqianliang1998.
 */
public interface UserDao {
	User getUserById(int id);
	void saveUser(User user);
}

三、UserDaoImp实现类

一个需要注意的问题:下面的代码中会话工厂SqlSessionFactory只创建了一个,所以就会出现多线程访问并发的安全问题,所以session在方法体内应用,规避此问题。

package com.gql.dao;

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

import com.gql.pojo.User;
/**
 * 类说明:
 *		dao层实现了类
 * @guoqianliang1998.
 */
public class UserDaoImp implements UserDao{

	private SqlSessionFactory sqlSessionFactory;
	//通过构造函数传递会话工厂对象
	public UserDaoImp(SqlSessionFactory sqlSessionFactory) {
		super();
		this.sqlSessionFactory = sqlSessionFactory;
	}

	@Override
	public User getUserById(int id) {
		SqlSession session = sqlSessionFactory.openSession();
		User user = session.selectOne("test.sql1",id);
		return user;
	}

	@Override
	public void saveUser(User user) {
		SqlSession session = sqlSessionFactory.openSession();
		session.insert("test.sql3",user);
		session.commit();
	}
}

四、原始dao开发测试

package com.gql.dao;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import com.gql.pojo.User;

/**
 * 类说明:
 *		测试原始dao开发方式
 * @guoqianliang1998.
 */
public class UserDaoTest {
	//创建会话工厂
	private SqlSessionFactory sqlSessionFactory;
	@Before
	public void init() throws IOException{
		String resource = "mybatis-config.xml";
		InputStream in = Resources.getResourceAsStream(resource);
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);		
	}
	
	@Test
	public void testGetUserById(){
		UserDao userDao = new UserDaoImp(sqlSessionFactory);
		User user = userDao.getUserById(1);
		System.out.println(user.getName());
	}
	
	@Test
	public void testSaveUser(){
		UserDao userDao = new UserDaoImp(sqlSessionFactory);
		User user = new User();
		user.setName("钟南山院士");
		user.setSex("男");
		user.setAddress("北京");
		user.setBirthday(new Date());
		userDao.saveUser(user);
	}
}

分别运行两次测试,成功根据id获得查询结果,并且成功插入一条记录。
在这里插入图片描述

在这里插入图片描述

五、原始dao开发方式的弊端

  • 原始dao开发代码重复率高。
  • Java代码中存在硬编码,不利于系统维护。

针对这些缺点,Mybatis的代理模式很好的解决了这一问题。

发布了413 篇原创文章 · 获赞 1081 · 访问量 23万+

猜你喜欢

转载自blog.csdn.net/weixin_43691058/article/details/104230208