Mybatis学习笔记

Mybatis

  • mybatis的事务默认是不自动提交的

  • 主配置文件添加这个可以显示日志

    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING" />
    </settings>
    

1. 框架概述

1.1 三层架构

界面层(controller包)

springmvc框架

和用户对接,接受用户的请求参数,显示处理结果。

jsp、html、servlet



业务逻辑层(XXXservice包)

spring框架

接收界面层传递的数据,计算逻辑,调用数据库,获取数据



数据访问层(XXXDao包)

mybatis框架

访问数据库,执行对象数据的查询等操作


在这里插入图片描述



1.2 框架概念

框架是一个模板,其中已经定义好了一些功能,这些功能是可用的,可以在项目中加入自己的功能。

框架是一个半成品软件,定义好的基础功能是可重复使用的,可升级的。

框架特点:

  1. 不是全能,不能做所有事情
  2. 只是针对某一个领域有效
  3. 是一个软件

1.3 Mybatis简介

Mybatis是一个sql映射框架,提供数据库的操作能力,增强的JDBC,使用这个只需要写好sql语句即可


Mybatis是一个框架,早期叫做ibatis

MyBatis SQL Mapper Framework for Java (sql映射框架)

  1. sql mapper:sql映射

    把数据库表中的一行数据映射成一个java对象,一行数据可以看作是一个java对象。操作这个对象,就相当于操作表中的数据

  2. Data Access Objects(DAOs):数据访问

    对数据库执行增删改查


提供的功能

  • 创建Connection、Statement等能力
  • 执行sql语句
  • 循环sql,将结果转为java对象,List集合
  • 关闭资源

开发人员只需提供sql语句



2. 分析JDBC缺点

重复代码太多,开发效率降低

在这里插入图片描述

以上过程完全可以使用反射机制代替,而Mybatis框架就是别人提前写好的java代码,这Mybatis框架封装了JDBC代码,Mybatis框架就是别人已经写好的java代码。


sql编写在java程序中

sql语句可能在后期是需要调优的,语句被修改的概率很高,然而在修改了sql语句导致java代码重新编译,项目重新部署,十分繁琐…

严重违背开闭原则:OCP



3. 实现步骤

3.1 加入依赖

<dependencies>
    <dependency>
        <groupId>com.microsoft.sqlserver</groupId>
        <artifactId>mssql-jdbc</artifactId>
        <version>9.2.0.jre15</version>
    </dependency>

    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.6</version>
    </dependency>
</dependencies>

3.2 创建数据实体类

public class Student {
    private String sno;
    private String sname;
    private String ssex;
    private Integer sage;
    private  String sdept;

    public String getSno() {
        return sno;
    }

    public void setSno(String sno) {
        this.sno = sno;
    }

    @Override
    public String toString() {
        return "Student{" +
                "sno='" + sno + '\'' +
                ", sname='" + sname + '\'' +
                ", ssex='" + ssex + '\'' +
                ", sage=" + sage +
                ", sdept='" + sdept + '\'' +
                '}';
    }

    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }

    public String getSsex() {
        return ssex;
    }

    public void setSsex(String ssex) {
        this.ssex = ssex;
    }

    public Integer getSage() {
        return sage;
    }

    public void setSage(Integer sage) {
        this.sage = sage;
    }

    public String getSdept() {
        return sdept;
    }

    public void setSdept(String sdept) {
        this.sdept = sdept;
    }
}

3.3 创建dao接口

其中定义操作数据库的方法

public interface StudentDao {
    // 查询所有数据
    List<Student> findAll();
}

3.4 创建sql映射文件

在这里插入图片描述

<!--
    sql映射文件:在其中写sql语句,mybatis会执行这些sql
    1. 指定约束文件
        mybatis-3-mapper.dtd是约束文件的名称,扩展名是dtd

        约束文件的作用:限制,检查当前文件中出现的标签,属性必须符合mybatis的要求

   	2. mapper标签
        当前文件的根标签,是必须的。

       	namespace(命名空间):唯一值,可以自定义,但是要求使用dao接口的全限定名称

   	3. 在当前文件中,可以使用特定的标签,表示数据库的操作
        <select>:查询
        <update>:更新
        <insert>:插入
        <delete>:删除
-->

<?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.company.dao.StudentDao">

    <!--
        select : 表示查询操作
        id : 表示要执行sql语句的唯一标识,mybatis会使用这个id值找到要执行的sql语句
             可自定义,但是要求使用接口中的方法名称
        resultType : 表示结果类型,是sql语句执行后得到结果的类型
	-->
    <select id="findAll" resultType="com.company.domain.Student">
        select Sno, Sname, Ssex, Sage, Sdept from Student where Ssex = '女'
    </select>
</mapper>

3.5 创建jdbc配置文件

在resources下写properties文件

jdbc.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
jdbc.url=jdbc:sqlserver://localhost:1433;Database=S_T
jdbc.user=sa
jdbc.password=xxxxqq76985

3.5 创建主配置文件

<?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>
    <!-- 定义配置文件路径 -->
    <properties resource="jdbc.properties" />
        
    <!-- 
		settings,打印日志到控制台 
		其中还有很多的settings配置,但是大多数采用默认值即可,不需要手工配置
	-->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING" />
    </settings>
    
    <!-- 配置java类的别名 -->
    <typeAliases>
        <typeAlias type="com.company.vo.SelectAge" alias="SelectAge" />
        <package name="com.company.domain" />
    </typeAliases>
    
    <!-- 配置插件,一定要放在environments前面 -->
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor" />
    </plugins>
    
    <!-- 默认使用developmet环境 -->
    <environments default="development">
        <!--
            environment:一个数据库信息的配置
            id:一个唯一值,表示环境的名称
        -->
        <environment id="development">
            <!--
                transactionManager:mybatis的事务类型
                type: JDBC		(表示使用jdbc中的Connection对象的commit,rollback做事务处理)
					  MANAGED	(把mybatis的事务处理委托给其他容器,一个服务器软件,一个框架等等)
            -->
            <transactionManager type="JDBC"/>
            <!--
                dataSource:表示数据源,连接数据库的,实现了javax.sql.DataSource接口都是数据源
                type:表示数据源的类型,POOLED表示使用连接池,UNPOOLED表示不使用连接池,创建连接再关闭
            -->
            <dataSource type="POOLED">
                <!--
                    driver, user, username, password 都是固定的,不能修改
                -->
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.user}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>

    <!--
        sql mapper(sql映射文件)的位置
    -->
    <mappers>
        <!--
            一个mapper指定一个文件的位置
            从类路径开始
        -->
        
        <!-- 第一种方式 -->
        <mapper resource="com/company/dao/StudentDao.xml"/>
        
        <!-- 第二种方式
 			 name: xml文件(mapper文件)所在的包名,这个包中所有的xml文件一次都能加载给mybatis
		     要求: 
			  	1. mapper文件名称需要和接口名称完全相同
				2. mapper文件和dao接口需要在同一目录
		-->
        <package name="com.company.dao" />
        
    </mappers>
</configuration>

必须指定mapper映射文件,因为在写sqlId的时候,会在指定mapper中寻找namespace


3.6 访问数据库

import com.company.domain.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 Test {
    public static void main(String[] args) throws IOException {
        // 1. 定义mybatis主配置文件的名称,从类路径开始
        String config = "data.xml";
        // 2. 读取这个config表示的文件
        InputStream is = Resources.getResourceAsStream(config);
        // 3. 创建SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        // 4. 创建SqlSessionFactory对象
        SqlSessionFactory factory = builder.build(is);
        // 5. [重要] 获取SqlSession对象
        SqlSession sqlSession = factory.openSession();
        // 6. [重要] 指定要执行sql语句的标识,sql映射文件中的namespace + "." + 标签的id值
        String sqlId = "com.company.dao.StudentDao" + "." + "findAll";
        // 7. 执行sql语句
        List<Student> studentList = sqlSession.selectList(sqlId);
        // 8. 输出结果
        for (Student student : studentList) {
            System.out.println(student);
        }
        // 9. 关闭SqlSession对象
        sqlSession.close();
    }
}

String sqlId = “com.company.dao.StudentDao” + “.” + “findAll”;

com.company.dao.StudentDao匹配的是StudentDao的namespace


4. 实现类介绍

  1. Resources

    mybatis中的一个类,负责读取主配置文件

  2. SqlSessionFactoryBuilder

    创建SqlSessionFactory对象

  3. SqlSessionFactory(接口)

    重要对象,创建该对象耗时长,使用资源多,只要一个即可

    获取SqlSession对象

    openSession说明:

    • 无参数,获取到非自动提交事务的SqlSession对象
    • true,获取自动提交事务的SqlSession对象
  4. SqlSession(接口)

    定义了操作数据的方法

    SqlSession不是线程安全的,需要在方法内部使用,使用后关闭才能保证线程安全


5. 获取session封装

public class MybatisUtil {
    private static SqlSessionFactory factory;

    /*
      类加载时获取factory,factory只需要一个就行
     */
    static {
        String config = "data.xml";
        try {
            InputStream is = Resources.getResourceAsStream(config);
            factory = new SqlSessionFactoryBuilder().build(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private MybatisUtil() {}

    public static SqlSession getSqlSession() {
        return factory.openSession();
    }

    public static SqlSession getSqlSession(boolean flag) {
        return factory.openSession(flag);
    }
}

6. 动态代理实现类

Mybatis帮你创建dao接口的实现类,在实现类中调用SqlSession的方法执行sql语句

(反射机制)

实现动态代理的条件

  • dao接口和mapper文件尽量放在一起
  • dao接口和mapper文件名称一致
  • mapper文件中的namespace是dao接口的全限定名称
  • mapper文件中的操作标签id值是接口中的方法名称
  • dao接口不要使用重载方法(同名,不同参数)
public class Main {
    public static void main(String[] args) {
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        // 动态代理获取接口实现类
        StudentDao dao = sqlSession.getMapper(StudentDao.class);
        List<Student> studentList = dao.findAll();
        for (Student student : studentList) {
            System.out.println(student);
        }
        sqlSession.close();
    }
}

7. 深入理解参数

public interface StudentDao {
    // 查询所有数据
    List<Student> findAll();
    // 插入数据
    int insert(Student stu);
    // 根据Sno删除
    int deleteBySno(String sno);
    // 根据姓名年龄查询
    List<Student> findByNameSex (@Param("name") String name, @Param("sex") String sex);
}

动态代理创建的实现类执行方法时,会检测出参数的类型,自动会赋给sql语句中的占位符

但是如果参数类型是类,那么占位符中的名字必须是类中的属性名,动态代理机制会检测出该属性名的getter方法

#{传入类的属性名}


7.1 传入单个简单参数

这个占位符名字任意(前面是#的前提)

#{任意字符}

${指定名称}

简单参数

  • java中基本数据类型
  • String类型

<delete id="deleteBySno">
    delete from Student where Sno=#{sno}
</delete>
public void testDelete() {
    SqlSession sqlSession = MybatisUtil.getSqlSession();

    StudentDao dao = sqlSession.getMapper(StudentDao.class);

    Student stu = new Student();
    stu.setSno("201515010");

    int num = dao.deleteBySno("201515010");
    sqlSession.commit();
    System.out.println(num);

    // 9. 关闭SqlSession对象
    sqlSession.close();
}

7.2 传入多个简单参数

public void testFindByNameSex() {
    SqlSession sqlSession = MybatisUtil.getSqlSession();
    StudentDao dao = sqlSession.getMapper(StudentDao.class);
    String name = "张";
    String sex = "男";
    List<Student> studentList = dao.findByNameSex(name, sex);
    for (Student student : studentList) {
        System.out.println(student);
    }
    sqlSession.close();
}

7.2.1 使用注解(重要)

如果方法需要传入多个参数,需要在定义方法参数中使用注解指定在sql映射文件中占位符的名称

List<Student> findByNameSex (@Param("name") String name, @Param("sex") String sex);
<select id="findByNameSex" resultType="com.company.domain.Student">
    select Sno, Sname, Ssex, Sage, Sdept
    from Student
    where Ssex = #{sex} and Sname like CONCAT('%',#{name},'%')
</select>

7.2.2 封装参数(重要)

这个方法是将参数封装成对象,类似于sqlSession.insert(String sqlId, Object obj)

在原方法中通过obj的getter方法找到参数,而封装参数就类似于此

public class FindByNameSex {
    private String paramName;
    private String paramSex;

    public String getParamName() {
        return paramName;
    }

    public void setParamName(String paramName) {
        this.paramName = paramName;
    }

    public String getParamSex() {
        return paramSex;
    }

    public void setParamSex(String paramSex) {
        this.paramSex = paramSex;
    }
}
List<Student> findByNameSex (FindByNameSex params);
<select id="findByNameSex" resultType="com.company.domain.Student">
    select Sno, Sname, Ssex, Sage, Sdept
    from Student
    where Sname like CONCAT('%',#{paramName},'%') and Ssex = #{paramSex}
</select>

简化写法是:#{属性名}

具体写法是:#{属性名, javaType=属性名类型, jdbcType=属性在数据库的类型}

javaType和jdbcType是能在mybatis反射获取


7.2.3 指定顺序

Parameter ‘id’ not found. Available parameters are [arg1, arg0, param1, param2],这句话的意思就是id找不到,可用的参数是[arg1, arg0, param1, param2]。所以可使用参数出现的顺序号码引用参数,第一个参数用arg0或param1表示,第二个参数用arg1或param2表示,以此类推(arg从0开始计数,param从1开始计数)。


<select id="findByNameSex" resultType="com.company.domain.Student">
    select Sno, Sname, Ssex, Sage, Sdept
    from Student
    where Sname like CONCAT('%',#{arg0},'%') and Ssex = #{arg1}
</select>

7.2.4 封装map

在主函数中将参数封装成map集合,key是映射文件占位符的名字,value就是占位符的值

这种方式不推荐!!!

因为别人看代码十分不方便

/**
     * 按照姓名和性别封装的集合查询
     * @param params 参数集合
     * @return 学生集合
     */
List<Student> findByNameSex (Map<String, Object> params);
public void testFindByNameSex() {
    SqlSession sqlSession = MybatisUtil.getSqlSession();
    StudentDao dao = sqlSession.getMapper(StudentDao.class);
    Map<String, Object> params = new HashMap<>();
    params.put("myName", "张");
    params.put("mySex", "男");
    List<Student> studentList = dao.findByNameSex(params);
    for (Student student : studentList) {
        System.out.println(student);
    }
    sqlSession.close();
}
<select id="findByNameSex" resultType="com.company.domain.Student">
    select Sno, Sname, Ssex, Sage, Sdept
    from Student
    where Sname like CONCAT('%',#{myName},'%') and Ssex = #{mySex}
</select>

7.3 $和#的区别

select * from student where id=#{studentId}

select * from student where id=?

select * from student where id=${studentId}

select * from student where id=1001


#{}${}
使用PreparedStatement使用Statement
效率高效率低
大程度避免SQL注入无法避免SQL注入
可替换表名或列名

8. 封装输出结果

8.1 resultType

输出的参数类型最好是全限定名称

可以是别名


8.1.1 简单类型参数

<select id="countStudent" resultType="java.lang.Integer">
    select count(*) from Student
</select>

8.1.2 对象类型参数

注意

  • 封装对象的属性名要和字段名相同(不区分大小写)
  • 封装对象一定要有setter和getter方法

封装输出对象

public class SelectAge {
    private String sname;
    private int sage;

    public String getStuName() {
        return sname;
    }

    public void setStuName(String sname) {
        this.sname = sname;
    }

    public int getStuAge() {
        return sage;
    }

    public void setStuAge(int sage) {
        this.sage = sage;
    }

    @Override
    public String toString() {
        return "SelectAge{" +
                "sname='" + sname + '\'' +
                ", sage=" + sage +
                '}';
    }
}

输出结果设为该对象

<select id="selectAge" resultType="com.company.vo.SelectAge">
    select Sname, Sage from Student
</select>

执行查找

@Test
public void testSelectAge() {
    SqlSession sqlSession = MybatisUtil.getSqlSession();
    StudentDao dao = sqlSession.getMapper(StudentDao.class);
    List<SelectAge> stuList = dao.selectAge();
    for (SelectAge stu : stuList) {
        System.out.println(stu);
    }
    sqlSession.close();
}

8.1.3 Map

返回的对象是Map的话,列名是key,值是value

但是不能返回多个map,除非使用List<Map<Object, Object>>封装Map


8.2 resultMap

resultMap的作用是当封装对象的属性名和列名不一致的时候

在sql映射文件中配置属性名和字段名的映射关系


如果不使用resultMap,封装对象的属性名必须和字段名相同(不区分大小写)


<?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.company.dao.StudentDao">
    
    <select id="selectAge" resultMap="selectAge">
        select Sno, Sname, Sage from Student
    </select>
   
    <resultMap id="selectAge" type="com.company.vo.SelectAge">
        <id column="Sno" property="stuId" />
        <result column="Sname" property="stuName" />
        <result column="Sage" property="stuAge" />
    </resultMap>
    
</mapper>

主键字段使用id

其他字段使用result


8.3 as重写字段名

为使属性名和字段名匹配,在不使用resultMap时,可在sql语句中重写字段名使其与属性名一致


<select id="selectAge" resultType="com.company.vo.SelectAge">
    select Sno as stuId, Sname as stuName, Sage as stuAge from Student
</select>

8.3 定义封装对象别名

定义返回封装对象别名是在主配置文件中配置


第一种方式

<typeAliases>
    <typeAlias type="com.company.vo.SelectAge" alias="SelectAge" />
</typeAliases>
<select id="selectAge" resultType="SelectAge">
    select Sname, Sage from Student
</select>

第二种方式

name是包名,这个包中的所有类的类名就是别名,此时类名不区分大小写


<typeAliases>
    <package name="com.company.domain" />
</typeAliases>
<select id="findByNameSex" resultType="student">
    select Sno, Sname, Ssex, Sage, Sdept
    from Student
    where Sname like CONCAT('%',#{myName},'%') and Ssex = #{mySex}
</select>



9. 动态SQL

根据条件,能够得到不同的sql语句,使用mybatis的标签即可实现


9.1 if

<if test="判断传入java对象的属性值">
	部分sql语句
</if>

示例:

<select id="selectAgeIf" resultMap="selectAge">
    select Sno, Sname, Sage from Student
    where Sno > 0
    <if test="sname != null and sname != ''">
        and Sname = #{sname}
    </if>
    <if test="sage > 0">
        or Sage > #{sage}
    </if>
</select>
public void testSelectAgeIf() {
    SqlSession sqlSession = MybatisUtil.getSqlSession();
    StudentDao dao = sqlSession.getMapper(StudentDao.class);
    Student stu = new Student();
    stu.setSname("张力");
    stu.setSage(19);
    List<SelectAge> stuList = dao.selectAgeIf(stu);
    for (SelectAge student : stuList) {
        System.out.println(student);
    }
}

在这里插入图片描述



9.2 where

用来包含多个 的

当多个if中有只有一个成立,会自动增加一个where关键字并去除多余的and,or等

当多个if中有多个if成立,会自动删除第一个if中多余的and,or等,其余if中多余字段保留


示例:

<select id="selectAgeIf" resultMap="selectAge">
    select Sno, Sname, Sage from Student
    <where>
    <if test="sname != null and sname != ''">
        and Sname = #{sname}
	</if>
    <if test="sage > 0">
        or Sage > #{sage}
	</if>
    </where>
</select>
@Test
public void testSelectAgeIf() {
    SqlSession sqlSession = MybatisUtil.getSqlSession();
    StudentDao dao = sqlSession.getMapper(StudentDao.class);
    Student stu = new Student();
    stu.setSname("张力");
    stu.setSage(19);
    List<SelectAge> stuList = dao.selectAgeIf(stu);
    for (SelectAge student : stuList) {
        System.out.println(student);
    }
}

在这里插入图片描述



9.3 foreach

循环java数组,list集合的。主要用于sql的in语句中


相关标签参数:

  • collection

    接口中方法参数的类型,数组是array,集合是list

  • item

    自定义,表示成员变量

  • open

    循环开始时的字符

  • close

    循环结束时的字符

  • separator

    集合成员之间的分隔符


示例:

<select id="selectAgeFor" resultMap="selectAge">
    select Sno, Sname, Sage from Student where Sno in
    <foreach collection="list" item="id" open="(" close=")" separator=",">
        #{id}
    </foreach>
</select>
@Test
public void testSelectAgeFor() {
    SqlSession sqlSession = MybatisUtil.getSqlSession();
    StudentDao dao = sqlSession.getMapper(StudentDao.class);
    List<String> idList = new ArrayList<>();
    idList.add("201415010");
    idList.add("201415011");
    idList.add("201415012");

    List<SelectAge> stuList = dao.selectAgeFor(idList);
    for (SelectAge student : stuList) {
        System.out.println(student);
    }
}

在这里插入图片描述


foreach标签的用法有很多巧妙之处:

<select id="selectAgeFor" resultMap="selectAge">
    select Sno, Sname, Sage from Student where Sno in
    <foreach collection="list" item="id" open="(" close=")">
        #{id} ,
    </foreach>
</select>

结果:
select Sno, Sname, Sage from Student where Sno in ( ? , ? , ? , ) 
<select id="selectAgeFor" resultMap="selectAge">
    select Sno, Sname, Sage from Student where Sno in(
    <foreach collection="list" item="id">
        #{id} ,
    </foreach>
    -1, )
</select>

结果:
select Sno, Sname, Sage from Student where Sno in( ? , ? , ? , -1, )

如果集合或者数组中封装的是对象,需要遍历对象当中固定某个属性,可以使用 #{对象.属性名} 遍历



9.4 代码复用

可以将多次出现的sql语句进行复用

<sql id="allAttr">
    select Sno, Sname, Ssex, Sage, Sdept from Student
</sql>
<select id="findAll" resultType="com.company.domain.Student">
    <include refid="allAttr" />
    where Ssex = '男'
</select>

<select id="findByNameSex" resultType="student">
    <include refid="allAttr" />
    where Sname like #{name} and Ssex = #{sex}
</select>



10. 分页输出

通过一个插件能够将结果分页显示,这个功能不是mybatis提供的


10.1 导入依赖项

<dependency>
  <groupId>com.github.pagehelper</groupId>
  <artifactId>pagehelper</artifactId>
  <version>5.2.0</version>
</dependency>

10.2 主配置文件导入插件

<!-- 配置插件,一定要放在environments前面 -->
<plugins>
    <plugin interceptor="com.github.pagehelper.PageInterceptor" />
</plugins>

<environments default="development">

    <environment id="development">
        ...

10.3 实现分页

@Test
public void testFindAll() {
    SqlSession sqlSession = MybatisUtil.getSqlSession();
    StudentDao dao = sqlSession.getMapper(StudentDao.class);
    // 实现分页操作
    PageHelper.startPage(1,5);
    List<Student> studentList = dao.findAll();
    for (Student student : studentList) {
        System.out.println(student);
    }
    sqlSession.close();
}

这个PageHelper.startPage(1,5);表示第一页的五行数据,如果要查看第二页的五行数据则是PageHelper.startPage(2,5);
可以将多次出现的sql语句进行复用

<sql id="allAttr">
    select Sno, Sname, Ssex, Sage, Sdept from Student
</sql>
<select id="findAll" resultType="com.company.domain.Student">
    <include refid="allAttr" />
    where Ssex = '男'
</select>

<select id="findByNameSex" resultType="student">
    <include refid="allAttr" />
    where Sname like #{name} and Ssex = #{sex}
</select>



10. 分页输出

通过一个插件能够将结果分页显示,这个功能不是mybatis提供的


10.1 导入依赖项

<dependency>
  <groupId>com.github.pagehelper</groupId>
  <artifactId>pagehelper</artifactId>
  <version>5.2.0</version>
</dependency>

10.2 主配置文件导入插件

<!-- 配置插件,一定要放在environments前面 -->
<plugins>
    <plugin interceptor="com.github.pagehelper.PageInterceptor" />
</plugins>

<environments default="development">

    <environment id="development">
        ...

10.3 实现分页

@Test
public void testFindAll() {
    SqlSession sqlSession = MybatisUtil.getSqlSession();
    StudentDao dao = sqlSession.getMapper(StudentDao.class);
    // 实现分页操作
    PageHelper.startPage(1,5);
    List<Student> studentList = dao.findAll();
    for (Student student : studentList) {
        System.out.println(student);
    }
    sqlSession.close();
}

这个PageHelper.startPage(1,5);表示第一页的五行数据,如果要查看第二页的五行数据则是PageHelper.startPage(2,5);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值