原始的Ibatis基于接口和实现类的开发方式——MyBatis的第一种开发方式

MyBatis有两种开发方式

1. 原始的Ibatis接口实现类的方式

通过SqlSessionFactory创建SqlSession来调用增删改查接口,操作statement的id硬编码来实现,**老项目常用这种方式**。 缺点:重复代码过多,操作statement的id硬编码将来影响维护。

2. 基于mapper的动态代理的开发方式

mybatis根据一些规则自动创建接口的实现类的代理对象,通过sqlSession.getMapper(xxx.class)的方式获取mapper的代理对象,调用相应的接口来执行增删改查,**新项目使用这种方式**。 优点:无需写实现类(自动生成代理),重复代码量减少,便于维护。

本篇介绍第一种:原始的Ibatis接口实现类的开发方式。

IUserDao接口如下:

package com.lyu.mybatis.sysmanage.dao;

import java.util.List;

import com.lyu.mybatis.sysmanage.entity.User;

/**
 * 类名称: 用户增删改查dao接口
 * 类描述: 对用户的增伤改查
 * 全限定性类名: com.lyu.mybatis.sysmanage.dao.IUserDao
 * @author MrQuJL
 * @date 2018年1月22日 下午8:47:48
 * @version V1.0
 */
public interface IUserDao {
	
	/**
	 * 根据用户id查询用户信息
	 * @param 
	 * @return
	 */
	public User getUserById(Long userId);
	
	/**
	 * 获取所有用户对象
	 * @param 
	 * @return
	 */
	public List<User> getUserList();
	
	/**
	 * 增加用户对象
	 * @param 
	 * @return
	 */
	public int addUser(User user);
	
	/**
	 * 删除用户对象
	 * @param 
	 * @return
	 */
	public int delUser(User user);
	
	/**
	 * 修改用户对象
	 * @param 
	 * @return
	 */
	public int updateUser(User user);
	
}

接口的实现类如下:

在UserDao中设置私有变量SqlSessionFactory,在与spring整合的时候,委托给spring进行注入,这里模拟一下:通过构造函数,外部调用的时候注入SqlSessionFactory。
在调用相应的statement(sql)时的形式为:namespace.id
例:user.getUserById

package com.lyu.mybatis.sysmanage.dao.impl;

import java.util.List;

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

import com.lyu.mybatis.sysmanage.dao.IUserDao;
import com.lyu.mybatis.sysmanage.entity.User;

/**
 * 类名称: 用户dao接口的实现类
 * 类描述: 用于操作用户数据
 * 全限定性类名: com.lyu.mybatis.sysmanage.dao.impl.UserDao
 * @author MrQuJL
 * @date 2018年1月22日 下午8:51:57
 * @version V1.0
 */
public class UserDao implements IUserDao {
	
	// 在与spring整合的时候,委托给spring管理,@Autowired自动装配一下就ok了
	private SqlSessionFactory sqlSessionFactory;
	
	public UserDao(SqlSessionFactory sqlSessionFactory) {
		this.sqlSessionFactory = sqlSessionFactory;
	}
	
	@Override
	public User getUserById(Long userId) {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		User user = sqlSession.selectOne("user.getUserById", 1L);
		sqlSession.close();
		return user;
	}
	
	@Override
	public List<User> getUserList() {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		List<User> userList = sqlSession.selectList("user.getUserList");
		sqlSession.close();
		return userList;
	}
	
	@Override
	public int addUser(User user) {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		int rows = sqlSession.insert("user.addUser", user);
		sqlSession.commit();
		sqlSession.close();
		return rows;
	}
	
	@Override
	public int delUser(User user) {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		int rows = sqlSession.delete("user.delUser", user);
		sqlSession.commit();
		sqlSession.close();
		return rows;
	}
	
	@Override
	public int updateUser(User user) {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		int rows = sqlSession.update("user.updateUser", user);
		sqlSession.commit();
		sqlSession.close();
		return rows;
	}
}

mapper的配置如下:

注:这里因为没有使用动态代理,所以mapper的namespace不需要和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">
<mapper namespace="user">

	<!-- 用户表的所有字段 -->
	<sql id="all_user_columns">
		user_id userId, user_name userName, login_name, birthday, tv_update
	</sql>
	
	<!-- 
		1: id相当于statement对象(sql句柄)
		2: parameterType:输入参数的类型,在sql语句中通过占位符#{}来接收
		3: resultType:sql操作返回的结果类型
	 -->
	<select id="getUserById" parameterType="long" resultType="user">
		select <include refid="all_user_columns" />
		from user where user_id = #{id}
	</select>
	
	<select id="getUserList" resultType="user">
		select <include refid="all_user_columns" />
		from user
	</select>
	
	<insert id="addUser" parameterType="user">
		insert into user(user_id, user_name, login_name, password,
		dept_id, birthday, tv_update)
		values(#{userId}, #{userName}, #{loginName}, #{password}, 
		#{deptId}, #{birthday}, #{tvUpdate})
	</insert>
	
	<delete id="delUser" parameterType="user">
		delete from user where user_id = #{userId}
	</delete>
	
	<update id="updateUser" parameterType="user">
		update user set
		user_name = #{userName},
		login_name = #{loginName},
		password = #{password},
		dept_id = #{deptId},
		birthday = #{birthday},
		tv_update = #{tvUpdate}
		where user_id = #{userId}
	</update>
	
</mapper>

测试类如下:

注:下面的代码是直接调dao接口,实际开发中是通过service调接口的。

package com.lyu.mybatis.sysmanage.test;

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

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.lyu.mybatis.sysmanage.dao.IUserDao;
import com.lyu.mybatis.sysmanage.dao.impl.UserDao;
import com.lyu.mybatis.sysmanage.entity.User;

/**
 * 类名称: Ibatis测试类
 * 类描述: 用于测试Ibatis
 * 全限定性类名: com.lyu.mybatis.sysmanage.test.IbatisTest
 * @author MrQuJL
 * @date 2018年1月22日 下午9:45:44
 * @version V1.0
 */
public class IbatisTest {

	private SqlSessionFactory sqlSessionFactory = null;
	
	@Before
	public void init() throws IOException {
		// 1.读取mybatis的主配置文件
		String configFile = "mybatis-cfg.xml";
		InputStream is = Resources.getResourceAsStream(configFile);
		
		// 2.通过SqlSessionFactoryBuilder创建一个SqlSessFactory
		this.sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
	}
	
	// 根据用户id获取用户
	@Test
	public void testGetUserById() {
		IUserDao userDao = new UserDao(sqlSessionFactory);
		User user = userDao.getUserById(1L);
		System.out.println(user);
	}
	
	// 获取所有的用户对象
	@Test
	public void testGetUserList() {
		IUserDao userDao = new UserDao(sqlSessionFactory);
		List<User> userList = userDao.getUserList();
		System.out.println(userList.size());
	}
	
	// 增加用户
	@Test
	public void testAddUser() {
		IUserDao userDao = new UserDao(sqlSessionFactory);
		User user = new User();
		user.setUserName("小王vvvv");
		user.setLoginName("logo");
		int rows = userDao.addUser(user);
		System.out.println(rows);
	}
	
	// 删除用户
	@Test
	public void testDelUser() {
		IUserDao userDao = new UserDao(sqlSessionFactory);
		User user = new User();
		user.setUserId(22L);
		int rows = userDao.delUser(user);
		System.out.println(rows);
	}
	
	// 修改用户
	@Test
	public void testUpdateUser() {
		IUserDao userDao = new UserDao(sqlSessionFactory);
		User user = new User();
		user.setUserId(24L);
		user.setUserName("小vvv");
		user.setLoginName("logo");
		int rows = userDao.updateUser(user);
		System.out.println(rows);
	}
}

总结:上面的dao层实现类的写法就(调用SqlSession的方法来增删改查)是原始的Ibatis的开发方式,虽然现在不再使用这种方式,但是有的老项目还在使用,所以还是有必要了解一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值