一、思路
程序员需要写dao接口和dao实现类。
需要向dao实现类中注入SqlSessionFactory,在方法体内通过SqlSessionFactory创建SqlSession。
二、dao接口
新建dao接口,代码如下:
package cn.sunft.mybatis.dao;
import cn.sunft.mybatis.po.User;
/**
* Dao接口,用户
*/
public interface UserDao {
//根据id查询用户信息
public User findUserById(int id) throws Exception;
//添加用户信息
public void insertUser(User user) throws Exception;
//删除用户信息
public void deleteUserById(int id) throws Exception;
}
三、dao接口实现类
package cn.sunft.mybatis.dao;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import cn.sunft.mybatis.po.User;
/**
* 用户接口实现类
*/
public class UserDaoImpl implements UserDao {
private SqlSessionFactory sqlSessionFactory;
//需要向dao实现类中注入SqlSessionFactory
//这里通过构造方法注入
public UserDaoImpl(SqlSessionFactory sqlSessionFactory){
this.sqlSessionFactory = sqlSessionFactory;
}
/**
* 根据id查询用户
*/
public User findUserById(int id) throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
User user = sqlSession.selectOne("test.findUserById", id);
//释放资源
sqlSession.close();
return user;
}
/**
* 插入用户
*/
public void insertUser(User user) throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
sqlSession.insert("test.insertUser", user);
//提交事务
sqlSession.commit();
//释放资源
sqlSession.close();
}
/**
* 删除用户
*/
public void deleteUserById(int id) throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行插入操作
sqlSession.delete("test.deleteUser", id);
//提交事务
sqlSession.commit();
//释放资源
sqlSession.close();
}
}
四、编写测试类进行测试
package cn.sunft.mybatis.dao;
import static org.junit.Assert.fail;
import java.io.InputStream;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import cn.sunft.mybatis.po.User;
public class UserDaoImplTest {
private SqlSessionFactory sqlSessionFactory;
private UserDao userDao;
/**
* 在执行测试方法之前初始化sqlSessionFactory
* @throws Exception
*/
@Before
public void setUp() throws Exception {
//创建sqlSessionFactory
//mybatis配置文件
String resource = "SqlMapConfig.xml";
//得到配置文件,与路径解耦
InputStream inStream = this.getClass()
.getClassLoader().getResourceAsStream(resource);
//创建会话工厂,传入mybatis的配置文件信息
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inStream);
userDao = new UserDaoImpl(sqlSessionFactory);
}
@Test
public void testFindUserById() throws Exception {
User user = userDao.findUserById(1);
System.out.println(user);
}
@Test
public void testInsertUser() {
fail("Not yet implemented");
}
@Test
public void testDeleteUserById() {
fail("Not yet implemented");
}
}
这里只是测试了findUserById方法。
五、总结原始dao开发问题
1、dao接口实现类方法中存在大量的模板方法,设想能否将这些代码提取出来,大大减轻程序员的工作量。
2、调用sqlsession方法时将statement的id硬编码了。
3、调用sqlsession方法时传入的变量,由于sqlsession方法使用泛型,即使变量类型传入错误,在编译阶段也不报错,不利于程序员开发。