• SSM框架-MyBatis基础


    1. MyBatis简介

    1.1 MyBatis历史

    MyBatis最初是Apache的一个开源项目iBatis,2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下,iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到Github。

    iBatis一词来源于“internet”和“abatis”的组合,是一个基于ava的持久层框架。iBatis提供的持久层框架包括SQL Maps和Data Access Objects (DAO)。

    1.2 MyBatis的特性

    MyBatis是支持定制化SQL、存储过程以及高级映射的优秀的持久化框架

    MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集

    MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(普通java对象)映射成数据库中的记录

    MyBatis是一个半自动的ORM框架

    1.3 和其他持久化层的对比

    • JDBC
      • SQL夹杂在Java代码中,耦合度高,导致硬编码内伤
      • 维护不易且实际开发需求中SQL有变化,频繁修改的情况很多
      • 代码冗长,开发效率低
    • Hibernate 和 JPA
      • 操作简单,开发效率高
      • 程序中的长难复杂 SQL 需要绕过框架
      • 内部自动产生的SQL不容易做特殊优化
      • 基于全映射的自动框架,大量字段的POJO进行部分映射时比较困难
      • 反射操作太多,导致数据库性能下降
    • MyBatis
      • 轻量级,性能突出
      • SQL和Java分开编码,功能边界清晰,Java代码专注业务,SQL语句专注数据
      • 开发效率稍逊于Hibernate,但是完全能接受

    2. 搭建MyBatis

    2.1 创建maven工程

    (1)创建项目

            a. 新建一个空项目,项目名为SSM;

            b. 在项目SSM中新建一个maven模块,名为MyBatis_Demo;

            c. 在该模块中,test文件夹中存放测试用代码,main文件夹中的java文件夹存放开发代码,main文件夹中的recourse文件夹存放配置文件;

            d. 在MySQL数据库中创建一个数据库ssm,创建一个表t_user;表结构如下(id自增):

    (2)打包方式:jar

            在maven项目的pom.xml文件中添加:jar

    (3)引入依赖

              在pom.xml文件中添加如下代码:

    1. <dependencies>
    2. <!-- Mybatis核心 -->
    3. <dependency>
    4. <groupId>org.mybatis</groupId>
    5. <artifactId>mybatis</artifactId>
    6. <version>3.5.7</version>
    7. </dependency>
    8. <!-- junit测试 -->
    9. <dependency>
    10. <groupId>junit</groupId>
    11. <artifactId>junit</artifactId>
    12. <version>4.12</version>
    13. <scope>test</scope>
    14. </dependency>
    15. <!-- MySQL驱动 -->
    16. <dependency>
    17. <groupId>mysql</groupId>
    18. <artifactId>mysql-connector-java</artifactId>
    19. <version>5.1.3</version>
    20. </dependency>
    21. <!--实体化类要用到的@Data,就不用构造函数了-->
    22. <dependency>
    23. <groupId>org.projectlombok</groupId>
    24. <artifactId>lombok</artifactId>
    25. <version>1.16.10</version>
    26. <scope>provided</scope>
    27. </dependency>
    28. </dependencies>

    (4)创建实体类

            在src/main/java目录下,创建一个java类,命名:com.wsl.mybatis.pojo.User.java(命名可根据自己情况随意起,前面的com.wsl.mybatis.pojo表示文件目录,User.java是文件名)

    1. import lombok.Data;
    2. @Data
    3. public class User {
    4. private Integer id;
    5. private String username;
    6. private String password;
    7. private Integer age;
    8. private String gender;
    9. private String email;
    10. }

    (5)创建mapper接口

            MyBatis中的mapper接口相当于以前的dao。但是区别在于,mapper仅仅是接口,我们不需要 提供实现类。

            在src/main/java目录下,创建一个java类,命名:com.wsl.mybatis.mapper.UserMapper.java文件。

    1. import com.wsl.mybatis.pojo.User;
    2. import java.util.List;
    3. public interface UserMapper {
    4. // 添加用户
    5. int insertUser();
    6. // 更新用户
    7. void updateUser();
    8. // 删除用户
    9. void delUser();
    10. // 根据id查找用户
    11. User getUserById();
    12. // 查找所有用户
    13. List getAllUser();
    14. }

    (5)创建MyBatis的映射文件

            在src/main/recourse目录下,创建com.wsl.mybatis.mapper.UserMapper.xml

        注意:

           1. MyBatis中可以面向接口操作数据,要保证两个一致:

                    mapper接口的全类名和映射文件的命名空间(namespace)保持一致

                    mapper接口中方法的方法名和映射文件中编写SQL的标签的id属性保持一致

            2.查询的标签select必须设置属性resultType或resultMap,用于设置实体类和数据库表的映射关系:

                    resultType:自动映射,用于属性名和表中字段名一致的情况

                    resultMap:自定义映射,用于一对多或多对一或字段名和属性名不一致的情况

            3.当查询的数据为多条时,不能使用实体类作为返回值,只能使用集合,否则会抛出异常 TooManyResultsException;但是若查询的数据只有一条,可以使用实体类或集合作为返回值

    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.wsl.mybatis.mapper.UserMapper">
    6. <insert id="insertUser">
    7. insert into t_user values(null,'张三','123',23,'女','2436@qq.com');
    8. insert>
    9. <update id="updateUser">
    10. update t_user set username='李四',password='abc' where id=3;
    11. update>
    12. <delete id="delUser">
    13. delete from t_user where id=4;
    14. delete>
    15. <select id="getUserById" resultType="com.wsl.mybatis.pojo.User">
    16. select * from t_user where id = 3;
    17. select>
    18. <select id="getAllUser" resultType="com.wsl.mybatis.pojo.User">
    19. select * from t_user;
    20. select>
    21. mapper>

    (6)创建MyBatis核心配置文件:application.xml

            核心配置文件主要用于配置连接数据库的环境以及MyBatis的全局配置信息

            核心配置文件存放的位置是src/main/resources目录下

    1. "1.0" encoding="UTF-8" ?>
    2. configuration
    3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
    5. <configuration>
    6. <environments default="development">
    7. <environment id="development">
    8. <transactionManager type="JDBC"/>
    9. <dataSource type="POOLED">
    10. <property name="driver" value="com.mysql.jdbc.Driver" />
    11. <property name="url" value="jdbc:mysql://localhost:3306/MyBatis" />
    12. <property name="username" value="root" />
    13. <property name="password" value="password" />
    14. dataSource>
    15. environment>
    16. environments>
    17. <mapper resource="mappers/UserMapper.xml"/>
    18. mappers>
    19. configuration>

    (7)创建测试类

            在src/test/java目录下,创建com.wsl.mybatis.MyBatisTest.java文件

            SqlSession:代表Java程序和数据库之间的会话。(HttpSession是Java程序和浏览器之间的 会话)

            SqlSessionFactory:是“生产”SqlSession的“工厂”。

            工厂模式:如果创建某一个对象,使用的过程基本固定,那么我们就可以把创建这个对象的 相关代码封装到一个“工厂类”中,以后都使用这个工厂类来“生产”我们需要的对象。

    1. import com.wsl.mybatis.mapper.UserMapper;
    2. import com.wsl.mybatis.pojo.User;
    3. import org.apache.ibatis.io.Resources;
    4. import org.apache.ibatis.session.SqlSession;
    5. import org.apache.ibatis.session.SqlSessionFactory;
    6. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    7. import org.junit.Test;
    8. import java.io.IOException;
    9. import java.io.InputStream;
    10. import java.util.List;
    11. public class MyBatisTest {
    12. // 增加一列
    13. @Test
    14. public void testInsert() throws IOException {
    15. // 获取配置文件的输入流
    16. InputStream is = Resources.getResourceAsStream("application.xml");
    17. // 获取SqlSessionFactoryBuilder对象
    18. SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
    19. // 获取sqlSessionFactoryBuilder对象
    20. SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
    21. // 获取SQL的会话对象,是MyBatis提供的操作数据库的对象,true表示自动提交commit
    22. SqlSession sqlSession = sqlSessionFactory.openSession(true);
    23. // 方法1
    24. // 获取UserMapper的代理实现类对象
    25. UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    26. // 调用userMapper接口中的方法,实现添加操作
    27. int result = userMapper.insertUser();
    28. // // 方法2:提供sql以及唯一标识找到sql并执行,唯一标识是namespace.sqlId
    29. // int result=sqlSession.insert("com.wsl.mybatis.Mapper.UserMapper.insertUser");
    30. System.out.println("结果是:"+result);
    31. // 关闭会话
    32. sqlSession.close();
    33. }
    34. // 修改
    35. @Test
    36. public void TestUpdate(){
    37. InputStream is = Resources.getResourceAsStream("application.xml");
    38. SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
    39. SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
    40. SqlSession sqlSession = sqlSessionFactory.openSession(true);
    41. UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    42. mapper.updateUser();
    43. sqlSession.close();
    44. }
    45. // 删除
    46. @Test
    47. public void TestDel(){
    48. InputStream is = Resources.getResourceAsStream("application.xml");
    49. SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
    50. SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
    51. SqlSession sqlSession = sqlSessionFactory.openSession(true);
    52. UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    53. mapper.delUser();
    54. sqlSession.close();
    55. }
    56. // 根据id查找User
    57. @Test
    58. public void TestFindById(){
    59. InputStream is = Resources.getResourceAsStream("application.xml");
    60. SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
    61. SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
    62. SqlSession sqlSession = sqlSessionFactory.openSession(true);
    63. UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    64. User user = mapper.getUserById();
    65. System.out.println(user);
    66. sqlSession.close();
    67. }
    68. // 查询所有的User
    69. @Test
    70. public void TestGetAllUsers(){
    71. InputStream is = Resources.getResourceAsStream("application.xml");
    72. SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
    73. SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
    74. SqlSession sqlSession = sqlSessionFactory.openSession(true);
    75. UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    76. List<User> users = mapper.getAllUser();
    77. // 循环输出List里面的内容
    78. users.forEach(System.out::println);
    79. sqlSession.close();
    80. }
    81. }

    接下来就可以通过每个@Test注释来启动每个测试代码,验证是否正确。

  • 相关阅读:
    分布式存储技术解读系列之一:Ceph| 架构进阶
    redis笔记
    【Pytorch with fastai】第 11 章 :使用 fastai 的中级 API 进行数据处理
    Homomorphic Evaluation of the AES Circuit:解读
    深入理解 Java 对象的内存布局
    访问限制符说明面向对象的封装性
    C++、c语法基础【1】
    xcode The document “...“ could not be saved
    【英杰送书第三期】Spring 解决依赖版本不一致报错 | 文末送书
    数字图像处理(入门篇)三 灰度化
  • 原文地址:https://blog.csdn.net/qq_48051316/article/details/128043844