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代码也很舒服。

MyBatis框架的XML数据访问Dao层接口的组合使用的更多相关文章

  1. mapper.xml是怎样实现Dao层接口

    上午写了一个简单的 从xml读取信息实例化一个Bean对象.下午就开始想mybatis是怎么通过xml文件来实现dao层接口的,一开始想直接用Class.forName(String name)然后调 ...

  2. PDO数据访问抽象层

    PDO数据访问抽象层: 我们使用的mysqli是针对mysql这个数据库扩展的一个类,如果要用到别的数据库的话就可以用PDO来做 1.操作数据库 先来代码 <!--PDO--> <! ...

  3. php PDO:数据访问抽象层

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. 用saxon框架对xml数据进行过滤 - 程序员的天堂 - ITeye技术网站

    用saxon框架对xml数据进行过滤 博客分类: Java   Saxon 是一个 XSLT 和XQuery处理器.它是使用 XML 文档和样式表作为输入,然后生成结果文档作为输出的程序,它还包括了一 ...

  5. PDO(数据访问抽象层)、pdo事务功能和预处理功能---2017-05-05

    之前所学的数据访问都是用mysqli做成类来访问的,但是mysqli这个类只是针对mysql这个数据库的:那么如果访问其他类型的数据库呢? 那么这就用到了PDO(数据访问抽象层). 一.关于PDO基本 ...

  6. PHP中关于PDO数据访问抽象层的功能操作

    PDO:数据访问抽象层 具有三大特点: 1.可以访问其它数据库  所有数据库都可以 2.具有事务功能 3.带有预处理语句功能(防止SQL注入攻击) 实例操作代码如下: <?php //1.造PD ...

  7. PDO:数据访问抽象层

    <?php //PDO:数据访问抽象层 //带有事务功能: //dsn:数据源 $dsn="mysql:host=localhost;dbname=aaas"; //造pdo ...

  8. iBatis——自动生成DAO层接口提供操作函数(详解)

    iBatis——自动生成DAO层接口提供操作函数(详解) 在使用iBatis进行持久层管理时,发现在使用DAO层的updateByPrimaryKey.updateByPrimaryKeySelect ...

  9. 基于Oracle OCI的数据访问C语言接口ORADBI .

    基于Oracle OCI的数据访问C语言接口ORADBI cheungmine@gmail.com Mar. 22, 2008   ORADBI是我在Oracle OCI(Oracle 调用接口)基础 ...

随机推荐

  1. 为什么在启动linux后进入终端提示sh-3.2#

    这是Linux系统环境变量设置问题,用户登陆后确保是root权限,可以用如下这两条命令解决:-bash-3.2# cp /etc/skel/.{bash_profile,bashrc} ~-bash- ...

  2. c语言里如何调用汇编里的变量?

    c语言里如何调用汇编里的变量? 汇编语言:是声明全局变量 .globl _end_ofs _end_ofs: .word _end - _start c语言:声明这个变量,然后再调用这个变量 void ...

  3. JQ实现图片上传预览功能

    <input type="file" name="img" id="test1"> <img src="&quo ...

  4. ubuntu12.04下有线网无电缆插入问题

    解决方案: 1.查看是否没装网卡驱动: 2.检查网卡是否损坏: 3.检查网线是否损坏(注意:有时候不一定是网线损坏了,而是网线太细了,导通性不好.本人用细网线试了一下,windows下面可以连接网络, ...

  5. 在windows64位的系统上面操作操作excel程序出现异常

    1.把iis的网站程序引用池启用32位设置 2.把iis的网站程序引用池启用中标识修改为LocalSystem 2.代开cmd 输入mmc -32 添加组件服务在dcom组件中找到excel安全里添加 ...

  6. Python的中文处理

    一.使用中文字符 在python源码中如果使用了中文字符,运行时会有错误,解决的办法是在源码的开头部分加入字符编码的声明,下面是一个例子: #!/usr/bin/env python # -*- co ...

  7. [poj2186]Popular Cows(targin缩点)

    题意:求其他所有牛都认为其牛的牛的个数. 解题关键:targin算法模板题,缩点形成一棵树,并不一定是棵树,可能含有多个入度为0的点,寻找出度为0的点(缩点之后的点)的个数,如果个数大于0,则无解,否 ...

  8. jQuery.validator.addMethod方法的使用

    该方法有三个api接口参数,name,method,messages addMethod(name,method,message)方法 参数 name 是添加的方法的名字. 参数 method 是一个 ...

  9. mysql 三存储引擎

    一 什么是存储引擎 mysql中建立的库===>文件夹 库中建立的表===>文件 现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制:比如处理文本用txt类型 ...

  10. 一个github搞定微信小程序支付系列

    详情请前往github下载示例代码 源码中包含 支付.退款 功能 so easy,项目经理再也不用担心微信支付啦 是的,已经over了