Marco de Mybatis -----> (3) Comparación del análisis de objetos Mybatis, el desarrollo de Dao tradicional y el desarrollo de Dao del agente dinámico

Uno, análisis de objetos Mybatis

1. Varias clases de uso común
(1) Clase de recursos
  • Responsable de leer el archivo de configuración principal
InputStream in = Resources.getResourceAsStream("mybatis.xml");
(2) Clase SqlSessionFactoryBuilder
  • Utilizarconstruir( ) El método crea un objeto SqlSessionFactory. Generalmente, el objeto SqlSessionFactoryBuilder se crea como un objeto local dentro del método. El método finaliza y el objeto se destruye.
//3.创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder builder  = new SqlSessionFactoryBuilder();
//4.创建SqlSessionFactory对象
SqlSessionFactory factory = builder.build(in);
(3) Interfaz SqlSessionFactory
  • Para crear una SqlSession, debe utilizar la interfaz SqlSessionFactory openSession () método.
SqlSession sqlSession = factory.openSession();
  • openSession (verdadero): crea una SqlSession con función de envío automático
  • openSession (falso): para crear una SqlSession con función de envío no automático, debe enviarla manualmente
  • openSession () : 同 openSession (falso)
(4) interfaz SqlSession
  • Define métodos para manipular datos como selectOne (), selectList (), insert (), update (), delete (), commit (), rollback ()

El objeto SqlSession no es seguro para subprocesos y debe usarse dentro del método. Antes de ejecutar la instrucción SQL, use openSession () para obtener el objeto SqlSession. Es necesario llamar al método close () después de que se ejecute la instrucción SQL, para garantizar que su uso sea seguro para subprocesos.

2. Herramientas (MyBatisUtil)
public class MyBatisUtil {
    
    

    private static SqlSessionFactory factory = null;
    static {
    
    
        try {
    
    
            String config="mybatis.xml";
            //读取配置文件
            InputStream in = Resources.getResourceAsStream(config);
            //创建SqlSessionFactory对象
            factory = new SqlSessionFactoryBuilder().build(in);
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
    }

    /**
     * 获取SqlSession对象
     */
    public static SqlSession getSqlSession(){
    
    
        SqlSession sqlSession = null;
        if (factory != null){
    
    
            sqlSession = factory.openSession();
        }
        return sqlSession;
    }
}

2. Desarrollo de Dao tradicional y desarrollo de Dao del agente dinámico de MyBatis

1. Desarrollo tradicional del Dao
  • Utilice principalmente la clase de implementación de la interfaz Dao para operar la base de datos
(1) Cree una clase de implementación de interfaz Dao
public class StudentDaoImp implements StudentDao
(2) Implementar métodos en la interfaz
**
 * 查询
 * @return
 */
@Override
public List<Student> selectStudens() {
    
    
    //获取SqlSession对象
    SqlSession sqlSession = MyBatisUtil.getSqlSession();

    //6.【重要】指定要执行的SQL语句的标识,sql映射文件中的namespace+"."+标签的id值
    String sqlId = "com.hcz.dao.StudentDao"+"."+"selectStudens";
    //7.【重要】执行SQL语句,通过sqlId找到语句
    List<Student> studentList = sqlSession.selectList(sqlId);
    //9.关闭连接
    sqlSession.close();
    return studentList;
}

/**
 * 插入
 * @param student
 * @return
 */
@Override
public int insertStudent(Student student) {
    
    
    //获取SqlSession对象
    SqlSession sqlSession = MyBatisUtil.getSqlSession();
    String sqlId="com.hcz.dao.StudentDao"+"."+"insertStudent";
    //执行sql语句, 使用SqlSession类的方法
    int nums = sqlSession.insert(sqlId,student);
    //提交事务
    sqlSession.commit();
    //关闭
    sqlSession.close();
    return nums;
}
(3) Definir el método de prueba
@Test
public void testSelectStudents(){
    
    
    StudentDao dao = new StudentDaoImp();
    List<Student> studentList = dao.selectStudens();
    for (Student student:studentList){
    
    
        System.out.println(student);
    }
}

@Test
public void testInsertStudent(){
    
    
    StudentDao dao = new StudentDaoImp();
     Student student = new Student();
     student.setId(1006);
     student.setName("李刚");
     student.setEmail("[email protected]");
     student.setAge(26);
    int result = dao.insertStudent(student);
    System.out.println("添加对象的数据为:"+result);
}

análisis:

StudentDao dao = new StudentDaoImp();
List<Student> studentList = dao.selectStudens();

1. Objeto Dao, el tipo es StudentDao, el nombre completo es:com.hcz.dao.StudentDaoEs el mismo que el espacio de nombres del archivo de mapeo
2. Llamado por daoselectStudents ()El método es el mismo que el valor de id en el archivo de mapeo.
3. El valor de retorno del método en dao también puede determinar el método SqlSession que será llamado por Mybatis:
(1) Si el valor de retorno es List, SqlSession.selectList () se llama al método
(2) Si el valor de retorno es int, o no es una Lista, si la etiqueta en el archivo del asignador es insert, update llamará a los métodos de inserción y actualización de SqlSession

para resumir:

La clase Dao en realidad no tiene ningún trabajo sustantivo. Solo se usa para ubicar la declaración SQL de la identificación correspondiente en el archivo de mapeo a través del método de interfaz relevante de SqlSession, por lo que la operación real de la base de datos la realiza el marco a través de la instrucción Sql en el archivo de mapeo.

2. Desarrollo del agente dinámico Dao
  • Modo de proxy dinámico (mecanismo de proxy dinámico jdk):

El marco MyBatis deja a un lado la clase de implementación de Dao, crea una clase de implementación de la interfaz dao basada en su interfaz dao y crea un objeto de esta clase, completa la llamada a los métodos en la interfaz dao y luego localiza directamente el correspondiente en el archivo de mapeo. para operaciones de base de datos

(1) Obtenga la clase de implementación correspondiente a la interfaz dao a través de SqlSesssion.getMapper (interfaz dao)
StudentDao dao = MyBatisUtil.getSqlSession().getMapper(StudentDao.class); 
(2) Llame al método correspondiente en la interfaz para ejecutar la declaración SQL en el archivo de mapeo a través de la clase de implementación de la interfaz dao obtenida
List<Student> studentList = dao.selectStudens();

Supongo que te gusta

Origin blog.csdn.net/hcz666/article/details/113061978
Recomendado
Clasificación