栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【学习笔记】MyBatis学习笔记

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【学习笔记】MyBatis学习笔记

本文是动力节点MyBatis教程的学习笔记。

第一章 1. 三层架构 (1) 三层的功能
  • 表示层(User Interface Layer):接受用户数据,显示请求的处理结果,包括jsp、html、servlet等。对应controller包;

  • 业务逻辑层(Business Logic Layer):接受表示层传递过来的数据,检查数据,计算业务逻辑,调用数据访问层获取数据。对应service包;

  • 数据访问层(Data Access Layer,DAL):也称持久层,与数据库打交道。对应DAO包。

(2) 三层中类的交互

用户使用表示层 --> 业务逻辑层 --> 数据访问层 --> 数据库

(3) 三层对应的处理框架

表示层 ---- servlet ---- SpringMVC框架

业务逻辑层 ---- service类 ---- Spring框架

数据访问层 ---- DAO类 ---- MyBatis框架

2. JDBC编程 (1) JDBC实例
public void findStudent() {
    Connection conn = null;
    Statement stmt = null;
    ResultSet rs = null;
    try { //注册mysql驱动
        Class.forName("com.mysql.jdbc.Driver");
        // 连接数据的基本信息 url ,username,password
        String url = "jdbc:mysql://localhost:3306/springdb";
        String username = "root";
        String password = "123456";
        // 创建连接对象
        conn = DriverManager.getConnection(url, username, password);
        // 保存查询结果
        List stuList = new ArrayList<>();
        // 创建Statement, 用来执行sql语句 
        stmt = conn.createStatement();
        // 执行查询,创建记录集,
        rs = stmt.executeQuery("select * from student");
        while (rs.next()) {
            Student stu = new Student();
            stu.setId(rs.getInt("id"));
            stu.setName(rs.getString("name"));
            stu.setAge(rs.getInt("age"));
            // 从数据库取出数据转为Student对象,封装到List集合
            stuList.add(stu);
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            //关闭资源 
            if (rs != null) ;
            {
                rs.close();
            }
            if (stmt != null) {
                stmt.close();
            }
            if (conn != null) {
                conn.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
(2) JDBC缺点
  • 代码较多,开发效率低
  • 需要关注Connection、Statement、ResultSet对象的创建和销毁
  • 对ResultSet查询的结果,需要自己封装为List
  • 重复的代码多
  • 业务代码和数据库操作混在一起
3. MyBatis框架概述 (1) MyBatis功能

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

数据访问:对数据库执行增删改查

  • 注册数据库的驱动
  • 创建 JDBC中必须使用的Connection、Statement、ResultSet对象
  • 从 xml中获取中获取sql,执行sql语句,把ResultSet结果转换为java对象
  • 关闭资源
(2) 入门案例

项目名为01-helloMyBatis,目录的结构如下:

1) 创建student表并插入数据

在MySQL的mybatis库中创建student表:

CREATE TABLE `student` (
  `id` int NOT NULL,
  `name` varchar(80) NOT NULL,
  `email` varchar(100) NOT NULL,
  `age` int NOT NULL,
  PRIMARY KEY (`id`,`age`)
) ENGINE=InnoDB;


INSERT INTO `student` VALUES ('1001', '李四', 'lisi@qq.com', '11');
INSERT INTO `student` VALUES ('1002', '张三', 'zhangsan@126.com', '12');
2) 加入maven的MyBatis坐标,MySQL驱动的坐标

创建maven工程,在pom.xml文件中添加以下依赖


    org.mybatis
    mybatis
    3.4.5




    mysql
    mysql-connector-java
    8.0.21




    org.projectlombok
    lombok
    1.18.12

其中版本号可以不一样,lombok提供的@Data注解可以为实体类添加get、set、toString方法等,以简化代码。

3) 创建实体类Student
package cn.ecnu.domain;

import lombok.Data;

// 推荐和表名一样,方便记忆
@Data
public class Student {
    // 定义属性,目前要求属性名和列名一致
    private Integer id;
    private String name;
    private String email;
    private Integer age;
}
4) 创建持久层的DAO接口,定义操作数据库的方法
package cn.ecnu.dao;

import cn.ecnu.domain.Student;

import java.util.List;

// 接口操作student表
public interface StudentDAO {

    // 查询student表的所有的数据
    public List selectStudents();
}
5) 创建一个MyBatis使用的配置文件

也叫做SQL映射文件:写sql语句,一般一个表一个sql映射文件,为xml文件




    
    
    select id,name,email,age from student where name=#{myname} or age=#{myage};

在StudentTest.java中添加:

@Test
public void selectMultiParmTest() {
    SqlSession sqlSession = MyBatisUtils.getSqlSession();
    StudentDAO dao = sqlSession.getMapper(StudentDAO.class);
    // 调用dao的方法,执行数据库的操作
    List studentList = dao.selectMultiPram("张飞", 22);
    for (Student student : studentList) {
        System.out.println(student);
    }
}
(3) 多个参数 - 使用对象

添加查询参数的实体类cn.ecnu.vo.QueryParam.java,其内容为:

package cn.ecnu.vo;

import lombok.Data;

@Data
public class QueryParam {
    private String paramName;
    private Integer paramAge;
}

在StudentDAO.java中添加:

List selectMultiObject(QueryParam param);

在StudentDAO.xml中添加:


    select id,name,email,age from student;

在StudentTest.java中添加:

@Test
public void selectAllStudentsTest() {
    
    SqlSession sqlSession = MyBatisUtils.getSqlSession();
    StudentDAO dao = sqlSession.getMapper(StudentDAO.class);
    // 调用dao的方法,执行数据库的操作
    List studentList = dao.selectAllStudents();
    for (Student student : studentList) {
        System.out.println(student);
    }
}
(4) 处理字段名和属性名不同的第二种方法

创建MyStudent.java实体类:

package cn.ecnu.domain;

import lombok.Data;

// 推荐和表名一样,方便记忆
@Data
public class MyStudent {
    // 定义属性,目前要求属性名和列名一致
    private Integer stuId;
    private String stuName;
    private String stuEmail;
    private Integer stuAge;
}

在StudentDAO.java中添加:

 List selectMyStudent();

在StudentDAO.xml中添加:



    select id,name,email,age from student where name like #{name};




    select id,name,email,age from student
    where 1 = 1
    
        and name = #{name}
    
    
        or age > #{age}
    

在StudentTest.java中添加:

@Test
public void selectStudentIfTest() {
    SqlSession sqlSession = MyBatisUtils.getSqlSession();
    StudentDAO dao = sqlSession.getMapper(StudentDAO.class);

    Student student = new Student();
    student.setName("李四");
    student.setAge(20);

    // 调用dao的方法,执行数据库的操作
    List studentList = dao.selectStudentIf(student);
    for (Student stu : studentList) {
        System.out.println(stu);
    }
}
2. 标签

用来包含多个标签的,当多个if有一个成立时,会自动增加一个where关键字,并去掉if中多余的and、or等。

在StudentDAO.java中添加:

// where的使用
List selectStudentWhere(Student student);

在StudentDAO.xml中添加:


    select id,name,email,age from student
    where id in
    
        #{myid}
    

在StudentTest.java中添加:

@Test
public void selectStudentForeachOneTest() {
    SqlSession sqlSession = MyBatisUtils.getSqlSession();
    StudentDAO dao = sqlSession.getMapper(StudentDAO.class);

    List idList = new ArrayList<>();
    idList.add(1001);
    idList.add(1002);
    idList.add(1003);

    // 调用dao的方法,执行数据库的操作
    List studentList = dao.selectStudentForeachOne(idList);
    for (Student stu : studentList) {
        System.out.println(stu);
    }
}

在StudentDAO.java中添加:

List selectStudentForeachTwo(List Students);

在StudentDAO.xml中添加:


第五章 1. 数据库的属性配置文件

把数据库连接信息放到一个单独的文件中,和mybatis主配置文件分开,目的是便于修改、保存、处理多个数据库的信息。

  • 在resources目录定义一个属性配置文件,xxx.properties,例如jdbc.properties。在属性配置文件中,定义数据,格式是 key = value。key一般使用.做多级目录,例如 jdbc.mysql.driver

    # jdbc.properties文件中的内容
    jdbc.driver = com.mysql.jdbc.Driver
    jdbc.url = jdbc:mysql://localhost:3306/mybatis
    jdbc.username = root
    jdbc.password = root
    
  • 在mybatis的主配置文件中,使用标签指定文件的位置,在需要使用值的地方,使用${}

    
        
        
        
        
        
    
    
2. 多mapper文件的处理

当有多个mapper文件时,在mybatis的主配置文件中有两种导入方式

方式一:


    
    

方式二:


    
    

注意这两种方式不能并存,否则会报错。

第六章

PageHelper:做数据分页的

在pom.xml文件中添加依赖:


    com.github.pagehelper
    pagehelper
    5.1.10

在mybatis主配置文件mybatis.xml中添加:


    

在StudentDAO.java中添加接口方法:

// 使用PageHelper分页插件
List selectAll();

在StudentDAO.xml中添加对应的SQL,注意此处不能以分号结尾,否则字符串拼接时会出错:


在StudentTest.java中添加单元测试文件:

@Test
public void selectAllTest() {
    SqlSession sqlSession = MyBatisUtils.getSqlSession();
    StudentDAO dao = sqlSession.getMapper(StudentDAO.class);
    
    PageHelper.startPage(1, 2);
    List studentList = dao.selectAll();
    for (Student stu : studentList) {
        System.out.println(stu);
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/318027.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号