[官网说明]
探究已映射的 SQL 语句
这里你也许想知道通过 SqlSession 和 Mapper 对象到底执行了什么操作。已映射的 SQL 语句是一个很大的主题, 而且这个主题会贯穿本文档的大部分内容。 为了给出一个宏观的概 念,这里有一些示例。 上面提到的任何一个示例,语句是通过 XML 或注解定义的。我们先来看看 XML。使 用基于 XML 的映射语言,在过去的几年中使得 MyBatis 非常流行,他为 MyBatis 提供所有 的特性设置。如果你以前用过 MyBatis,这个概念应该很熟悉了,但是 XML 映射文件也有 很多的改进,后面我们会详细来说。这里给出一个基于 XML 映射语句的示例,这些语句应 该可以满足上述示例中 SqlSession 对象的调用。
<?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"><mappernamespace="org.mybatis.example.BlogMapper"><selectid="selectBlog"parameterType="int"resultType="Blog"> select * from Blog where id = #{id} </select></mapper>
这个简单的例子中看起来有很多额外的东西, 但是也相当简洁了。 你可以在一个单独的 XML 映射文件中定义很多的映射语句,除 XML 头部和文档类型声明之外,你可以得到很 多 方 便 之 处 。 在 文 件 的 剩 余 部 分 是 很 好 的 自 我 解 释 。 在 命 名 空 间 “com.mybatis.example.BlogMapper”中,它定义了一个名为“selectBlog”的映射语句,这 样它允许你使用完全限定名 “org.mybatis.example.BlogMapper.selectBlog” 来调用映射语句, 我们下面示例中所有的写法也是这样的。
Blog blog =(Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog",101);
要注意这个使用完全限定名调用 Java 对象的方法是相似的,这样做是有原因的。这个 命名可以直接给相同命名空间下的的映射类, 使用一个名称, 参数和返回值和已映射的查询 语句都一样的方法即可。 这就允许你非常容易地调用映射器接口中的方法, 这和你前面看到 的是一样的,下面这个示例中它又出现了。
BlogMapper mapper = session.getMapper(BlogMapper.class);Blog blog = mapper.selectBlog(101);
第二种方式有很多有点,首先它不是基于文字的,那就更安全了。第二,如果你的 IDE 有代码补全功能,那么你可以利用它来操纵已映射的 SQL 语句。第三,不需要强制类型转 换,同时 BlogMapper 接口可以保持简洁,返回值类型很安全(参数类型也很安全) 。
重要 命名空间的一点注释
命名空间 在之前版本的 MyBatis 中是可选项,非常混乱也没有帮助。现在,命名空间 是必须的,而且有一个目的,它使用更长的完全限定名来隔离语句。
命名空间使得接口绑定成为可能,就像你看到的那样,如果之前不了解,那么现在你 就会使用它们了,你应该按照下面给出示例的来练习,以免改变自己的想法。使用命名空 间,并将它放在合适的 Java 包空间之下,将会使你的代码变得简洁,在很长的时间内提高 MyBatis 的作用。
命名解析: 为了减少输入量,MyBatis 对所有的命名配置元素使用如下的命名解析规 则,包括语句,结果映射,缓存等。
- 直接查找完全限定名(比如“com.mypackage.MyMapper.selectAllThings”,如果 ) 发现就使用。
- 短名称(比如“selectAllThings” )可以用来引用任意含糊的对象。而如果有两个 或两个以上的(比如“com.foo.selectAllThings ”和“com.bar.selectAllThings” ), 那么就会得到错误报告,说短名称是含糊的,因此就必须使用完全限定名。
如 BlogMapper 这样的映射器类来说,还有一个妙招。它们中间映射的语句可以不需要 在 XML 中来写,而可以使用 Java 注解来替换。比如,上面的 XML 示例可以如下来替换:
package org.mybatis.example;publicinterfaceBlogMapper{@Select("SELECT * FROM blog WHERE id = #{id}")Blog selectBlog(int id);}
对于简单语句来说,使用注解代码会更加清晰,然而 Java 注解对于复杂语句来说就会 混乱, 应该限制使用。 因此, 如果你不得不做复杂的事情, 那么最好使用 XML 来映射语句。
当然这也取决于你和你的项目团队的决定, 看哪种更适合你来使用, 还有以长久方式来 使用映射语句的重要性。也就是说,不要将自己局限在一种方式中。你可以轻松地将注解换 成 XML 映射语句,反之亦然。
Mybatis的namespace问题说明
<!--[if !supportLists]-->1. <!--[endif]-->MyBatis的命名空间(我们以下图的文件结构来说明)
MyBatis的命名空间说的是POJO的XXx.xml文件中的<mapper namespace=”” />,主要是跟三个地方有关系,
第一个是Configuration.xml的mappers属性
第二个是POJO的mapper接口如EmployeeMapper的类路径
第三个是DAO程序中的session.getConfiguration().addMapper(EmployeeMapper.class)
下面我来说一下他们三个之间的关系,我们
1)当只使用XML(不使用Anotation)的来配置mapper接口时,就是我们把sql配置在EmployeeMap.xml中时,若我们把namespace指明namespace设置为mapper接口的路径,即<mapper namespace="com.wildrain.mapper.EmployeeMapper">时,这样我们在程序中使用MyBatis来进行CRUD时, session.getConfiguration().addMapper(EmployeeMapper.class)这段代码可以不用写。我们来具体看一下这个三个地方的代码形式。
Configuration.xml的mappers
<typeAliases>
<typeAlias alias="Employee" type="com.wildrain.domain.Employee" />
</typeAliases>
Namespace
<mapper namespace="com.wildrain.mapper.EmployeeMapper">
程序代码:
@Test
public void testGetAllEmployees(){
SqlSessionFactory sqlSessionFactory = MyBatisUtil.getSessionFactory();
SqlSession session = sqlSessionFactory.openSession();
try {
EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);
List<Employee> ems = mapper.getAllEmployees();
for(Employee e:ems){
System.out.println(e);
}
} finally {
session.close();
}
}
若我们在employee.xml中的namespace是任意取的名字,而不是EmployeeMapper.java的类路径名,那么当我们在进行测试时,必须要添加一行代码session.getConfiguration().addMapper(EmployeeMapper.class)进行注册,下代码如下:
@Test
public void testGetAllEmployees(){
SqlSessionFactory sqlSessionFactory = MyBatisUtil.getSessionFactory();
SqlSession session = sqlSessionFactory.openSession();
session.getConfiguration().addMapper(EmployeeMapper.class);
try {
EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);
List<Employee> ems = mapper.getAllEmployees();
for(Employee e:ems){
System.out.println(e);
}
} finally {
session.close();
}
}
2)当使用注解时,为了减少配制xml的工作量,可以把Employee.xml省略,而把相应配制通过注解的形式写到EmployeeMapper.java的文件中,如下所示
final String getAllEmployees = "SELECT E.id, name, type, salay, time "+
"FROM employee E "+
"left join register r on r.eid = E.id "+
"left join time t on t.eid = E.id";
@Select(getAllEmployees)
@TypeDiscriminator(column = "type",
cases={
@Case(value="1",type=RegisterEmployee.class,results={
@Result(property="salay")
}) ,
@Case(value="2",type=TimeEmployee.class,results={
@Result(property="time")
})
})
这样Configuration.xml中就不需要设置<mappers/>了,此时在测试程序时就必须加一行session.getConfiguration().addMapper(EmployeeMapper.class);的代码进行注册,这样在每一次CRUD时都需要添加一行这样的代码。还不如在建立一个空的Employee.xml文件,然后像上面一样设置好namespace,从而不用输入那一行代码。
上面的说明针对的是,仅针对使用mybats动态代理时的情况。写得比较乱,以后有时间再改。
1. 配置文件
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/orcl"/>
<property name="username" value="root"/>
<property name="password" value="xxxxxx"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/xiamen/domain/person.xml" />
</mappers>
</configuration>
包括两个部分 1. 数据库连接 2. sql映射文件Mapper
2. ORM对象
public class Person implements Serializable {
private int personId;
private String name;
private String age;
public int getPersonId() {
return personId;
}
public void setPersonId(int personId) {
this.personId = personId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
3. sql映射文件
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xiamen.mapper.PersonMapper">
<select id="getPersonById" parameterType="int" resultType="com.xiamen.domain.Person">
select * from person where personId=#{id}
</select>
<insert id="insertvalues" parameterType="com.xiamen.domain.Person">
insert into person (personId,name,age) values (#{personId},#{name},#{age})
</insert>
</mapper>
注意mapper的namespace的名字是mapper对象的完整路径名com.xiamen.mapper.PersonMapper(这样session就可以getMapper了)
因为mybatis的作用就是:使得接口绑定成为可能
4. mapper接口
映射器是创建绑定映射语句的接口,所以mapper接口就是映射器
public interface PersonMapper
{
Person getPersonById(int id);
}
5. 测试类
Reader reader = Resources.getResourceAsReader(resource);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = null;
try {
session = factory.openSession();
Person person = (Person) session.selectOne(
"com.xiamen.mapper.PersonMapper.getPersonById", 1);
if(person == null)
System.out.println("null");
else
System.out.println(person.toString());
}
finally {
session.close();
}
try {
session = factory.openSession();
PersonMapper mapper = session.getMapper(PersonMapper.class);
Person person = mapper.getPersonById(1);
if(person == null)
System.out.println("null");
else
System.out.println(person.toString());
} finally {
session.close();
}
相关推荐
MyBatis作为一款优秀的持久层框架,主要解决了Java应用与数据库交互的问题。它支持普通的SQL查询、存储过程和高级映射,可以用来处理复杂的SQL,例如联表查询等,并且支持动态SQL语句,这在处理有较多条件判断的场景...
1. **namespace**:每个映射器都有一个唯一的命名空间,它通常是全限定类名,用于区分不同的映射器。 2. **select、insert、update、delete**:这些元素定义了SQL语句,例如查询用户信息、插入数据、更新记录或删除...
### MyBatis3.2.4完全自学手册 #### 一、快速入门 **1、MyBatis简介** ...总结起来,MyBatis是一个功能强大、易于使用的持久层框架,通过其丰富的特性和灵活的配置选项,可以有效地解决各种数据库访问问题。
在实际开发过程中,"数据库和纪要.txt"文件可能是记录数据库设计和开发过程中的重要笔记,包括表结构、字段说明、业务规则等。它可以帮助团队成员更好地理解数据库的设计意图,提高协作效率。 总结一下,MyBatis与...
- **步骤说明**:通过`MyBatisUtil`工具类创建`SqlSessionFactory`工厂,并找到`mybatis-config.xml`总配置文件。这是MyBatis初始化的第一个环节。 - **关键代码**: ```java String resource = "org/mybatis/...
### MyBatis与Spring整合方式详解:基于注解的实现 #### 一、概述 在实际的软件开发过程中,为了更好地实现项目的模块化管理和提高代码的可维护性,通常会将MyBatis与Spring框架进行整合。这种方式不仅能够简化...
MyBatis是一个强大的Java持久层框架,它提供了一种灵活的映射机制,将SQL语句与Java代码分离,使得数据库操作变得更加简单和易于管理。本实例将深入讲解MyBatis的基本概念、配置以及如何在实际项目中使用。 首先,...
MyBatis的注释通常用于提供额外的说明,例如接口方法的用途、参数的意义等,以便其他开发者理解代码。在实际项目中,良好的注释可以提高代码的可读性和维护性。 总结来说,实现MyBatis中只有一个参数传递的查询,...
本文将深入讲解 MyBatis 的一级缓存和二级缓存,并通过一个简单的示例进行说明。 ### 一级缓存 一级缓存是 Session 级别的缓存,也称为本地缓存(Local Cache)。每当我们在一个 SqlSession 中执行了 CRUD 操作,...
以下是对标题和描述中所述知识点的详细说明: 一、框架的理解 框架在软件开发中扮演着重要的角色,它是一套预定义的解决方案,针对特定问题领域提供了一种标准化的开发模式。例如,MyBatis是一个专门针对持久层操作...
以下是对标题和描述中提到的知识点的详细说明: 1. **环境搭建**: - **MyBatis 版本**:在描述中提到了使用的是 MyBatis 3.1.1 版本。尽管现在MyBatis已经更新到更高的版本,但了解旧版本的配置可以帮助理解框架...
以上就是关于MyBatis的核心知识点,包括其解决JDBC问题的方式、编程步骤、与Hibernate的区别,以及缓存机制的详细说明。这些内容涵盖了MyBatis的基础使用和高级特性,有助于理解和掌握MyBatis在实际项目中的应用。
MyBatis 正是为了解决这些问题而生的。MyBatis 通过将对数据表的操作(SQL、方法)等等直接剥离,写到 XML 配置文件,实现和 Java 代码的解耦,从而简化数据库操作,提高开发效率,提高代码的可读性和可维护性。 2....
接着,我们来看`说明.txt`,这通常是一个指导文档,可能会包含集成步骤、配置详解或注意事项。在整合SSM的过程中,我们需要配置Spring的ApplicationContext、SpringMVC的DispatcherServlet配置以及MyBatis的...
在Java Web开发领域,Struts2、Spring 和 MyBatis 是三个非常流行的开源框架,它们各自解决了不同的问题:Struts2 用于MVC模式的实现;Spring 作为轻量级的IoC容器和AOP框架;MyBatis 则提供了优秀的持久层解决方案...
以下是对集成过程的详细说明: 一、SpringBoot简介 SpringBoot是由Pivotal团队提供的全新框架,它旨在简化Spring应用的初始搭建以及开发过程。SpringBoot通过“约定优于配置”的方式,极大地减少了Spring应用的启动...
以下是对"Mybatis对数据库简单操作"的详细说明: 1. **创建Web程序**: 在这个例子中,我们创建了一个名为`test-mybatis`的Web应用程序。这通常涉及到在IDE(如Eclipse、IntelliJ IDEA等)中新建一个动态Web项目,...
#### 二、MyBatis配置说明 在使用MyBatis进行开发之前,需要完成必要的配置工作,主要包括以下几个方面: 1. **MyBatis Jar包与JDBC包的准备:** - MyBatis的jar包可以从官方网站下载。 - 适用于KingbaseES的...
<mapper namespace="cn.jason.bootmybatis.mapper.UserMapper"> <!--一对多关系映射 ofType表示属性集合中的元素的类型,List属性即Orders类 --> <!--关联查询sql--> select u.*,o.id as ...