MyBatis

Posted lee-leo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis相关的知识,希望对你有一定的参考价值。

MyBatis

1.三层架构

三层架构:界面层(User Interface layer),业务逻辑层(Business Logic Layer),持久层(Data access layer)

三层架构通常对应的框架:

  • 界面层:SpringMVC

  • 业务层:Spring

  • 持久层:MyBatis

关于三层的职责:

  1. 界面层(表示层,视图层):主要功能是接收用户的数据,显示请求的处理结果。常为:html、jsp文件

  2. 业务逻辑层:接收界面层传递的数据,检查数据,调用持久层访问数据

  3. 持久层:与数据库打交道,主要实现对数据的增删改查。

三层的好处:

  1. 结构清晰、耦合度低, 各层分工明确

  2. 可维护性高,可扩展性高

  3. 有利于标准化

  4. 开发人员可以只关注整个结构中的其中某一层的功能实现

  5. 有利于各层逻辑的复用

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语句都在这个配置文件中写

要求:

  1. 在 dao 包中创建文件 StudentDao.xml

  2. 要 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 入门
*/
@Test
public void testStart() throws IOException {
   //1.mybatis 主配置文件
   String config = "mybatis-config.xml";
   //2.读取配置文件
   InputStream in = Resources.getResourceAsStream(config);
   //3.创建 SqlSessionFactory 对象,目的是获取 SqlSession
   SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
   //4.获取 SqlSession,SqlSession 能执行 sql 语句
   SqlSession session = factory.openSession();
   //5.执行 SqlSession 的 selectList()
   List<Student> studentList = session.selectList("com.bjpowernode.dao.StudentDao.selectStudents");
   //6.循环输出查询结果
   studentList.forEach( student -> System.out.println(student));
   //7.关闭 SqlSession,释放资源
   session.close();
}
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 查询方法会被进行分页。

@Test
public void testSelect() throws IOException {
   //获取第 1 页,3 条内容
   PageHelper.startPage(1,3);
   List<Student> studentList = studentDao.selectStudents();
   studentList.forEach( stu -> System.out.println(stu));
}

 

以上是关于MyBatis的主要内容,如果未能解决你的问题,请参考以下文章

SSM-MyBatis-05:Mybatis中别名,sql片段和模糊查询加getMapper

mybatis动态sql片段与分页,排序,传参的使用

MyBatis动态SQL标签用法

MYBATIS05_ifwherechoosewhentrimsetforEach标签sql片段

mybatis动态sql之利用sql标签抽取可重用的sql片段

[mybatis]动态sql_sql_抽取可重用的sql片段