zoukankan      html  css  js  c++  java
  • MyBatis框架的XML数据访问Dao层接口的组合使用

    MyBatis 的前生为Apache的开源项目iBatis。其优势在于灵活,几乎可以替代JDBC,同时提供了编程接口。
    目前MyBatis的数据访问Dao层不需要实现类,也不需要像JDBC那样拼接Hql,它只需要一个接口和XML(或者注解)。MyBatis提供自动映射、动态SQL、级联、缓存、注解、代码和SQL分离等特性,使用很方便,还能够对SQL就行优化。因为其具有封装少、映射多样化、支持存储过程、可以进行SQL优化等特点,使得它替代了Hibernate成为Java互联网中首选的持久框架。
    下面简单介绍一下。

    实体类Student

    public class Student {
        private int stuId;
        private String stuName;
        private String stuClass;
    
        public int getStuId() {
            return stuId;
        }
    
        public void setStuId(int stuId) {
            this.stuId = stuId;
        }
    
        public String getStuName() {
            return stuName;
        }
    
        public void setStuName(String stuName) {
            this.stuName = stuName;
        }
    
        public String getStuClass() {
            return stuClass;
        }
    
        public void setStuClass(String stuClass) {
            this.stuClass = stuClass;
        }
    
        @Override
        public String toString() {
            return "Student [stuId=" + stuId + ", stuName=" + stuName + ", stuClass=" + stuClass + "]";
        }
    
    }

    1:xml方式进行数据库查询操作

    <!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.zhao.dao.StudentDao">
        <select id="queryById" parameterType="int" resultType="Student">
            select * from student where stu_id=#{stuId}
        </select>
    </mapper>

    先进行测试

        private InputStream inputStream;
        private SqlSessionFactory sqlSessionFactory;
        private SqlSession sqlSession;
    
        @Before
        public void before(){
            inputStream=StudentTest.class.getClassLoader().getResourceAsStream(resource);
            sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
            sqlSession=sqlSessionFactory.openSession();
        }
        @After
        public void after(){
            sqlSession.close();
        }
    
        @Test
        public void testXmlQueryById() {
            Student student=(Student)sqlSession.selectOne("com.zhao.dao.StudentDao.queryById", 1);
            System.out.println(student);
        }

    xml的方式操作数据库,用了SqlSession的selectOne方法。

    public abstract <T> T selectOne(String paramString, Object paramObject);

    当然,我们在mybatis的配置文件中,定义了类的别名、StudentDao.xml 以及数据库

        <mappers>
            <mapper resource="com/zhao/mapper/StudentDao.xml"/>
        </mappers>

    现在我们能查到结果

    Student [stuId=1, stuName=ZHAO, stuClass=Java10班]

    2:在dao层使用注解

        
        @Select("select * from student where stu_id=#{stuId}")
        public Student queryById(int stuId);
    }

    为了避免混淆,再修改一下配置文件

        <mappers>
            <mapper class="com.zhao.dao.StudentDao"/>
        </mappers>

    然后再进行测试

    @Test
        public void testAnnotationQueryById(){
            StudentDao studentDao=sqlSession.getMapper(StudentDao.class);
            Student student=studentDao.queryById(1);
            System.out.println(student);
        }

    我们可以看到,是用了SqlSession的getMapper方法得到了一个Dao层接口对象,然后调用了其中的queryById方法查到的结果。

    目前来看:

      xml和dao层注解之间并没有什么联系,是两个不同的查询方式。

      但是xml的配置比较简单,但是使用起来比较繁琐。而dao层注解需要在代码上进行操作,看起来也不舒服。

    3:xml+dao

    并不需要修改测试类

    @Test
        public void testAnnotationQueryById(){
            StudentDao studentDao=sqlSession.getMapper(StudentDao.class);
            Student student=studentDao.queryById(1);
            System.out.println(student);
        }

    这里跟用注解是一样的。不过Dao层接口中注解已经被我删除了

    public interface StudentDao {
        public Student queryById(int stuId);
    }

    现在需要把xml和dao 联系起来

    <?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="com.zhao.dao.StudentDao">
        <select id="queryById" parameterType="int" resultType="Student">
            select * from student where stu_id=#{stuId}
        </select>
    </mapper>

    其实我并没有修改这个mapper文件,我们可以看到 mapper便签的namespace属性就是Dao层接口的全路径,select的id属性就是Dao层接口的相应方法,这些名字都是一样的。当然 也必须是一样的。

    然后修改配置文件

    <mappers>
            <mapper resource="com/zhao/mapper/StudentDao.xml"/>
    </mappers>

    这样做就是为了让xml和dao能组合起来。配置文件中配置的是xml。但是这个xml指向了一个接口。我们在用的时候通过接口来进行相应操作,会更加清晰明了。在xml中修改sql代码也很舒服。

    yian
  • 相关阅读:
    Hadoop Yarn 框架原理及运作机制及与MapReduce比较
    模型驱动与属性驱动区别
    spark伪分布式的安装
    大数据集群的常见问题
    linux常用命令
    大数据集群ssh登录其他机器失败 RSA host key for zb03 has changed and you have requested strict checking. Host key verification failed.
    Python 地点转化为经纬度
    Hbase原理、基本概念、基本架构
    struts2的java.lang.NoSuchMethodException错误
    抽象工厂
  • 原文地址:https://www.cnblogs.com/xiangpeng/p/9481772.html
Copyright © 2011-2022 走看看