• Mybatis-Spring


    Mybatis

    概述

    什么是Mybatis,有什么特点

    它是一款半自动的ORM持久层框架,具有较高的SQL灵活性,支持高级映射(一对一,一对多),动态SQL,延迟加载和缓存等特性,但它的数据库无关性较低

    什么是ORM

    Object Relation Mapping,对象关系映射。对象指的是Java对象,关系指的是数据库中的关系模型,对象关系映射,指的就是在Java对象和数据库的关系模型之间建立一种对应关系

    快速入门

    1. 编写全局配置文件
    2. 编写mapper映射文件
    3. 加载全局配置文件,生成SqlSessionFactory
    4. 创建SqlSession,调用mapper映射文件中的SQL语句来执行CRUD操作

    开发实例

    1.导入依赖的jar包

    1. <dependencies>
    2. <dependency>
    3. <groupId>mysqlgroupId>
    4. <artifactId>mysql-connector-javaartifactId>
    5. <version>5.1.10version>
    6. dependency>
    7. <dependency>
    8. <groupId>org.mybatisgroupId>
    9. <artifactId>mybatisartifactId>
    10. <version>3.4.6version>
    11. dependency>
    12. <dependency>
    13. <groupId>org.projectlombokgroupId>
    14. <artifactId>lombokartifactId>
    15. <version>1.18.12version>
    16. <scope>providedscope>
    17. dependency>
    18. <dependency>
    19. <groupId>junitgroupId>
    20. <artifactId>junitartifactId>
    21. <version>4.10version>
    22. <scope>testscope>
    23. dependency>
    24. dependencies>

    2.创建一个类

    1. package com.yogurt.po;
    2. import lombok.*;
    3. @Getter
    4. @Setter
    5. @NoArgsConstructor
    6. @AllArgsConstructor
    7. @ToString
    8. public class Student {
    9. private Integer id;
    10. private String name;
    11. private Integer score;
    12. private Integer age;
    13. private Integer gender;
    14. }

    3.编写映射文件

    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="test">
    6. <select id="findAll" resultType="com.yogurt.po.Student">
    7. SELECT * FROM student;
    8. select>
    9. <insert id="insert" parameterType="com.yogurt.po.Student">
    10. INSERT INTO student (name,score,age,gender) VALUES (#{name},#{score},#{age},#{gender});
    11. insert>
    12. <delete id="delete" parameterType="int">
    13. DELETE FROM student WHERE id = #{id};
    14. delete>
    15. mapper>

    4.编写数据源

    1. db.url=jdbc:mysql://192.168.183.129:3306/yogurt?characterEncoding=utf8
    2. db.user=root
    3. db.password=root
    4. db.driver=com.mysql.jdbc.Driver

    5.全局配置文件

    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. <properties resource="properties/db.properties">properties>
    7. <environments default="development">
    8. <environment id="development">
    9. <transactionManager type="JDBC"/>
    10. <dataSource type="POOLED">
    11. <property name="driver" value="${db.driver}"/>
    12. <property name="url" value="${db.url}"/>
    13. <property name="username" value="${db.user}"/>
    14. <property name="password" value="${db.password}"/>
    15. dataSource>
    16. environment>
    17. environments>
    18. <mappers>
    19. <mapper resource="StudentMapper.xml"/>
    20. mappers>
    21. configuration>

    6.编写业务

    1. package com.yogurt.dao;
    2. import com.yogurt.po.Student;
    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 java.io.IOException;
    8. import java.io.InputStream;
    9. import java.util.List;
    10. public class StudentDao {
    11. private SqlSessionFactory sqlSessionFactory;
    12. public StudentDao(String configPath) throws IOException {
    13. InputStream inputStream = Resources.getResourceAsStream(configPath);
    14. sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    15. }
    16. public List findAll() {
    17. SqlSession sqlSession = sqlSessionFactory.openSession();
    18. List studentList = sqlSession.selectList("findAll");
    19. sqlSession.close();
    20. return studentList;
    21. }
    22. public int addStudent(Student student) {
    23. SqlSession sqlSession = sqlSessionFactory.openSession();
    24. int rowsAffected = sqlSession.insert("insert", student);
    25. sqlSession.commit();
    26. sqlSession.close();
    27. return rowsAffected;
    28. }
    29. public int deleteStudent(int id) {
    30. SqlSession sqlSession = sqlSessionFactory.openSession();
    31. int rowsAffected = sqlSession.delete("delete",id);
    32. sqlSession.commit();
    33. sqlSession.close();
    34. return rowsAffected;
    35. }
    36. }

    7.测试

    1. public class SimpleTest {
    2. private StudentDao studentDao;
    3. @Before
    4. public void init() throws IOException {
    5. studentDao = new StudentDao("mybatis-config.xml");
    6. }
    7. @Test
    8. public void insertTest() {
    9. Student student = new Student();
    10. student.setName("yogurt");
    11. student.setAge(24);
    12. student.setGender(1);
    13. student.setScore(100);
    14. studentDao.addStudent(student);
    15. }
    16. @Test
    17. public void findAllTest() {
    18. List all = studentDao.findAll();
    19. all.forEach(System.out::println);
    20. }
    21. }

    总结:

    1. 编写mapper.xml,书写SQL,并定义好SQL的输入参数,和输出参数
    2. 编写全局配置文件,配置数据源,以及要加载的mapper.xml文件
    3. 通过全局配置文件,创建SqlSessionFactory
    4. 每次进行CRUD时,通过SqlSessionFactory创建一个SqlSession
    5. 调用SqlSession上的selectOne,selectList,insert,delete,update等方法,传入mapper.xml中SQL标签的id,以及输入参数

    在配置文件中各个子标签说明如下

    • 一般将数据源的信息单独放在一个properties文件中,然后用这个标签引入,在下面environment标签中,就可以用${}占位符快速获取数据源的信息

    • 用来开启或关闭mybatis的一些特性,比如可以用来开启延迟加载,可以用来开启二级缓存
       

    • 在mapper.xml中需要使用parameterType和resultType属性来配置SQL语句的输入参数类型和输出参数类型,类必须要写上全限定名,比如一个SQL的返回值映射为Student类,则resultType属性要写com.yogurt.po.Student,这太长了,所以可以用别名来简化书写,比如

      1. <typeAliases>
      2. <typeAlias type="com.yogurt.po.Student" alias="student"/>
      3. typeAliases>

    • 用来配置数据源

    • 用来配置mapper.xml映射文件,这些xml文件里都是SQL语句

    mapper.xml的SQL语句中的占位符${}#{}

    一般会采用#{}#{}在mybatis中,最后会被解析为?,其实就是Jdbc的PreparedStatement中的?占位符,它有预编译的过程,会对输入参数进行类型解析(如果入参是String类型,设置参数时会自动加上引号),可以防止SQL注入

    ${},一般会用在模糊查询的情景,比如SELECT * FROM student WHERE name like '%${name}%';

    基于Mapper代理的示例

    1. package com.yogurt.mapper;
    2. import com.yogurt.po.Student;
    3. import java.util.List;
    4. public interface StudentMapper {
    5. List findAll();
    6. int insert(Student student);
    7. int delete(Integer id);
    8. List findByName(String value);
    9. }

    我们的mapper.xml文件如下

    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.yogurt.mapper.StudentMapper">
    6. <select id="findAll" resultType="com.yogurt.po.Student">
    7. SELECT * FROM student;
    8. select>
    9. <insert id="insert" parameterType="com.yogurt.po.Student">
    10. INSERT INTO student (name,score,age,gender) VALUES (#{name},#{score},#{age},#{gender});
    11. insert>
    12. <delete id="delete" parameterType="int">
    13. DELETE FROM student WHERE id = #{id};
    14. delete>
    15. <select id="findByName" parameterType="string" resultType="student">
    16. SELECT * FROM student WHERE name like '%${value}%';
    17. select>
    18. mapper>

    mapper接口和mapper.xml之间需要遵循一定规则,才能成功的让mybatis将mapper接口和mapper.xml绑定起来

    1. mapper接口的全限定名,要和mapper.xml的namespace属性一致
    2. mapper接口中的方法名要和mapper.xml中的SQL标签的id一致
    3. mapper接口中的方法入参类型,要和mapper.xml中SQL语句的入参类型一致
    4. mapper接口中的方法出参类型,要和mapper.xml中SQL语句的返回值类型一致
       

    三种加载mapper的方式总结

    加载普通的xml文件,传入xml的相对路径(相对于类路径)

    使用mapper接口的全限定名来加载,若mapper接口采用注解方式,则不需要xml;若mapper接口没有采用注解方式,则mapper接口和xml文件的名称要相同,且在同一个目录

    扫描指定包下的所有mapper,若mapper接口采用注解方式,则不需要xml;若mapper接口没有采用注解方式,则mapper接口和xml文件的名称要相同,且在同一目录

    主键返回

    通常我们会将数据库表的主键id设为自增。在插入一条记录时,我们不设置其主键id,而让数据库自动生成该条记录的主键id,那么在插入一条记录后,如何得到数据库自动生成的这条记录的主键id呢?

    使用useGeneratedKeyskeyProperty属性

    1. <insert id="insert" parameterType="com.yogurt.po.Student" useGeneratedKeys="true" keyProperty="id">
    2. INSERT INTO student (name,score,age,gender) VALUES (#{name},#{score},#{age},#{gender});
    3. insert>

    缓存

    一级缓存

    默认开启,同一个SqlSesion级别共享的缓存,在一个SqlSession的生命周期内,执行2次相同的SQL查询,则第二次SQL查询会直接取缓存的数据,而不走数据库,当然,若第一次和第二次相同的SQL查询之间,执行了DML(INSERT/UPDATE/DELETE),则一级缓存会被清空,第二次查询相同SQL仍然会走数据库

    一级缓存在下面情况会被清除

    • 在同一个SqlSession下执行增删改操作时(不必提交),会清除一级缓存
    • SqlSession提交或关闭时(关闭时会自动提交),会清除一级缓存
    • 对mapper.xml中的某个CRUD标签,设置属性flushCache=true,这样会导致该MappedStatement的一级缓存,二级缓存都失效(一个CRUD标签在mybatis中会被封装成一个MappedStatement)
    • 在全局配置文件中设置 ,这样会使一级缓存失效,二级缓存不受影响

    二级缓存

    默认关闭,可通过全局配置文件中的开启二级缓存总开关,然后在某个具体的mapper.xml中增加,即开启了该mapper.xml的二级缓存。二级缓存是mapper级别的缓存,粒度比一级缓存大,多个SqlSession可以共享同一个mapper的二级缓存。注意开启二级缓存后,SqlSession需要提交,查询的数据才会被刷新到二级缓存当中

    Spring

    概述

    什么是Spring

    Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器(框架)。

    IOC本质

    控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法,也有人认为DI只是IoC的另一种说法。没有IoC的程序中 , 我们使用面向对象编程 , 对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方,个人认为所谓控制反转就是:获得依赖对象的方式反转了。

  • 相关阅读:
    Build Data Visualization Apps
    p101的spring练习之用户列表展示2 ——for循环遍历
    人工智能如何赋能智能安防落地?
    一个iOS 列表头部放大工具
    RFID技术在危险废物管理中的应用解决方案
    直接插入排序算法详解之C语言版
    TLS及CA证书申请流程
    ExcelServer EXCEL服务器使用- 用户、角色权限配置
    算法通过村第十七关-贪心|黄金笔记|跳跃游戏
    jieba分词器使用指南
  • 原文地址:https://blog.csdn.net/qq_43009048/article/details/128029583