文章由B站动力节点相关课程视频整理而成,不作为基础入门教程,只作为备忘的学习笔记。
目录
一、框架概述
1.1 三层架构
界面层(视图层):和用户打交道,接收用户访问参数,显示处理结果(SpringMVC)
业务逻辑层:接受了界面层传递的数据,计算逻辑,调用数据库,获取数据(Spring)
数据访问层(持久层):访问数据库,执行数据的查询、修改、删除等等。(MyBatis)
1.2 框架(Framwork)
框架好比是一个规定好了某些内容的模板,需要根据一定的格式完成需要的内容。框架又好比是提供了许多基础的功能(灯光、背景、音乐)的舞台,加入自己的内容后才是完整的演出。
框架可以看作是一个半成品的软件,项开发者提供了许多可重复使用的基础功能,帮助完成某一领域的开发任务。
1.3JDBC编程缺陷
- 代码较多,开发效率低
- 需要关注Connection、Statement、ResultSet对象的创建与销毁
- 对ResultSet对象的查询结果需要进行人工封装
- 重复代码多
- 业务逻辑代码与数据库操作代码混合在一起
1.4 MyBatis框架概述
MyBatis是Apache的一个开源项目,前身是iBatis,是java语言的持久层框架,2013年代码迁移到GitHub上。
- SQL Mapping:将一行数据看作一个Java对象来处理。
- Data Access Objects(DAOs):对数据进行curd。
MyBatis提供了下列功能:
- 自动创建和关闭Connection、Statement、ResultSet对象
- 自动执行SQL
- 自动循环结果,将数据封装到java对象,并保存到集合中。
开发人员只需要提供SQL语句即可。
二、MyBatis框架快速入门
2.1MyBatis下载、安装配置
下载地址:https://github.com/mybatis/mybatis-3/releases
windows选择zip格式下载即可
中文帮助文档:https://mybatis.org/mybatis-3/zh/index.html
2.2MyBatis入门案例
步骤:
-
1.在数据库中新建一张表
-
2.在Maven中加入MyBatis依赖和Mysql驱动的依赖。
-
3.创建实体类Student,保存表中的一行数据。
类中的实例变量与表的字段一一对应,创建这些变量的setter和getter,重写toString方法。 -
4.创建持久层的DAO接口,定义操作数据库的方法。
查询方法的返回类型一般是带有泛型的List,泛型类型为实体类型。无参数。
insert方法的返回类型为int,表示修改数据库中记录的行数,参数为实体类对象。 -
5.创建一个Mybatis使用的xml配置文件,称之为sql映射文件或mapper文件。一般是一张表一个sql映射文件。此文件在接口所在的目录中,文件名与接口名保持一致。
例如,mybatis教程中的示例,此示例中各个标签的说明在注释中可以查看:
<--1.这是写sql语句 的文件。mybatis会执行这些文件-->
<?xml version="1.0" encoding="UTF-8" ?>
<!--2.指定约束文件
mybatis-3-mapper是约束文件的名称,
.dtd是扩展名。
约束文件的作用:限制检查当前文件中的标签和属性。
IDEA也可以根据这个文件进行信息提示和查错
固定写法
-->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--3.mapper是当前文件的根标签,是必须的
namespace叫做命名空间,唯一值的,可以是任意字符串。规范要求使用DAO接口的全限定名称。
-->
<mapper namespace="org.mybatis.example.BlogMapper">
<!--4.select标签或其他标签,表示对当前数据库的操作:
<select/>:查询
<update/>:修改
<insert/>:增加
<delete/>:删除
-->
<select id="selectBlog" resultType="Blog">
<!--5.id:你要执行的sql语法的唯一标识。mybatis会根据id值来找到要执行的sql语句。可以自定义,但最好写成接口中对应的方法名。
resultType:sql语句执行后得到了ResultSet,遍历ResuSet每一行数据得到的Java对象名称。即在步骤3中创建的实体类的全限定名称。-->
select * from Blog where id = #{id}
<!--"#{字段(也同时是实体类中的属性)名}"是,占位符,一般多用于insert语句,表示此属性的值-->
</select>
</mapper>
可以看到主要修改三个属性:namespace、id、resultType
- 6.创建mybatis使用的主配置文件。主配置文件提供了连接数据库的信息和SQL映射文件的位置。一般一个项目一个主配置文件。
在resources目录下创建mybatis.xml文件,文件内容参照
官方帮助文档给出的示例代码:
<?xml version="1.0" encoding="UTF-8" ?>
<!--与sql映射文件中的功能一致:提供约束文件的位置信息,固定值-->
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--根标签,包含两大部分,环境配置和指定sql映射文件位置-->
<configuration>
<!--环境配置,数据库连接信息,可以配置多个
default的值必须与某个environment的id值相同,告诉mybatis使用哪个环境
-->
<environments default="development">
<!--一个数据库的环境配置,id是一个自定义的唯一值,表示环境名称-->
<environment id="development">
<!--transactionManager:表示mybatis的事务类型,包括提交事务、回滚事务的方式
type="JDBC"表示使用JDBC中Connection对象的commit、rollback作为事务处理
还可以是"MANAGED",表示mybatis将事务的处理我i托给其他容器来做(以后Spring会用到)
-->
<transactionManager type="JDBC"/>
<!--dataSource 表示数据源,在Java体系中,实现了java.sql.DataSource接口的都是数据源。
数据源表示Connection对象
type="POOLED"表示数据源类型为连接值。MyBatis创建PooledDataSource类来管理Connection对象。一般固定为此值。
type="UNPOOLED"表示不使用连接池。MyBatis创建UnpooledDataSource类来管理Connection对象。每次执行sql之前创建连接,执行结束关闭连接。一般不使用。
type="JNDI"java命名和目录服务。有兴趣自己了解,一般不用。
-->
<dataSource type="POOLED">
<!--以下是数据库的配置信息。name属性值是不能改变的,value属性值为数据库连接信息-->
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!--指定sql映射文件的位置-->
<mappers>
<!--一个mapper指定一个sql mapper文件信息
指的是从类路径开始的路径信息。即Maven目录下,target/classes/目录下开始的路径
-->
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
sql映射文件与Dao接口存在对应关系,放在了与Dao接口相同java目录下,因此需要在pom.xml中添加资源插件:
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
<filtering>false</filtering>
</resource>
<!--原有资源路径-->
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
本来在执行compile命令时,会默认将src/main/resources下的内容复制到target/classes中,但是本人学习过程中发现,一旦添加了资源插件,resources目录下的主配置文件mybatis.xml并没有复制到target/classes中。而添加原有资源路径的插件后又成功了。因此建议一旦添加资源插件,必须添加原有资源路径
这个问题课程中的老师在后面提到了,并给出了一些不同于添加原有资源路径解决的办法:
1)清理后重新编译
2)build---->rebuild
3)file---->invalidate caches重启IDEA
4)直接复制mybatis.xml文件到classes目录。。。。(亏你想得出来)
这些方法2 3 我没尝试过,4我是不屑于尝试的。供诸位参考。
- 7.创建MyBatis类。通过mybatis访问数据库。
package com.yang;
import com.yang.enity.Student;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class App
{
public static void main(String[] args) throws IOException {
//1.定义mybatis主配置文件的位置,从类路径根目录开始,即target/classes之后
String config = "mybatis.xml";
//2.读取config表示的文件org.apache.ibatis.io.Resources,注意包名
InputStream in = Resources.getResourceAsStream(config);
//3.创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//4.创建SqlSessionFactory对象
SqlSessionFactory factory = builder.build(in);
//5.【重要】获取SqlSession对象
SqlSession sqlSession = factory.openSession();
//6.【重要】指定执行Sql语句的标识。 sql映射文件中的namespace+"."+标签的id值
String sqlId = "com.yang.dao.StudentDao" + "." + "selectStudents";
//7.通过sqlId找到sql语句并执行
List<Student> studentList = sqlSession.selectList(sqlId);
//如果是增添数据的语句,应该是:
//int nums = sqlSession.insert(sqlId,student);
//nums表示修改数据库记录的条数,sqlId是增添数据对应的SQL语句的sqlId,student是一个实体类对象。
//mybatis默认不是自动提交事务,完成增删改后应手动提交:
//sqlSession.commit();
//8.输出结果
studentList.forEach(stu-> System.out.println(stu));
//9.关闭Sqlsession对象
sqlSession.close();
}
}
2.3 配置日志
在上述案例中,如果执行增删改操作,对开发人员来说执行的过程和结果不清晰:不知道执行了哪条sql语句,也不知道数据库发生了什么变化。
因此可以考虑配置日志信息。
在MyBatis的主配置文件mybatis.xml中,<configuration/>
标签下:
<settings>
<!--配置日志信息。将日志输出到控制台-->
<setting name="logImpl" value="STDOUT_lOGGING"/>
</settings>
2.4 MyBatis中主要对象的介绍
- Resources:负责读取著配置文件
- SqlSessionFactoryBuilder:负责创建SqlSessionFactory对象
- SqlSessionFactory:重量级对象(创建对象耗时长,占用资源多,整个项目中有一个就够用了),是一个接口,实现类:DefaultSqlSessionFactory。用于获取sqlSession对象。
方法说明:
1) openSession() 无参数,获取非自动提交事务的sqlSession对象。
2)openSession(boolean autoCommit)参数为true,获取自动提交事务的sqlSession对象。 - SqlSession:接口,定义了操作数据库的方法。类DefaultSqlSession对这些方法进行了实现。SqlSession不是线程安全的,需要在方法内部使用,使用之前通过SqlSessionFactory的openSession获取,使用之后通过sqlsession.close()关闭,以保证线程安全。
2.5 Mybatis工具类的创建与使用
在2.2提供的案例最终访问数据库的过程中,仍然有大量的代码冗余,主要是从第一步到第五步创建SqlSession对象为止,均是可重复的部分,因此可以创建一个工具类。
在创建工具类时注意重量级对象SqlSessionFactor只创建一次。
package com.yang.utils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class MybatisUtil {
private static SqlSessionFactory factory = null;
static{
String config = "mybatis.xml";
try {
InputStream in = Resources.getResourceAsStream(config);
factory = new SqlSessionFactoryBuilder().build(in);
} catch (IOException e) {
e.printStackTrace();
}
}
//获取SqlSession的方法
public static SqlSession getSqlSession(){
SqlSession sqlSession = null;
sqlSession = factory.openSession();
return sqlSession;
}
}
有了上面的工具类,前五步获取sqlsession的过程可以简化为下面一步:
Sqlsession sqlsession = MybatisUtil.getSqlSsion();
2.6 传统DAO执行方式
创建DAO接口的实现类,重写其操作数据库的方法:
1.根据mybatis的工具类,获得sqlsession。
2.指定执行Sql语句的标识。 sql映射文件中的namespace+"."+标签的id值。
3.通过sqlId找到sql语句并执行。
4.关闭SQL session。
5.将结果返回。
以后访问操作数据库时,调用DAO接口的相应方法即可。
存在问题:1、4代码重复,大量代码相似。
三、MyBatis框架Dao代理(重点)
3.1 动态代理的应用
3.1.1 动态代理使用条件分析
当我们创建好DAO接口,并定义好代表操作数据库的抽象方法时,能否自动创建Dao接口的实现类呢:
1)2.6中1的步骤是固定的。
2)可以根据动态代理,获得此接口的全限定名,即sql映射文件namespace的值;也可以获得方法名,即sql映射文件对应语句的id值,也就得到了2.6 2中的sql标识。
3)根据方法的返回类型和sql标识指定的sql标签(<select/>,<insert/>,<delete/>或<uodate/>
)可以确定sqlSession调用的方法(delete?还是selectList?或者是insert?update?)因此2.6 3也是可以实现的。
4)2.6中4、5是容易实现的。
因此,可以通过动态代理的技术自动创建Dao接口的实现类。
3.1.2 MyBatis的DAO动态代理代码实现
myBatis根据Dao方法的调用,获取执行Sql语句的信息。MyBatis根据Dao接口自动创建实现类,并创建对象。完成sqlSession调用方法,访问数据库。
package com.yang;
import com.mysql.cj.protocol.a.MysqlBinaryValueDecoder;
import com.yang.dao.StudentDao;
import com.yang.enity.Student;
import com.yang.utils.MybatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class TestStudentDao {
@Test
public void testSelectStudents(){
//下面演示今后利用动态代理访问数据库的操作实例
SqlSession sqlSession = MybatisUtil.getSqlSession();
StudentDao dao = sqlSession.getMapper(StudentDao.class);
List<Student> students = dao.selectStudents();
for (Student s:students) {
System.out.println(s);
}
}
}
在Dao接口中尽量不要使用方法重载
3.2 深入理解参数
3.2.1 参数类型(parameterType)
是sqlmapper文件中sql标签的一个属性,属性值是Java数据类型的全限定名或mybatis定义的别名,表示DAO接口中方法的参数类型,例如当我们在Dao接口中定义了根据id查询数据的方法:
public Student selectStudentById(int id);
响应的在SQLMapper文件中:
<select id="selectStudents" parameterType="java.lang.Integer" resultType="com.yang.enity.Student">
<!--也可以使用parameterType="int"-->
select id,stdname,stdno,classno from t_student where id =#{id}
</select>
在实际开发过程中,由于在myBatis中的参数类型可以通过反射机制获得,parameterType属性因此可以不写。
3.2.2 一个简单类型参数的传递
简单类型:MyBatis把Java基本数据类型和String类型都叫做简单类型。
如上面的示例中不止一次出现的,在mapper文件中获取一个简单类型参数的值,使用
#{任意字符}
3.2.3 多个参数的传递方式
3.2.3.1第一种方式:使用@Param命名参数
1.在Dao接口的抽象方法中,每个方法的参数前添加注解@Param(“自定义的参数名”),例如:
List<Student> selectStudentsByNameOrAge(@Param("myname") String name, @Param("myage") Integet age) ;
2.在Mapper文件中使用自定义的参数名来获取参数,例如:
<select id="selectStudentsByNameOrAge" resultType="com.yang.enity.Student">
select id, name, age, email from student where name=#{myname} or age=#{myage}
</select>
3.2.3.2第二种方式:对象传参
创建一个java对象,这个对象包含多个属性,这样在传参时传入这个Java对象,就将多个属性传入,达到了传递多个参数的目的。注意创建的java对象仍然需要封装。
在获取参数值时,完整的语法格式#{属性名,javaType="java类型",jdbcType=“jdbc类型”}
。例如#{name,javaType="java.lang.String",jdbcType=“VARCHAR”}
。
实际上经常使用只写属性名的简化格式#{name}
,javaType与jdbcType可以通过反射机制获取。
3.2.3.3 第三种方式:按位置传值(了解)
根据抽象方法定义时参数的前后位置(从0开始),在mapper文件中获取参数值,格式:#{arg位置下标}
,例如:#{arg0}
表示第一个参数的值。
MyBatis3.4及之前的版本没有关键字arg。
这种方式不常使用。
3.2.3.4 第四种方式:使用Map(了解)
创建一个Map<String, Object> params = new HashMap();
,向其存入参数,例如params.put("name","zhangsan");params.put("age",24);
定义抽象方法时将这样一个Map传入。
在Mapper文件中,使用的语法#{Map的key}
。例如#{name}
得到了**‘zhangsan’**这样一个值。
这种方式不常使用。
3.2.3.5 #与$
#占位符,告诉MyBatis使用PreparedStatement执行sql,#{…}代替?更安全、高效。通常是首选做法。
$与#的语法格式完全相同,这种方式在执行SQL时不使用占位符,而是直接的字符串替换。
$的使用场景:替换列名或表名
在sql语句中根据业务的需要替换列名和表名。例如要对查询的数据根据不同的字段来排序。可以i昂字段名作抽象方法为参数。由于美元符号完成的是不带双引号的字符串替换,可以根据不同的字段名实现不同的排序方式。
3.3 封装MyBatis的查询结果
3.3.1 resultType(mybatis官方帮助文档15页)
处理方式:
1.执行完sql语句,调用resultType的值代表类的午餐构造器;
2.将每一条数据的所有字段按字段名调用同名属性的setter,然后放入List。
数据转化成java对象的任意的,不一定是实体类。
1)简单类型
例如分组函数的返回类型为简单类型。
count(*) 的resultType可以是"java.lang.Integer"或者别名"int".
2)对象类型
对于自定义的java对象,用使用其全限定名称作为resultType,也可以自定义别名。
自定义别名
在MyBatis的主配置文件<settings/>
标签之后添加标签:
<typeAliases>
<!--每一个typeAlias标签代表一个别名设置-->
<typeAlias type="原类型的全限定名称" alias="别名"/>
<!--另外一种别名的设置方法:package标签。
表示一个包下的类名(不区分大小写)可以作为别名使用。
package标签也可以使用多次
-->
<package name="包名"/>
</typeAliases>
应尽量避免使用别名,而是使用全限定名称,避免别名相同产生不必要的麻烦。
3)Map
DAO接口中抽象函数的返回值类型是一个Map<Object, Object>.这种抽象函数要求只能返回一行数据。Map中的key是字段名,value是字段值;键值对的个数取决于查询字段的个数。
3.3.2 resultMap
结果映射。指定列名与java属性的对应关系。
1)自定义列值赋给哪个属性。
2)当属性名与列名不同时,必须通过这种方式指定映射关系。
在mapper文件中的<mapper/>
标签下:
<!--首先定义出一个Map映射关系-->
<!--id属性是一个自定义的标识,可以在select标签中引用,
resultType是要与查询结果的列名建立对应关系的属性所在的实体类的完全限定名
-->
<resultMap id="studentMap" resultType="com.yang.enity.Student">
<!--定义列名与属性名的对应关系-->
<!--主键列与属性的对应使用id标签-->
<id column="id" property="id"/>
<!--非主键列与属性的对应使用result标签-->
<result column="stdname" property="name"/>
<result column="stdage" property="age"/>
<resultMap/>
在<select/>
标签中使用resultMap属性代替resultType属性。属性值是要印有的resultMap的id属性的值。例如上述案例中<select id="XXX" resultMap="studentMap"> SQL语句 </select>
rusultType与resultMap不能同时存在
3.3.3 实体类属性名与列名不同的处理方式
方法一:如上所述,使用resultMap
方法二:在SQL语句中,使用关键字as来修改查询到的数据的列的列名显示名称与属性名相同即可。例如:
select id, stuname as name, stuage as age, stuemail as email from t_student
3.4 模糊like
回顾sql中的模糊查询:
- 关键字:like
- 通配符:1)%(表示0-多个字符) 2)_(表示1个字符)
mybatis实现模糊查询:
方法1:java代码指定like的内容。
例如指定查询姓名中带"李"的:
String name = "%李%";
List<Student> students = dao.selectByVagueName(name);
而在mapper文件中通过占位符#{…}获取查询的内容:
<select id="selectByVagueName" resultType="com.yang.enity.Student">
select id, name, age, email from t_student where name like #{name}
</select>
方法2:在mapper文件中拼接like的内容。
String name = "李";
List<Student> students = dao.selectByVagueName(name);
而在mapper文件中通过占位符#{…}获取查询的内容:
<select id="selectByVagueName" resultType="com.yang.enity.Student">
select id, name, age, email from t_student where name like "%"#{name}"%"
</select>
四、MyBatis框架动态SQL(重点)
4.1 动态SQL之if
使用案例:
Dao中定义了一个查询方法,参数是一个实体类型对象:
List<Student> selectIf(Student stu);
现要求根据此对象属性的值的内容不同来修改查询条件:
1)当name属性不为空时,添加查询条件name字段与name属性值相同;
2)当age属性值大于0时,添加查询条件age字段的值大于age属性值。
解决方法,在mapper文件中:
<select id="selectIf" resultType="com.yang.enity.Student">
select id,name,age, email, from student where 1=1
<!--test属性作为判读那条件,如果为true,则添加此标签下的sql语句到逐语句。否则不添加。-->
<!--在test属性值中,使用resultType中实体类的属性名作为属性值进行条件判断-->
<if test="name != null and name != '' ">
and name=#{name}
</if>
<if test="age > 0">
and age > #{age}
</if>
</select>
where后面1=1是为了防止第一个条件不成立,而后面的条件成立造成sql语法错误。因此添加一个永真条件,并在原来的第一个查询(本例中的name=#{name})条件前加and.
为了不使用这种臃肿的方式,应结合使用where标签:
4.2 动态SQL之where
用来代替sql语句中的where关键字,包含if标签。当有一个if标签的test条件成立,就会自动给sql语句中添加where关键字。当第一个if条件判断不成立时,会自动去掉第一个成立的if标签sql片段的连接词(and、or…)。
例如4.1中的select标签可以写成:
<select id="selectWhere" resultType="com.yang.enity.Student">
select id,name,age, email, from student
<where>
<if test="name != null and name != '' ">
name=#{name}
</if>
<if test="age > 0">
and age > #{age}
</if>
</where>
</select>
即使第一个if不成立,第二个if成立,MyBatis也会自动生成语法正确的sql语句并执行。就不需要再写一个类似”1=1“永真的条件加在sql主句中了。
4.3 动态SQL之foreach
foreach主要是为了完成sql语句中in关键字包含的数目不定的字段的值。例如查询id是1001、1002、1003的学生信息,使用SQL语句:select * from student where id in (1001, 1002, 1003);
类似这样的字段值,我们一般保存在List或数组中,然后将List或数组作为Dao接口中抽象方法的参数。
foreach标签是帮助MyBatis遍历这个List或数组,并将其中的元素按sql的语法格式组合在sql语句中。
例如上述例子,我们在mapper文件中:
<select id="selectForeach" resultType="com.yang.enity.Student">
select id,stdname,stdno,classno from t_student where id in
<foreach collection="list" item="myid" open="(" close=")" separator=",">
#{myid}
</foreach>
</select>
collection属性的值只能是list或array。
当集和中保存到是实体对象时,通过#{item.属性名}
的方式获得其值。其”.属性名“等同于调用此属性的getter方法。
4.4 动态SQL之代码片段
这是sql语句复用的一种方式.
1.在mapper标签下:<sql id="studentSql">select * from student</sql>
,id是自定义的标识。
2.在要使用sql标签中包含的sql片段的地方用<include refid="studentSql"/>
,其中refid是要使用的sql标签的id属性值。
五、MyBatis框架配置文件
5.1 主配置文件
settings:配置myBatis全局行为。参加官方参考文档3.1.2(了解即可,大部分设置使用默认值)
5.2 dataSource标签
见2.2 案例第6中的内容。
5.3 事务
同上。
5.4 使用数据库属性配置文件
将数据库的连接信息放在一个单独的文件中进行管理。和myBatis主配置文件分开,便于修改、保存,或者处理多个数据库信息。
配置文件的文件名:XXX.properties
配置文件的文件内容:等同于JDBC中提到的配置文件的内容。采用key=value的形式,key使用"."进行多级分隔。例如,创建jdbc.properties文件:
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/school?serverTimezone=UTC
jdbc.user=root
jdbc.password=154916
在主配置文件中,首先在<configuration/>
标签下指定jdbc.properties文件的位置信息:<properties resource="配置文件从类路径(classes)开始的相对目录路径" />
,然后在<property/>
标签中使用到value的位置用${key}
l来代替,例如:<property name="driver" value="${jdbc.driver}"/>
.
5.5 typeAliases(别名)
参见3.3.1 2)中的内容
5.6 mappers(映射器)
当有多个mapper文件时:
方法一:写多个<mapper/>
标签;
方法二:使用包名。例如<package name="com.yang.dao" />
可以将com.yang.dao这个包下的所有.xml文件一次性加载给MyBatis。这就要求1)mapper文件名称与接口名称一样,严格区分大小写;2)mapper文件与接口在相同目录下。
六、扩展
PageHelper
完成数据分页功能。
1.在Maven中添加PageHelper依赖。
<!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.10</version>
</dependency>
2.在MyBatis主配置文件中加入plugin插件配置:
将以下代码复制到<environments/>
标签之前:
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>
3.使用:在获取到dao接口对象之后,执行抽象方法之前,调用静态方法PageHelper.StartPage,调用抽象方法之后就自动实现了分页查询。
PageHelper.StartPage(int pageNum, int pageSize);//pageNum表示页数,从1开始,pageSize表示每页行数。