mybatis学习记录------4

一 mybatis开发dao的方法

1 SqlSessionFactoryBuilder:

通过SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory,将SqlSessionFactoryBuilder当成一个工具类使用即可,不需要使用单例管理SqlSessionFactoryBuilder。在需要创建SqlSessionFactory时候,只需要new一次SqlSessionFactoryBuilder即可。

2 SqlSessionFactory 

通过SqlSessionFactory创建SqlSession,使用单例模式管理sqlSessionFactory(工厂一旦创建,使用一个实例)。将来mybatisspring整合后,使用单例模式管理sqlSessionFactory

3 SqlSession

SqlSession是一个面向用户(程序员)的接口。SqlSession中提供了很多操作数据库的方法:如:selectOne(返回单个对象)selectList(返回单个或多个对象)。SqlSession是线程不安全的,在SqlSesion实现类中除了有接口中的方法(操作数据库的方法)还有数据域属性。

SqlSession最佳应用场合在方法体内,定义成局部变量使用。

二 原始dao开发方法(程序员需要些dao接口和dao实现类)

1 在src文件夹下新建dao包,在包内新建接口userDao

package pers.czs.mybatis.dao;

import pers.czs.mybatis.po.User;

public interface userDao {
    //根据id查询用户信息
    public User findUserById(int id) throws Exception;
    
    //添加用户
    public void insertUser(User user) throws Exception;
    
    //删除用户
    public void deleteUser(int id) throws Exception;
}

2 在dao包内新建接口实现类userDaoImpl

package pers.czs.mybatis.dao;

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

import pers.czs.mybatis.po.User;

public class userDaoImpl implements userDao{
    
    //需要向dao实现类中注入SqlSessionFactory
    //这里通过构造方法注入
    private SqlSessionFactory sqlSessionFactory;
    public userDaoImpl(SqlSessionFactory sqlsessionFactory) {
        this.sqlSessionFactory = sqlsessionFactory;
    }
    
    @Override
    public User findUserById(int id) throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        User user = sqlSession.selectOne("test.findUserById",29);
        sqlSession.close();
        return user;
    }

    @Override
    public void insertUser(User user) throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        sqlSession.insert("test.insertUser", user);
        sqlSession.commit();
        sqlSession.close();
    }

    @Override
    public void deleteUser(int id) throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        sqlSession.insert("test.deleteUser", id);
        sqlSession.commit();
        sqlSession.close();
    }
    
}

3 新建测试类userDaoImplTest

package pers.czs.mybatis.first;

import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import pers.czs.mybatis.dao.userDao;
import pers.czs.mybatis.dao.userDaoImpl;

public class userDaoImplTest {
    
    @Test
    public void testFindUserByid() throws Exception {
        //Mybatis配置文件
        String resource = "SqlMapConfig.xml";
        //得到配置文件流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //创建会话工厂,传入配置文件信息
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        
        //创建userDao对象
        userDao dao = new userDaoImpl(sqlSessionFactory);
        
        //调用userDao的方法
        System.out.println(dao.findUserById(29));
    }
}

4 执行结果

4 原始dao开发问题

dao接口实现类方法中存在大量模板方法,设想能否将这些代码提取出来,大大减轻程序员的工作量。

调用sqlsession方法时将statementid硬编码了

调用sqlsession方法时传入的变量,由于sqlsession方法使用泛型,即使变量类型传入错误,在编译阶段也不报错,不利于程序员开发。

猜你喜欢

转载自www.cnblogs.com/czsy/p/10355960.html
今日推荐