Spring,Mybatis

1.Spring高级用法

1.1 Lombok用法

1.1.1 添加依赖

说明: 按照要求 添加lombok jar包文件

<!--引入插件lombok 自动的set/get/构造方法插件  -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

1.1.2 安装插件

在这里插入图片描述

1.1.3 POJO常用注解

package com.jt.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

import java.io.Serializable;

/**
 * POJO写法说明:
 *  1.必须有get/set方法
 *  2.必须实现序列化接口 数据流传输/socket通讯
 *
 * 注解说明:
 * @Data 自动生成get/set/toString/equals/hashcode等方法
 * @Accessors(chain = true)  重写了Set方法..
 */
@Data
@Accessors(chain = true)
@NoArgsConstructor  //无参构造
@AllArgsConstructor //全参构造
public class User implements Serializable {
    
    
    private Integer id;
    private String name;
    private Integer age;
    private String sex;

   /* public void setId(Integer id){
        this.id = id;
    }

    public User setId(Integer id){
        this.id = id;
        //this 代表当前对象 运行期有效
        return this;
    }*/
}

1.2 Spring容器管理对象用法

1.2.1 @Component注解说明

表示: 表示将User对象交给Spring容器管理
类似于: new User();
问题: 如果直接new User(), 其中的属性都为null.
需求: 准备User对象 id=100,name=“tomcat” age=18 sex=“男” 交给Spring容器管理!!!
注意事项: 在进行测试时 将@Component删除
在这里插入图片描述

1.2.2 @Bean注解

注解说明: @Bean注解是Spring 专门为管理自定义对象 研发的注解.
用法区域: 在配置类文件中使用
用法说明:

package com.jt.config;

import com.jt.pojo.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 需求: 自定义User对象,交给Spring容器管理
 * 注解讲解:
 *      1.@Configuration 该类是一个配置类
 *         理解:该类是一块区域,在区域中编辑自定义对象
 */
@Configuration
public class UserConfig {
    
    
    /**
     * 要求: 必须有返回值.
     * 功能: 被@Bean修饰的方法,将方法名当做key--user,将返回值对象当做值value
     *       根据Key-value 存储到Map集合中 交给Spring容器管理
     *       Map<user,User对象>
     * @return
     */
    @Bean
    public User user(){
    
    
        User user = new User();
        user.setId(100).setName("tomcat猫").setSex("男").setAge(18);
        return user;
    }
}

1.2.3 对象测试

package com.jt.controller;

import com.jt.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

//需求: 测试User对象是否交给Spring容器管理
@RestController
public class UserController {
    
    
    //1.先管理对象,之后再注入对象
    @Autowired
    private User user;

    @RequestMapping("/getUser")
    public User getUser(){
    
    
        return user;
    }
}

1.2.4 测试效果展现

在这里插入图片描述

1.3 @SpringBootTest

1.3.1 问题分析

需求:有时在执行测试方法时,必须编辑大量的Controller等代码,虽然可以测试成功,但是显得繁琐.
核心机制:让Spring容器启动并且为对象提供服务.

1.3.2 @SpringBootTest

说明:SpringBoot为了测试方便专门开发了@SpringBootTest主要的作用就是启动Spring容器. 完成测试案例.
注意事项: 测试类应该在测试包下完成,并且在主启动类的同包及子包中编辑.
在这里插入图片描述

1.3.2 @SpringBootTest 用法

package com.jt.test;

import com.jt.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

/**
 * 注意事项: 测试代码必须在主启动类的同包及子包中编辑
 * @SpringBootTest用法说明:
 *      只要在该类中 执行@Test测试方法,则就会启动Spring容器.
 */
@SpringBootTest
public class TestUserDemo {
    
    

    @Autowired
    private User user;

    /**
     * 测试方法要求:
     *  1.不能有返回值 必须为void
     *  2.不能携带参数
     *  3.测试方法名称  不能叫test
     */
    @Test
    public void testUser1(){
    
    
        System.out.println(user);
    }

}

2. 导入数据库

2.1 连接本地数据库

在这里插入图片描述

2.2 导入数据库文件

在这里插入图片描述

3. Mybatis

3.1 JDBC入门案例

//利用jdbc,完成新增的功能
    private static void method2() throws Exception{
    
    
        //1,注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2,获取数据库的连接
        //数据传输协议   数据库的ip 端口号 数据库名
        String url = "jdbc:mysql://localhost:3306/cgb2107";
        Connection c = DriverManager.getConnection(url,"root","root");
        //3,获取传输器
        Statement s = c.createStatement();
        //4,利用传输器执行  增删改的SQL
        //executeUpdate()用来执行增删改的SQL,只返回影响行数
        int rows = s.executeUpdate(
                "INSERT INTO emp(ename,job) VALUES('rose','副总')");
        //5,释放资源
        //r.close();//结果集
        s.close();//传输器
        c.close();//连接
    }

3.2 JDBC缺点

  1. 代码比较繁琐,不方便记忆.
  2. 开发效率低
  3. JDBC操作数据库时 结果封装繁琐.
  4. JDBC 运行效率高,但是不便于编辑.

3.3 Mybatis框架

3.3.1 Mybatis框架介绍

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)
当前,最新版本是MyBatis 3.5.7 ,其发布时间是2021年4月21日。

3.3.2 Mybatis官网介绍

官网地址
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

总结: MyBatis 是一款优秀的持久层框架,利用ORM思想实现了数据库持久化操作.
补充说明: 也有人把mybatis称之为半自动化的ORM映射框架.

3.3.3 ORM思想

对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。如今已有很多免费和付费的ORM产品,而有些程序员更倾向于创建自己的ORM工具。

关系映射:

  1. 对象映射-------映射表
  2. 对象中有属性-------表中有字段
    总结: 以对象的方式操作数据库.

举例说明:

  1. JDBC 方式完成入库操作
    insert into xxxx(字段名称) values (字段的值…)
    select * from xxxxx 结果集需要自己手动封装为对象 (繁琐)
  2. ORM方式实现入库
    userDao.insert(对象)
  3. ORM方式的查询
    List userList = userDao.selectList(对象);

3.4 Mybatis 入门案例

3.4.1 准备新项目

在这里插入图片描述

3.4.2 导入jar包文件

  		<!--引入插件lombok 自动的set/get/构造方法插件  -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <!--mybatis依赖包-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.0</version>
        </dependency>

        <!--jdbc依赖包-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

3.4.3 编辑mybatis-config.xml文件

说明:Mybatis中需要定义核心配置文件,在配置文件中 需要指定数据库,相关接口等信息.
文件目录结构
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--核心配置文件-->
<configuration>

    <!--环境配置标签
        mybatis支持多个数据源的配置,default="默认连接数据源"
    -->
    <environments default="development">

        <!--编辑开发环境-->
        <environment id="development">
            <!--mybatis 采用jdbc的方式控制数据库事务. -->
            <transactionManager type="JDBC"/>
            <!--
                type="POOLED" 创建一个数据源链接池,每次从池中获取链接.
             -->
            <dataSource type="POOLED">
                <!--版本信息:
                    如果数据源采用5.x的版本  value:com.mysql.jdbc.Driver
                    如果数据源采用8.x的版本  value:com.mysql.cj.jdbc.Driver
                -->
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/jt?serverTimezone=GMT%2B8&amp;useUnicode=true&amp;characterEncoding=utf8&amp;autoReconnect=true&amp;allowMultiQueries=true"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>

    </environments>

    <!--Mybatis加载Mapper映射文件-->
    <mappers>
        <mapper resource="mybatis/mappers/UserMapper.xml"/>
    </mappers>
</configuration>

3.4.4 编辑UserMapper接口

知识回顾:
1.面向过程编程 C语言 亲力亲为
2.面向对象编程 C++ , java , python
3.面向接口编程 目的实现层级的解耦.

package com.jt.mapper;

import com.jt.pojo.User;

import java.util.List;

public interface UserMapper {
    
    

    //方法查询user表中的所有的数据.
    public List<User> findAll();
}

3.4.5 编辑Mapper的映射文件

Mybatis根据接口的规范,需要在自己指定的映射文件中添加sql语句.从而实现对数据的操作.
特点: 一个接口对应一个映射文件(xml)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!--namespace是mybaits映射文件的唯一标识,与接口对应-->
<mapper namespace="com.jt.mapper.UserMapper">
    <!--
        标签说明:
               1.查询操作  select标签
               2.新增操作  insert标签
               .....
        select标签介绍:
            1. id属性 必须与方法名称一致.
            2. resultType 返回值的pojo类型
        sql:全部小写  ctrl + shift + y
     -->
    <select id="findAll" resultType="com.jt.pojo.User">
        select * from demo_user
    </select>
</mapper>

说明: 通过mybatis加载其它的Mapper的映射文件
在这里插入图片描述

3.4.6 编辑Mybatis测试类

package com.jt;

import com.jt.mapper.UserMapper;
import com.jt.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

class SpringbootDemo2ApplicationTests {
    
    
    /**
     * 核心问题: SqlSession 理解为Mybatis操作数据的连接
     * 1. 通过 SqlSessionFactoryBuilder 构建SqlSessionFactory
     */
    @Test
    public void testMybatis01() throws IOException {
    
    
        //1.定义核心配置文件的路径
        String resource = "mybatis/mybatis-config.xml";
        //2.通过工具API读取资源文件
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //3.构建SqlSessionFactory
        SqlSessionFactory sqlSessionFactory =
                    new SqlSessionFactoryBuilder().build(inputStream);
        //4.获取SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //5.获取Mapper的接口对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        //6.调用接口方法 获取返回值数据
        List<User> userList = userMapper.findAll();
        System.out.println(userList);
        //7.连接用完记得关闭
        sqlSession.close();
    }

}

3.5 Mybatis报错总结

3.5.1 resultType错误

在这里插入图片描述

3.5.2 namespace 命名错误

检查namespace 命名空间
在这里插入图片描述

3.5.3 mybaits关联mapper映射文件异常

说明: 检查resource路径
在这里插入图片描述

在这里插入图片描述

Guess you like

Origin blog.csdn.net/weixin_43770110/article/details/120986081