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的开发方式,虽然现在不再使用这种方式,但是有的老项目还在使用,所以还是有必要了解一下。