当前位置:   article > 正文

MyBatis框架学习笔记(一):MyBatis入门

MyBatis框架学习笔记(一):MyBatis入门

1 MyBatis 介绍

1.1 官方文档

MyBatis 中文手册:

(1)https://mybatis.org/mybatis-3/zh/index.html

(2)https://mybatis.net.cn/

Maven 仓库:

https://mvnrepository.com/

仓库作用:需要什么 jar 包,搜索得到对应的 maven dependency

1.2 概述

1.2.1 为什么需要 MyBatis

传统的 Java 程序操作 DB 分析-工作示意图

1.2.2 MyBatis基本介绍

(1)MyBatis 是一个持久层框架

(2)前身是 ibatis, ibatis3.x 时,更名为 MyBatis

(3)MyBatis 在 java sql 之间提供更灵活的映射方案

(4)mybatis 可以将对数据表的操作(sql,方法)等等直接剥离,写到 xml 配置文件,实现和 java 代码的解耦

(5)mybatis 通过 SQL 操作 DB, 建库建表的工作需要程序员完成

1.2.3 MyBatis 工作原理示意图

 

MyBatis 快速入门

2.1 快速入门需求说明

要求: 开发一个 MyBatis 项目,通过 MyBatis 的方式可以完成对 monster 表的 crud 操作

2.2 快速入门-代码实现

(1) 创建 mybatis 数据库 - monster
  1. CREATE DATABASE `mybatis`;
  2. use `mybatis`;
  3. CREATE TABLE `monster` (
  4. `id` INT NOT NULL AUTO_INCREMENT,
  5. `age` INT NOT NULL,
  6. `birthday` DATE DEFAULT NULL,
  7. `email` VARCHAR(255) NOT NULL ,
  8. `gender` TINYINT NOT NULL,
  9. `name` VARCHAR(255) NOT NULL,
  10. `salary` DOUBLE NOT NULL,
  11. PRIMARY KEY (`id`)
  12. ) CHARSET=utf8

(2)创建 maven 项目, 方便项目需要 jar 包管理

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <!--
  7. 1. 将mybatis作为父项目管理多个子模块/子项目
  8. 2. 父项目的完整的坐标 groupId[组织名]+artifactId[项目名]
  9. 3. 后面该父项目会管理多个子模块/子项目 , 将来父项目中的引入的依赖可以直接给子项目用
  10. , 这样开发简单,提高复用性,也便于管理
  11. 4. <packaging>pom</packaging> 表示父项目以多个子模块/子项目管理工程
  12. -->
  13. <groupId>org.example</groupId>
  14. <artifactId>mybatis</artifactId>
  15. <version>1.0-SNAPSHOT</version>
  16. <packaging>pom</packaging>
  17. <!--
  18. modules指定管理的哪些子模块
  19. -->
  20. <modules>
  21. <module>mybatis_quickstart</module>
  22. </modules>
  23. <properties>
  24. <maven.compiler.source>8</maven.compiler.source>
  25. <maven.compiler.target>8</maven.compiler.target>
  26. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  27. </properties>
  28. <!--加入依赖-->
  29. <dependencies>
  30. <!--mysql依赖-->
  31. <dependency>
  32. <groupId>mysql</groupId>
  33. <artifactId>mysql-connector-java</artifactId>
  34. <version>5.1.49</version>
  35. </dependency>
  36. <!--mybatis依赖-->
  37. <dependency>
  38. <groupId>org.mybatis</groupId>
  39. <artifactId>mybatis</artifactId>
  40. <version>3.5.7</version>
  41. </dependency>
  42. <!--junit依赖-->
  43. <dependency>
  44. <groupId>junit</groupId>
  45. <artifactId>junit</artifactId>
  46. <version>4.12</version>
  47. <!--如果这里有一个scope-test 表示该jar的作用范围在test目录 -->
  48. <!--<scope>test</scope>-->
  49. </dependency>
  50. </dependencies>
  51. <!--在build中配置resources,来防止我们资源导出失败的问题
  52. 1. 不同的idea/maven 可能提示的错误不一样
  53. 2. 不变应万变,少什么文件,就增加相应配置即可
  54. 3. 含义是将 src/main/java目录和子目录 和 src/main/resources目录和子目录
  55. 的资源文件 xml 和 properties在build项目时,导出到对应的target目录下
  56. -->
  57. <build>
  58. <resources>
  59. <resource>
  60. <directory>src/main/java</directory>
  61. <includes>
  62. <include>**/*.xml</include>
  63. </includes>
  64. </resource>
  65. <resource>
  66. <directory>src/main/resources</directory>
  67. <includes>
  68. <include>**/*.xml</include>
  69. <include>**/*.properties</include>
  70. </includes>
  71. </resource>
  72. </resources>
  73. </build>
  74. </project>

(3)创建子项目mybatis_quickstart

(4)子模块自动生成的pom文件如下

 (5)父项目自动对pom增加的内容如下

(6)在java目录下创建 com.entity.Monster.java

  1. package com.entity;
  2. import java.util.Date;
  3. /**
  4. * Monster 和 monster表有对应关系
  5. */
  6. //1. 一个普通的Pojo类
  7. //2. 使用原生态的sql语句查询结果还是要封装成对象
  8. //3. 这里的实体类属性名和表名字段保持一致。
  9. public class Monster {
  10. //属性-和表字段有对应关系
  11. private Integer id;
  12. private Integer age;
  13. private String name;
  14. private String email;
  15. private Date birthday;
  16. private double salary;
  17. private Integer gender;
  18. public Monster() {
  19. }
  20. public Monster(Integer id, Integer age, String name, String email, Date birthday, double salary, Integer gender) {
  21. this.id = id;
  22. this.age = age;
  23. this.name = name;
  24. this.email = email;
  25. this.birthday = birthday;
  26. this.salary = salary;
  27. this.gender = gender;
  28. }
  29. public Integer getId() {
  30. return id;
  31. }
  32. public void setId(Integer id) {
  33. this.id = id;
  34. }
  35. public Integer getAge() {
  36. return age;
  37. }
  38. public void setAge(Integer age) {
  39. this.age = age;
  40. }
  41. public String getName() {
  42. return name;
  43. }
  44. public void setName(String name) {
  45. this.name = name;
  46. }
  47. public String getEmail() {
  48. return email;
  49. }
  50. public void setEmail(String email) {
  51. this.email = email;
  52. }
  53. public Date getBirthday() {
  54. return birthday;
  55. }
  56. public void setBirthday(Date birthday) {
  57. this.birthday = birthday;
  58. }
  59. public double getSalary() {
  60. return salary;
  61. }
  62. public void setSalary(double salary) {
  63. this.salary = salary;
  64. }
  65. public Integer getGender() {
  66. return gender;
  67. }
  68. public void setGender(Integer gender) {
  69. this.gender = gender;
  70. }
  71. @Override
  72. public String toString() {
  73. return "Monster{" +
  74. "id=" + id +
  75. ", age=" + age +
  76. ", name='" + name + '\'' +
  77. ", email='" + email + '\'' +
  78. ", birthday=" + birthday +
  79. ", salary=" + salary +
  80. ", gender=" + gender +
  81. '}';
  82. }
  83. }

(7)在com包下创建一个mapper包,再在mapper包下创建一个接口 MonsterMapper

  1. package com.mapper;
  2. import com.entity.Monster;
  3. import java.util.List;
  4. /**
  5. * 1. 这是一个接口
  6. * 2. 该接口用于声明操作monster表的方法
  7. * 3. 这些方法可以通过注解或者xml文件来实现
  8. */
  9. public interface MonsterMapper {
  10. //添加monster
  11. public void addMonster(Monster monster);
  12. //根据id删除一个Monster
  13. public void delMonster(Integer id);
  14. //修改Monster
  15. public void updateMonster(Monster monster);
  16. //查询-根据id
  17. public Monster getMonsterById(Integer id);
  18. //查询所有的Monster
  19. public List<Monster> findAllMonster();
  20. }

(8)在mapper包创建xml文件 MonsterMapper.xml

(9)配置 MonsterMapper.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <!--
  6. 1. 这是一个mapper xml 文件
  7. 2. 该文件可以去实现对应的接口的方法
  8. 3. namespace 指定该xml文件和哪个接口对应!!!
  9. -->
  10. <mapper namespace="com.mapper.MonsterMapper">
  11. <!--配置addMonster
  12. 1. id="addMonster" 就是接口的方法名
  13. 2. parameterType="com.entity.Monster" 放入的形参的类型
  14. 3. 注意"com.entity.Monster" 可以简写为 "Monster"
  15. 4. 写入sql语句
  16. 5. (`age`, `birthday`, `email`, `gender`, `name`, `salary`) 表的字段
  17. 6. (#{age}, #{birthday}, #{email}, #{gender}, #{name}, #{salary}) 是从传入的monster对象属性值
  18. 7. 这里 #{age} age 对应monster对象的属性名,其它一样
  19. -->
  20. <insert id="addMonster" parameterType="com.entity.Monster" useGeneratedKeys="true" keyProperty="id">
  21. INSERT INTO `monster`
  22. (`age`, `birthday`, `email`, `gender`, `name`, `salary`)
  23. VALUES (#{age}, #{birthday}, #{email}, #{gender}, #{name}, #{salary})
  24. </insert>
  25. <!--配置/实现delMonster方法
  26. 1. 这里 java.lang.Integer 这是Java类型, 可以简写成 Integer
  27. 2. 这里写入delete
  28. -->
  29. <delete id="delMonster" parameterType="Integer">
  30. DELETE FROM `monster` WHERE id = #{id}
  31. </delete>
  32. <!--配置实现 updateMonster-->
  33. <update id="updateMonster" parameterType="com.entity.Monster">
  34. UPDATE `monster`
  35. SET `age`=#{age} , `birthday`= #{birthday}, `email` = #{email},
  36. `gender` = #{gender} , `name`= #{name}, `salary` = #{salary}
  37. WHERE id = #{id}
  38. </update>
  39. <!--配置/实现getMonsterById-->
  40. <select id="getMonsterById" resultType="com.entity.Monster">
  41. SELECT * FROM `monster` WHERE id = #{id}
  42. </select>
  43. <!--配置/实现findAllMonster-->
  44. <select id="findAllMonster" resultType="com.entity.Monster">
  45. SELECT * FROM `monster`
  46. </select>
  47. </mapper>

(10)创建并配置 mybatis-config.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <!--配置MyBatis自带的日志输出-查看原生的sql-->
  7. <settings>
  8. <setting name="logImpl" value="STDOUT_LOGGING"/>
  9. </settings>
  10. <!--配置别名-->
  11. <typeAliases>
  12. <typeAlias type="com.entity.Monster" alias="Monster"/>
  13. </typeAliases>
  14. <environments default="development">
  15. <environment id="development">
  16. <!--配置事务管理器-->
  17. <transactionManager type="JDBC"/>
  18. <!--配置数据源-->
  19. <dataSource type="POOLED">
  20. <!--配置驱动-->
  21. <property name="driver" value="com.mysql.jdbc.Driver"/>
  22. <!--配置连接mysql-url
  23. 1. jdbc:mysql 协议
  24. 2. 127.0.0.1:3306 : 指定连接mysql的ip+port
  25. 3. mybatis: 连接的DB
  26. 4. useSSL=true 表示使用安全连接
  27. 5. &amp; 表示 & 防止解析错误
  28. 6. useUnicode=true : 使用unicode 作用是防止编码错误
  29. 7. characterEncoding=UTF-8 指定使用utf-8, 防止中文乱码
  30. 8. 老韩温馨提示:不要背,直接使用即可
  31. -->
  32. <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
  33. <property name="username" value="root"/>
  34. <property name="password" value="123456"/>
  35. </dataSource>
  36. </environment>
  37. </environments>
  38. <!--
  39. 1. 这里我们配置需要关联的Mapper.xml
  40. 2. 这里我们可以通过菜单 Path from source root
  41. -->
  42. <mappers>
  43. <mapper resource="com/mapper/MonsterMapper.xml"/>
  44. </mappers>
  45. </configuration>

(11)创建 resources/mybatis-config.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <!--配置MyBatis自带的日志输出-查看原生的sql-->
  7. <settings>
  8. <setting name="logImpl" value="STDOUT_LOGGING"/>
  9. </settings>
  10. <!--配置别名-->
  11. <typeAliases>
  12. <!--配置好别名之后,MonsterMapper.xml 文件中的 "com.entity.Monster" 就可以简写成 "Monster"-->
  13. <typeAlias type="com.entity.Monster" alias="Monster"/>
  14. </typeAliases>
  15. <environments default="development">
  16. <environment id="development">
  17. <!--配置事务管理器-->
  18. <transactionManager type="JDBC"/>
  19. <!--配置数据源-->
  20. <dataSource type="POOLED">
  21. <!--配置驱动-->
  22. <property name="driver" value="com.mysql.jdbc.Driver"/>
  23. <!--配置连接mysql-url
  24. 1. jdbc:mysql 协议
  25. 2. 127.0.0.1:3306 : 指定连接mysql的ip+port
  26. 3. mybatis: 连接的DB
  27. 4. useSSL=true 表示使用安全连接
  28. 5. &amp; 表示 & 防止解析错误
  29. 6. useUnicode=true : 使用unicode 作用是防止编码错误
  30. 7. characterEncoding=UTF-8 指定使用utf-8, 防止中文乱码
  31. -->
  32. <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis?useUnicode=true&amp;characterEncoding=UTF-8"/>
  33. <property name="username" value="root"/>
  34. <property name="password" value="123456"/>
  35. </dataSource>
  36. </environment>
  37. </environments>
  38. <!--
  39. 1. 这里我们配置需要关联的Mapper.xml
  40. 2. 这里我们可以通过菜单 Path from source root
  41. -->
  42. <mappers>
  43. <mapper resource="com/mapper/MonsterMapper.xml"/>
  44. </mappers>
  45. </configuration>

 (12)util.MyBatisUtils.java

  1. package com.util;
  2. import org.apache.ibatis.io.Resources;
  3. import org.apache.ibatis.session.SqlSession;
  4. import org.apache.ibatis.session.SqlSessionFactory;
  5. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  6. import java.io.IOException;
  7. import java.io.InputStream;
  8. /**
  9. * MyBatisUtils 工具类,可以得到SqlSession
  10. */
  11. public class MyBatisUtils {
  12. //属性
  13. private static SqlSessionFactory sqlSessionFactory;
  14. //编写静态代码块-初始化sqlSessionFactory
  15. static {
  16. try {
  17. //指定资源文件, 配置文件mybatis-config.xml
  18. String resource = "mybatis-config.xml";
  19. //获取到配置文件mybatis-config.xml 对应的inputStream
  20. //说明:加载文件时,默认到resources目录=>运行后的工作目录target-classes
  21. InputStream resourceAsStream = Resources.getResourceAsStream(resource);
  22. sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
  23. System.out.println("sqlSessionFactory="
  24. + sqlSessionFactory.getClass());
  25. } catch (IOException e) {
  26. e.printStackTrace();
  27. }
  28. }
  29. //编写方法,返回SqlSession对象-会话
  30. public static SqlSession getSqlSession() {
  31. return sqlSessionFactory.openSession();
  32. }
  33. }

 (13)建 src\test\java\com\mapper\MonsterMapperTest.java

  1. package com.mapper;
  2. import com.entity.Monster;
  3. import com.util.MyBatisUtils;
  4. import org.apache.ibatis.session.SqlSession;
  5. import org.junit.Before;
  6. import org.junit.Test;
  7. import java.util.Date;
  8. import java.util.List;
  9. public class MonsterMapperTest {
  10. //属性
  11. private SqlSession sqlSession;
  12. private MonsterMapper monsterMapper;
  13. /**
  14. * 1. 当方法标注 @Before, 表示在执行你的目标测试方法前,会先执行该方法
  15. * 2. 这里在测试的时候,可能小伙伴们会遇到一些麻烦,老师说了解决方案
  16. */
  17. //编写方法完成初始化
  18. @Before
  19. public void init() {
  20. //获取到sqlSession
  21. sqlSession = MyBatisUtils.getSqlSession();
  22. //获取到到MonsterMapper对象 class com.sun.proxy.$Proxy7 代理对象
  23. //, 底层是使用了动态代理机制
  24. monsterMapper = sqlSession.getMapper(MonsterMapper.class);
  25. System.out.println("monsterMapper=" + monsterMapper.getClass());
  26. }
  27. @Test
  28. public void addMonster() {
  29. for (int i = 0; i < 2; i++) {
  30. Monster monster = new Monster();
  31. monster.setAge(10 + i);
  32. monster.setBirthday(new Date());
  33. monster.setEmail("kate@qq.com");
  34. monster.setGender(1);
  35. monster.setName("大象精-" + i);
  36. monster.setSalary(1000 + i * 10);
  37. monsterMapper.addMonster(monster);
  38. System.out.println("添加对象--" + monster);
  39. System.out.println("添加到表中后, 自增长的id=" + monster.getId());
  40. }
  41. //如果是增删改, 需要提交事务
  42. if(sqlSession != null) {
  43. sqlSession.commit();
  44. sqlSession.close();
  45. }
  46. System.out.println("保存成功...");
  47. }
  48. @Test
  49. public void delMonster() {
  50. monsterMapper.delMonster(2);
  51. if(sqlSession != null) {
  52. sqlSession.commit();
  53. sqlSession.close();
  54. }
  55. System.out.println("删除成功...");
  56. }
  57. @Test
  58. public void updateMonster() {
  59. Monster monster = new Monster();
  60. monster.setAge(50);
  61. monster.setBirthday(new Date());
  62. monster.setEmail("king3@qq.com");
  63. monster.setGender(0);
  64. monster.setName("老鼠精-01");
  65. monster.setSalary(2000);
  66. monster.setId(3);
  67. monsterMapper.updateMonster(monster);
  68. if(sqlSession != null) {
  69. sqlSession.commit();
  70. sqlSession.close();
  71. }
  72. System.out.println("修改成功...");
  73. }
  74. @Test
  75. public void getMonsterById() {
  76. Monster monster = monsterMapper.getMonsterById(3);
  77. System.out.println("monster=" + monster);
  78. if(sqlSession != null) {
  79. sqlSession.close();
  80. }
  81. System.out.println("查询成功~");
  82. }
  83. @Test
  84. public void findAllMonster() {
  85. List<Monster> monsters = monsterMapper.findAllMonster();
  86. for (Monster monster : monsters) {
  87. System.out.println("monster-" + monster);
  88. }
  89. if(sqlSession != null) {
  90. sqlSession.close();
  91. }
  92. System.out.println("查询成功~");
  93. }
  94. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/803729
推荐阅读
相关标签
  

闽ICP备14008679号