为了引出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的代理模式很好的解决了这一问题。