• MyBatis(简化数据库操作的持久层框架)->基础入门


    目录

    一.概述       

    1.为什么需要 MyBatis

     2.基本介绍

    2.1MyBatis 工作示意图

    二.MyBatis 快速入门

    1.快速入门需求说明

    2.代码实现

    2.1创建数据库

    2.2创建maven项目(子模块)

    2.3创建 resources/mybatis-config.xml

    2.4实体类Pojo类

    2.5MonsterMapper.java接口

    2.6MonsterMapper.xml(配置sql完成对表的crud)

    2.7在mybatis-config.xml配置需要关联的Mapper.xml

    2.8工具类,可以得到SqlSession

    2.9操作类

    3.细节说明

    3.1配置别名

    3.2配置日志输出


    一.概述       

    1.为什么需要 MyBatis

    传统的 Java 程序操作 DB 分析
    1 、工作示意图 - 一图胜千言

     2.基本介绍

    1. MyBatis 是一个持久层框架
    2. 前身是 ibatis, ibatis3.x 时,更名为 MyBatis
    3. MyBatis java sql 之间提供更灵活的映射方案
    4. mybatis 可以将对数据表的操作 (sql, 方法 ) 等等直接剥离,写到 xml 配置文件,实现和 java
    代码的解耦
    5. mybatis 通过 SQL 操作 DB, 建库建表的工作需要程序员完成

    2.1MyBatis 工作示意图

    二.MyBatis 快速入门

    1.快速入门需求说明

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

    2.代码实现

    2.1创建数据库

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

    2.2创建maven项目(子模块)

    父模块的pom.xml

    1. <groupId>org.examplegroupId>
    2. <artifactId>MybatisartifactId>
    3. <packaging>pompackaging>
    4. <version>1.0-SNAPSHOTversion>
    5. <modules>
    6. <module>mybaits_quicktart/mybaits_quicktartmodule>
    7. modules>
    8. <properties>
    9. <maven.compiler.source>11maven.compiler.source>
    10. <maven.compiler.target>11maven.compiler.target>
    11. properties>
    12. <dependencies>
    13. <dependency>
    14. <groupId>mysqlgroupId>
    15. <artifactId>mysql-connector-javaartifactId>
    16. <version>8.0.16version>
    17. dependency>
    18. <dependency>
    19. <groupId>org.mybatisgroupId>
    20. <artifactId>mybatisartifactId>
    21. <version>3.4.6version>
    22. dependency>
    23. <dependency>
    24. <groupId>junitgroupId>
    25. <artifactId>junitartifactId>
    26. <version>4.12version>
    27. dependency>
    28. dependencies>

    子模块的pom.xml

    1. <parent>
    2. <artifactId>MybatisartifactId>
    3. <groupId>org.examplegroupId>
    4. <version>1.0-SNAPSHOTversion>
    5. <relativePath>../../pom.xmlrelativePath>
    6. parent>
    7. <modelVersion>4.0.0modelVersion>
    8. <groupId>com.honggroupId>
    9. <artifactId>mybaits_quicktartartifactId>
    10. <properties>
    11. <maven.compiler.source>11maven.compiler.source>
    12. <maven.compiler.target>11maven.compiler.target>
    13. properties>

    2.3创建 resources/mybatis-config.xml

    1. <environments default="development">
    2. <environment id="development">
    3. <transactionManager type="JDBC"/>
    4. <dataSource type="POOLED">
    5. <property name="driver" value="com.mysql.jdbc.Driver"/>
    6. <property name="url"
    7. value="jdbc:mysql://127.0.0.1:3306/mybatis?useSSL=true&
    8. useUnicode=true&characterEncoding=UTF-8"/>
    9. <property name="username" value="root"/>
    10. <property name="password" value="hong"/>
    11. dataSource>
    12. environment>
    13. environments>

    2.4实体类Pojo类

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

    2.5MonsterMapper.java接口

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

    2.6MonsterMapper.xml(配置sql完成对表的crud)

    1. "1.0" encoding="UTF-8" ?>
    2. mapper
    3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    5. <mapper namespace="com.hong.mapper.MonsterMapper">
    6. <insert id="addMonster" parameterType="Monster" useGeneratedKeys="true" keyProperty="id">
    7. INSERT INTO `monster`
    8. (`age`, `birthday`, `email`, `gender`, `name`, `salary`)
    9. VALUES (#{age}, #{birthday}, #{email}, #{gender}, #{name}, #{salary})
    10. insert>
    11. <delete id="delMonster" parameterType="Integer">
    12. DELETE FROM `monster` WHERE id = #{id}
    13. delete>
    14. <update id="updateMonster" parameterType="Monster">
    15. UPDATE `monster`
    16. SET `age`=#{age} , `birthday`= #{birthday}, `email` = #{email},
    17. `gender` = #{gender} , `name`= #{name}, `salary` = #{salary}
    18. WHERE id = #{id}
    19. update>
    20. <select id="getMonsterById" resultType="Monster">
    21. SELECT * FROM `monster` WHERE id = #{id}
    22. select>
    23. <select id="findAllMonster" resultType="Monster">
    24. SELECT * FROM `monster`
    25. select>
    26. mapper>

    2.7在mybatis-config.xml配置需要关联的Mapper.xml

    1. <mappers>
    2. <mapper resource="com/hong/mapper/MonsterMapper.xml"/>
    3. mappers>

    2.8工具类,可以得到SqlSession

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

    2.9操作类

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

    3.细节说明

    3.1配置别名

    1. <typeAliases>
    2. <package name="com.hong.entity"/>
    3. typeAliases>

    3.2配置日志输出

    1. <settings>
    2. <setting name="logImpl" value="STDOUT_LOGGING"/>
    3. settings>
  • 相关阅读:
    外汇天眼:CySEC向塞浦路斯投资公司的董事会成员发出警告
    Python学习二:字符串
    UVM 验证方法学之interface学习系列文章(八)《interface不小心引入X态问题》
    Javaweb安全——JNDI注入
    使用postMan调试接口出现 Content type ‘multipart/form-data;charset=UTF-8‘ not supported“
    高精度加减乘除小数详解
    钢铁与不锈钢区别
    2024HVV行动-进军蓝中研判(log4j2、fastjson、Struts2、Shiro)
    ResNet 原理与代码复现
    HarmonyOS鸿蒙开发常用4种布局详细说明
  • 原文地址:https://blog.csdn.net/weixin_54107527/article/details/127725499