SqlSessionFactory, SqlSession范围和生命周期
在《MyBatis(1)框架原理》 中提到, SqlSessionFactory的作用是加载MyBatis的配置文件并创建SqlSession,而SqlSession的作用则是操作数据库并返回相应的结果。因此:
* SqlSessionFactory
SqlSessionFactory由SqlSessionFactoryBuilder加载配置文件创建。一旦被创建就应该在应用的运行期间一直存在,不需要重复加载配置文件来重新创建它。因此,其生命周期为从应用开始直至应用停止。
* SqlSession
SqlSession的实例在MyBatis中不是线程安全的,因此在每一次请求时,都需要新建一个SqlSession来响应请求。其生命周期为方法范围内。但是在每一次请求结束后,都需要关闭此SqlSession。
DAO接口开发
以下程序是在《 MyBatis(4)MyBatis入门程序 》 的基础上修改而来的。如果你没有从前面博客看过来,可以去《 MyBatis(4)MyBatis入门程序 》 中下载代码然后对照修改即可。
需求分析
对数据库中的用户表进行按ID查询、按用户名模糊查询、插入新用户、按ID删除用户、更新指定用户信息。
需求设计
在《 MyBatis(4)MyBatis入门程序 》 中,我们已经完成了以上需求的简单设计。在此,直接设计DAO接口以及实现DAO接口。
DAO接口
public interface UserDao {
public List<UserPojo> selectUser () throws Exception;
public UserPojo selectUserByID (int id) throws Exception;
public List<UserPojo> selectUserByName (String name) throws Exception;
public int insertUser (UserPojo user) throws Exception;
public void delUserByID (int id) throws Exception;
public void updateUser (UserPojo user) throws Exception;
}
DAO接口实现
1、注入SqlSessionFactory
public class UserDaoImpl implements UserDao {
private SqlSessionFactory sqlSessionFactory;
public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
}
2、根据ID查询用户
@Override
public UserPojo selectUserByID(int id) throws Exception {
//创建SqlSession
SqlSession sqlSession = null;
try {
sqlSession = sqlSessionFactory.openSession();
//通过sqlSession操作数据库
return sqlSession.selectOne("mybatisDemo1.selectUserByID", id);
} finally {
if (null != sqlSession) {
//释放资源
sqlSession.close();
}
}
}
3、根据用户名模糊查找
@Override
public List<UserPojo> selectUserByName(String name) throws Exception {
//创建SqlSession
SqlSession sqlSession = null;
try {
sqlSession = sqlSessionFactory.openSession();
//通过sqlSession操作数据库
return sqlSession.selectList("mybatisDemo1.selectUserByName", name);
} finally {
if (null != sqlSession) {
//释放资源
sqlSession.close();
}
}
}
4、新增加用户
@Override
public int insertUser(UserPojo user) throws Exception {
//创建SqlSession
SqlSession sqlSession = null;
try {
sqlSession = sqlSessionFactory.openSession();
//通过sqlSession操作数据库
sqlSession.insert("mybatisDemo1.insertUser", user);
sqlSession.commit();
return user.getId();
} finally {
if (null != sqlSession) {
//释放资源
sqlSession.close();
}
}
}
5、按ID删除用户
@Override
public void delUserByID(int id) throws Exception {
//创建SqlSession
SqlSession sqlSession = null;
try {
sqlSession = sqlSessionFactory.openSession();
//通过sqlSession操作数据库
sqlSession.delete("mybatisDemo1.delUserByID", id);
sqlSession.commit();
} finally {
if (null != sqlSession) {
//释放资源
sqlSession.close();
}
}
}
6、更新指定用户信息
@Override
public void updateUser(UserPojo user) throws Exception {
//创建SqlSession
SqlSession sqlSession = null;
try {
sqlSession = sqlSessionFactory.openSession();
sqlSession.update("mybatisDemo1.updateUser", user);
sqlSession.commit();
} finally {
if (null != sqlSession) {
//释放资源
sqlSession.close();
}
}
}
测试
见代码(代码地址在最下面)
DAO接口开发总结
1、在每一个需求设计的过程中,可以看到有很多的模板代码。如:
sqlSession = sqlSessionFactory.openSession();
sqlSession.commit();
if (null != sqlSession) {
//释放资源
sqlSession.close();
}
2、在SqlSession调用各个方法操作数据库时,由于MyBatis是采用泛型的设计,在传入参数时,如果类型与SQL映射语句中的参数类型不一致,在编译阶段也不会有提示错误,一定要等到运行阶段。
代码
1、git@code.csdn.net:xl890727/mybatisdemo.git
2、https://code.csdn.net/xl890727/mybatisdemo.git
中得dao分支