MyBatis
Posted lee-leo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis相关的知识,希望对你有一定的参考价值。
1.三层架构
三层架构:界面层(User Interface layer),业务逻辑层(Business Logic Layer),持久层(Data access layer)
三层架构通常对应的框架:
-
界面层:SpringMVC
-
业务层:Spring
-
持久层:MyBatis
关于三层的职责:
-
界面层(表示层,视图层):主要功能是接收用户的数据,显示请求的处理结果。常为:html、jsp文件
-
业务逻辑层:接收界面层传递的数据,检查数据,调用持久层访问数据
-
持久层:与数据库打交道,主要实现对数据的增删改查。
三层的好处:
-
结构清晰、耦合度低, 各层分工明确
-
可维护性高,可扩展性高
-
有利于标准化
-
开发人员可以只关注整个结构中的其中某一层的功能实现
-
有利于各层逻辑的复用
2.MyBatis框架
2.1 maven插件
<build>
<resources>
<resource>
<directory>src/main/java</directory><!--所在的目录-->
<includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
2.2 编写Student实体类
创建包 domain, 包中创建 Student 类,要求属性名和数据表列名一致
2.3 编写Dao接口StudenDao
创建dao 包,创建 StudentDao 接口,并在接口处声明一个方法。
2.4 编写Dao接口Mapper映射文件StudentDao.xml
以后SQL语句都在这个配置文件中写
要求:
-
在 dao 包中创建文件 StudentDao.xml
-
要 StudentDao.xml 文件名称和接口 StudentDao 一样,区分大小写的一样。
2.5 创建主配置文件
项目 src/main 下创建 resources 目录,设置 resources 目录为 resources root 创建主配置文件:名称为 mybatis.xml/mybatis-config.xml 说明:主配置文件名称是自定义的,内容如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--配置 mybatis 环境-->
<environments default="mysql">
<!--id:数据源的名称-->
<environment id="mysql">
<!--配置事务类型:使用 JDBC 事务(使用 Connection 的提交和回滚)-->
<transactionManager type="JDBC"/>
<!--数据源 dataSource:创建数据库 Connection 对象
type: POOLED 使用数据库的连接池
-->
<dataSource type="POOLED">
<!--连接数据库的四个要素-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--告诉 mybatis 要执行的 sql 语句的位置-->
<mapper resource="com/bjpowernode/dao/StudentDao.xml"/>
</mappers>
</configuration>
2.6 创建测试类MyBatisTest
src/test/java/com/fw/ 创建 MyBatisTest.java 文件
/*
* mybatis 入门
*/
List<Student> studentList =session.selectList("com.bjpowernode.dao.StudentDao.selectStudents");
近似等价的 jdbc 代码
Connection conn = 获取连接对象
String sql=” select id,name,email,age from student”
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
2.7 配置日志功能
mybatis.xml 文件加入日志配置,可以在控制台输出执行的 sql 语句和参数
<settings>
<setting name="logImpl" value="STDOUT_LOGGING" />
</settings>
3.创建工具类
public class MyBatisUtil {
//定义 SqlSessionFactory
private static SqlSessionFactory factory = null;
static {
//使用 静态块 创建一次 SqlSessionFactory
try{
String config = "mybatis-config.xml";
//读取配置文件
InputStream in = Resources.getResourceAsStream(config);
//创建 SqlSessionFactory 对象
factory = new SqlSessionFactoryBuilder().build(in);
}catch (Exception e){
factory = null;//如果捕获到异常也将此关闭
e.printStackTrace();
}
}
/* 获取 SqlSession 对象 */
public static SqlSession getSqlSession(){
SqlSession session = null;
if( factory != null){
session = factory.openSession();
}
return session;
}
}
4.使用动态代理
通过getMapper方法获得代理对象
只需调用 SqlSession 的 getMapper()方法,即可获取指定接口的实现类对象。该方法的参数为指定 Dao 接口类的 class 值。 SqlSession session = factory.openSession(); StudentDao dao = session.getMapper(StudentDao.class); 使用工具类: StudentDao studentDao = MyBatisUtil.getSqlSession().getMapper(StudentDao.class);
5.参数
5.1 多个参数-使用@Param
当 Dao 接口方法多个参数,需要通过名称使用参数。 在方法形参前面加入@Param(“自定义参数名”), mapper 文件使用#{自定义参数名}。 例如定义 List<Student> selectStudent( @Param(“personName”) String name ) { … } mapper 文件 select * from student where name = #{ personName} 接口方法: List<Student> selectMultiParam(@Param("personName") String name, @Param("personAge") int age); mapper 文件:
<select id="selectMultiParam" resultType="com.bjpowernode.domain.Student">
select id,name,email,age from student where name=#{personName} or age=#{personAge}
</select>
5.2 多个参数-使用对象
使用 java 对象传递参数, java 的属性值就是 sql 需要的参数值。 每一个属性就是一个参数。 语法格式: #{ property,javaType=java 中数据类型名,jdbcType=数据类型名称 } javaType, jdbcType 的类型 MyBatis 可以检测出来,一般不需要设置。常用格式 #{ property } mybatis-3.5.1.pdf 第 43 页 4.1.5.4 小节。
创建保存参数值的对象 QueryParam package com.bjpowernode.vo; public class QueryParam { private String queryName; private int queryAge; //set ,get 方法 } 接口方法: List<Student> selectMultiObject(QueryParam queryParam);
mapper 文件:
<select id="selectMultiObject" resultType="com.bjpowernode.domain.Student">
select id,name,email,age from student where name=#{queryName} or age
=#{queryAge}
</select>
或者
<select id="selectMultiObject" resultType="com.bjpowernode.domain.Student">
select id,name,email,age from student
where name=#{queryName,javaType=string,jdbcType=VARCHAR}
or age =#{queryAge,javaType=int,jdbcType=INTEGER}
</select>
6.扩展
基于PageHelper分页
(1)mave坐标
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.10</version>
</dependency>
(2)主配置文件中加入plugin配置
在<environments>之前加入
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor" />
</plugins>
(3)pageHleper对象
查询语句之前调用 PageHelper.startPage 静态方法。除了 PageHelper.startPage 方法外,还提供了类似用法的 PageHelper.offsetPage 方法。在你需要进行分页的 MyBatis 查询方法前调用 PageHelper.startPage 静态方法即可,紧跟在这个 方法后的第一个 MyBatis 查询方法会被进行分页。
以上是关于MyBatis的主要内容,如果未能解决你的问题,请参考以下文章
SSM-MyBatis-05:Mybatis中别名,sql片段和模糊查询加getMapper
MYBATIS05_ifwherechoosewhentrimsetforEach标签sql片段