软件框架技术1(MyBatis)

目录

1.软件框架技术概述:

1.1为什么会出现软件框架技术?

1.2框架概述 

1.3框架的优势

2.Maven

        2.1.maven是什么

 2.2maven依赖管理

 2.3仓库

​编辑2.4maven的安装与配置(必须配置好)

2.5 依赖范围(了解)

3.MyBatis 

3.1mybatis概述:

3.2MyBatis快速开发

 3.3Mapper代理开发***(重要)

 3.4mybatis开发注意细节

4.mybatis综合案例


1.软件框架技术概述:

1.1为什么会出现软件框架技术?

        随着业务发展,软件系统变得越来越复杂,如果所有的软件都从0功能一点点开发,那就会是一个漫长又繁琐的事情,此外,团队开发协作时,由于没有统一的调用规范,系统会出现大部分重复的代码。框架的出现,它实现了很多基础功能,开发人员不需要关注底层实现和构建,只需要关注所需要的业务逻辑即可。

注:当前市场java主流框架 Spring SpringMVC MyBatis  还有springbook(因为简单,用的比较多)

1.2框架概述 

        软件框架是一种通用的,可复用的软件环境,他提供特定的功能,助力软件的开发工作。

        软件框架可以形象的比喻成人们在盖楼时,用梁+柱子+成栋墙搭建起来的钢筋混凝土结构的建筑框架,他是整个建筑的骨架,而软件实现的功能,也就像是在这个建筑框架所要实现的不同类型,功能的房子,比如健身房,酒店,饭店。。。

1.3框架的优势

        1.3.1早期开发javaEE应用开发中,企业开发人员用的是 JSP + Servlet 技术进行软件应用的开发,但使用 JSP + Servlet 开发代码有以下弊端:

                1.软件可维护性差

                        使用 jsp + Servlet 开发 ,分层不够清晰,业务逻辑无法实现单独分离出来,后期维护困难。

                2.代码重用性低

                        如果不使用框架,每次开发系统就会投入人力,物力来进行底层搭建,企业开发效率低。

        1.3.2现在使用框架的好处。

                1.提高开发效率

                        如果使用成熟,稳健的框架,那么有一些通用的基础工作,比如事务处理,安全性,数据流控制等,就可以交给框架来管理,程序员只需要集中精力完成系统业务逻辑设计即可,从而降低了开发难度

                2.提高代码规范和可维护性

                        成熟的框架定义了一些规范,当多人开发的时候,规范就相当重要。

                3.提高软件性能

                        使用软件框架技术开发,可以减少代码重复赘余,并且避免了类与类之间的耦合性,所需对象讲给Spring管理,就可以实现解耦。MyBatis框架提供了XML形式开发,支持动态sql,避免了程序员在类中编写sql语句。

在学习框架之前,我们来学习什么是maven。也可以通过它进行了解史上最全安装Maven教程_小Du猿的博客-CSDN博客_安装maven

Maven的安装与配置_DanielMaster的博客-CSDN博客_maven安装与配置

超级详细的Maven使用教程_进修的CODER的博客-CSDN博客_maven

这三个可以说是maven安装配置比较详细的了,可以细看看,我在这里就 带大家了解一下

2.Maven

        2.1.maven是什么

Maven是专门用于管理和构建Java项目的工具,它的主要功能有:

  • 提供了一套标准化的项目结构

  • 提供了一套标准化的构建流程(编译,测试,打包,发布……)

  • 提供了一套依赖管理机制

  • 标准化的项目结构:

    项目结构我们都知道,每一个开发工具(IDE)都有自己不同的项目结构,它们互相之间不通用。我再eclipse中创建的目录,无法在idea中进行使用,这就造成了很大的不方便,如下图:前两个是以后开发经常使用的开发工具

  • 而Maven提供了一套标准化的项目结构,所有的IDE使用Maven构建的项目完全一样,所以IDE创建的Maven项目可以通用。如下图右边就是Maven构建的项目结构。

通过上面的描述大家只需要知道Maven是一个工具即可。Apache 是一个开源组织,将来我们会学习很多Apache提供的项目。

 2.2maven依赖管理

所谓依赖,就是管理项目所依赖的的第三方资源(就是所谓的jar包),

以前的做法:

 而Maven使用标准的 ==坐标== 配置来管理各种依赖,只需要简单的配置就可以完成依赖管理。(如图所示)

 如上图右边所示就是mysql驱动包的坐标,在项目中只需要写这段配置,其他都不需要我们担心,Maven都帮我们进行操作了。

 2.3仓库

大家想想这样的场景,我们创建Maven项目,在项目中使用坐标来指定项目的依赖,那么依赖的jar包到底存储在什么地方呢?其实依赖jar包是存储在我们的本地仓库中。而项目运行时从本地仓库中拿需要的依赖jar包。

仓库分类:

  • 本地仓库:自己计算机上的一个目录

  • 中央仓库:由Maven团队维护的全球唯一的仓库

  • 远程仓库(私服):一般由公司团队搭建的私有仓库

    今天我们只学习远程仓库的使用,并不会搭建。

当项目中使用坐标引入对应依赖jar包后,首先会查找本地仓库中是否有对应的jar包:

  • 如果有,则在项目直接引用;

  • 如果没有,则去中央仓库中下载对应的jar包到本地仓库。

  •  如果还可以搭建远程仓库,将来jar包的查找顺序则变为:

  • 2.4maven的安装与配置(必须配置好)

这个就可以根据上边发的路径进行安装配置。还有idea 集成maven(idea配置maven)

2.5 依赖范围(了解)

通过设置坐标的依赖范围(scope),可以设置 对应jar包的作用范围:编译环境、测试环境、运行环境。

如下图所示给 junit 依赖通过 scope 标签指定依赖的作用范围。 那么这个依赖就只能作用在测试环境,其他环境下不能使用。

那么 scope 都可以有哪些取值呢?

依赖范围编译classpath测试classpath运行classpath例子
compileYYYlogback
test-Y-Junit
providedYY-servlet-api
runtime-YYjdbc驱动
systemYY-存储在本地的jar包
  • compile :作用于编译环境、测试环境、运行环境。

  • test : 作用于测试环境。典型的就是Junit坐标,以后使用Junit时,都会将scope指定为该值

  • provided :作用于编译环境、测试环境。我们后面会学习 servlet-api ,在使用它时,必须将 scope 设置为该值,不然运行时就会报错

  • runtime : 作用于测试环境、运行环境。jdbc驱动一般将 scope 设置为该值,当然不设置也没有任何问题

  注意:如果引入坐标不指定 scope 标签时,默认就是 compile 值。以后大部分jar包都是使用默认值。

 maven是什么? 一句话,就是自动化构建工具,用来构建java的项目,和依赖管理。

 2.6 依赖传递与冲突解决

2.6.1 什么是依赖?

在maven的pom文件中添加第三方库坐标,引入第三方依赖。

2.6.2 什么是依赖传递?

项目依赖了a     a又依赖了b    此时会把b传递给项目。

 2.6.3 什么是依赖冲突?

项目A和B ,

        A依赖了C-1.1,D-1.1    

        B依赖了C-1.2, D-1.2,E-1.2

此时CD库存存在版本冲突。

2.6.4 解决冲突

1.maven  自带调优原则。

 2.两条原则:

1.第一声明者优先原则:先导入的优先级更高

2.路径近者优先。

3.MyBatis 

3.1mybatis概述:

        java程序依靠java数据库连接(jdbc)实现对数据库的操作,大型项目中,与数据库连接比较频繁,数据量读写量较大,仅仅依靠传统jdbc无法满足,因此就出现 Mybatis 来实现操作。

  • MyBatis 是一款优秀的==持久层框架==,用于简化 JDBC 开发

  • MyBatis 本是 Apache 的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github

  • 官网:mybatis – MyBatis 3 | 简介

持久层:

  • 负责将数据到保存到数据库的那一层代码。

    以后开发我们会将操作数据库的Java代码作为持久层。而Mybatis就是对jdbc代码进行了封装。

  • JavaEE三层架构:表现层、业务层、持久层

    三层架构在后期会给大家进行讲解,今天先简单的了解下即可。

传统JDBC缺点:

  • 硬编码

    • 注册驱动、获取连接

      上图标1的代码有很多字符串,而这些是连接数据库的四个基本信息,以后如果要将Mysql数据库换成其他的关系型数据库的话,这四个地方都需要修改,如果放在此处就意味着要修改我们的源代码。

    • SQL语句

      上图标2的代码。如果表结构发生变化,SQL语句就要进行更改。这也不方便后期的维护。

  • 操作繁琐

    • 手动设置参数

    • 手动封装结果集

      上图标4的代码是对查询到的数据进行封装,而这部分代码是没有什么技术含量,而且特别耗费时间的。

MyBatis优化:

  • 硬编码可以配置到==配置文件==

  • 操作繁琐的地方mybatis都==自动完成==

3.2MyBatis快速开发

1.先创建 user表 添加数据

create database mybatis;
use mybatis;

drop table if exists tb_user;

create table tb_user(
	id int primary key auto_increment,
	username varchar(20),
	password varchar(20),
	gender char(1),
	addr varchar(30)
);

INSERT INTO tb_user VALUES (1, 'zhangsan', '123', '男', '北京');
INSERT INTO tb_user VALUES (2, '李四', '234', '女', '天津');
INSERT INTO tb_user VALUES (3, '王五', '11', '男', '西安');

2.创建maven模块

 3.导入坐标

 <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <!--
       mybatis
          需要导入哪些依赖
                 lombok
                 mysql
                 junit
                 mybatis
                 导入日志包  复制粘贴  就是可以看到 底层数据库运行的状态
    -->
<dependencies>
    <!--mybatis 依赖-->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.5</version>
    </dependency>

    <!--mysql 驱动-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.46</version>
    </dependency>

    <!--junit 单元测试-->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13</version>
        <scope>test</scope>
    </dependency>

    <!-- 添加slf4j日志api -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.20</version>
    </dependency>
    <!-- 添加logback-classic依赖 -->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.3</version>
    </dependency>
    <!-- 添加logback-core依赖 -->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-core</artifactId>
        <version>1.2.3</version>
    </dependency>
    <!-- 添加lombok依赖 -->
    <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.22</version>
        </dependency>
</dependencies>

4.创建pojo实体类

public class User {
    private int id;
    private String username;
    private String password;
    private String gender;
    private String addr;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public String getAddr() {
        return addr;
    }

    public void setAddr(String addr) {
        this.addr = addr;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", gender='" + gender + '\'' +
                ", addr='" + addr + '\'' +
                '}';
    }
}

5.接下来就是我们的重点(配置文件)

写在这里

 

5.1:编写 MyBatis 核心配置文件 -- > 替换连接信息 解决硬编码问题

mybatis-config是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>
    <!--给pojo包起别名-->
    <!--<typeAliases>-->
        <!--<package name="com.tjtc.pojo"/>-->
    <!--</typeAliases>-->
    <!--
    environments:配置数据库连接环境信息。可以配置多个environment,通过default属性切换不同的environment
    -->
    <environments default="development">
        <environment id="development">
            <!-- 事务管理器  -->
            <transactionManager type="JDBC"/>
            <!--这里配置连接池   -->
            <dataSource type="POOLED">
                <!--数据库连接信息-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!--加载sql映射文件
            我们sql语句 是不是写到文件中了 xml的文件中了
            你得告诉核心配置文件 你的sql在哪
        -->
        <mapper resource="UserMapper.xml"/>
    </mappers>
</configuration>

解释入门案例中相对来说 重要的

mybatis-config.xml 核心配置文件

  • 配置了数据库的四大属性信息.

    • 数据库驱动 ---代表我们连接哪个数据库

      • mysql 5.5以上版本 com.mysql.jdbc.Driver

      • mysql 8以上版本 com.mysql.cj.jdbc.Driver

    • 数据库url

      • 跟以前一致, jdbc:mysql:///你要连接的数据库?useSSL=false

    • 数据库用户名

      • root 学习

      • 企业 用分配给你的

    • 数据库密码

      • 自己定义的

      • 企业 分配给你的

        

关联了 我们 sql语句 所在的xml文件

  • <mappers></mappers> 映射的意思

    • <mapper resources="XxxMapper.xml"></mapper>

    • 每一个mapper就代表着每一个 sql语句文件.

  • 咱们数据库中的表 是不是 已经准备 和 我们 java中的类 产生映射!!

  • 设计 pojo类的时候,表中有什么字段叫什么名,你pojo类中就得有什么属性,叫什么名.

5.2 SQL 映射文件 XXXMaper.xml (这里是UserMapper) 

通过XMl配置的话 会有好多映射文件 ,因为一个项目要操作好多表。

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
namespace  这个定义 当前sql语句的xml的 名字
  这个名字 具备唯一性
-->
<mapper namespace="test">
  <!--这是写sql语句的位置-->
    <!--
       帮我完成 查询所有功能
       id  代表当前这个sql语句的唯一识别
       resultType 把查询出来的每一条记录 封装成什么?
       resultType="com.tjtc.pojo.User"
                 把查询出来的每一条记录封装成 User对象
    -->
    <select id="selectAll" resultType="com.itheima.pojo.User">
       select * from tb_user;
    </select>

    <!--<update id=""></update>-->
    <!--<insert id=""></insert>-->
    <!--<delete id=""></delete>-->
</mapper>

XxxMapper.xml是 SQL映射文件---第一关注的 namespace属性 sql语句结构

  • 就是把操作某张表的所有sql语句,进行统一管理.

  • 比如管理操作user表的映射文件,叫 UserMapper.xml,管理brand表,BrandMapper.xml .

  • XxxMapper.xml里面放着是不是 操作 对应表的语句..... 映射关系 .

  • <mapper>标签中 它有个 namespase属性 名称空间 代表当前这个Mapper.xml 自己的名字.

    • 每一个mapper的名字都是独一无二.

  • 写查询sql <select></select>

    <insert></insert> 增加 <update>修改 <delete>删除

  • <select id="来表示当前sql语句在当前mapper中的唯一性"> 写sql语句</select>
    做查询是有返回内容的,
    返回的内容 要封装成什么结果 可以采用
         resultType属性 来确定
         resultType="com.itheima.pojo.User"
              把查询出来的每一条记录 中的数据  映射 称为  com.itheima.pojo包下的User类型对象

 6.测试:

import com.itheima.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.Test;

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

public class MybatisTest {
    //测试查询所有
    @Test
    public void selectAllTest() throws IOException {
        // 1:加载核心配置文件
        String resource = "mybatis-config.xml";
        // 下面操作 是官方给我们写好的 大家尽情的复制粘贴
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //创建一个工程队  完成 一个工厂的创建  (这个工厂里面是来造操作 sql语句的对象的)
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //有了这个创建 sql语句对象 工厂
        // 从厂子里要对象  这个对象是用来执行sql语句的
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //上面四句话复制粘贴
       // 你想让 sqlSession 执行哪个sql语句
        //  selectList()  查询多个
         //     传递的参数u是 把你需要执行什么sql语句
             //  sql语句位置通过字符串形式告知 "namespace名字.id名字"
        List<User> users = sqlSession.selectList("test.selectAll");
       //输出 users
        System.out.println(users);
        //把 sqlSession归还连接池
        sqlSession.close();
    }
}

 以上就是MyBatis入门案例  打不来没关系,接下来是比较重要的了,就是Mapper代理开发

 3.3Mapper代理开发***(重要)

使用Mapper代理要求

使用Mapper代理方式,必须满足以下要求:

  • 定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下。如下图:

 

这个同一目录,是编译后class文件后的同一目录

 设置SQL映射文件的namespace属性为Mapper接口全限定名

 在 Mapper 接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致

 namespace=""  跟接口的 包名+类名 一致

id值 跟 接口方法名一致
参数类型 跟接口方法参数类型一致
返回值 跟接口的方法的返回值一致(resultType)

Mapper代理开发:测试:

 @Test
    public void selectAllTest1() throws IOException {
        // 1:加载核心配置文件
        String resource = "mybatis-config.xml";
        // 下面操作 是官方给我们写好的 大家尽情的复制粘贴
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //创建一个工程队  完成 一个工厂的创建  (这个工厂里面是来造操作 sql语句的对象的)
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //有了这个创建 sql语句对象 工厂
        // 从厂子里要对象  这个对象是用来执行sql语句的
        SqlSession sqlSession = sqlSessionFactory.openSession();

        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> users = mapper.selectAll();
        System.out.println(users);
    }

结果:

 Mapper代理开发 就好多练练

 3.4mybatis开发注意细节

1.起别名:实体类属性名 和 数据库表列名 不一致,不能自动封装数据

2.

parameterType使用

对于有参数的mapper接口方法,我们在映射配置文件中应该配置 ParameterType 来指定参数类型。只不过该属性都可以省略。(如果是多表查询的时候可能要用)

3.特殊字段处理:

 4.单个参数

  • POJO 类型

    直接使用。要求 属性名参数占位符名称 一致

  • Map 集合类型

    直接使用。要求 map集合的键名参数占位符名称 一致

  • Collection 集合类型

    底层可以理解为Mybatis 会将集合封装到 map 集合中,如下:

    map.put("arg0",collection集合);

    map.put("collection",collection集合; 推荐

    ==可以使用 @Param 注解替换map集合中默认的 arg 键名。==

  • List 集合类型

    底层可以理解为Mybatis 会将集合封装到 map 集合中,如下:

    map.put("arg0",list集合);

    map.put("collection",list集合);

    map.put("list",list集合); 推荐

    ==可以使用 @Param 注解替换map集合中默认的 arg 键名。==

  • Array 类型

    底层可以理解为Mybatis 会将集合封装到 map 集合中,如下:

    map.put("arg0",数组);

    map.put("array",数组); 推荐

    ==可以使用 @Param 注解替换map集合中默认的 arg 键名。==

  • 其他类型

    比如int类型,参数占位符名称 叫什么都可以。尽量做到见名知意

5.多个参数 @Param

代码验证:

  • 如下面的代码,就是接收两个参数,而接收多个参数需要使用 @Param 注解,那么为什么要加该注解呢?这个问题要弄明白就必须来研究Mybatis 底层对于这些参数是如何处理的。

    user select(@Param("name") String name,@Param("password") String password);
    <select id="select" resultType="user">
        select *
        from tb_user
        where 
            name=#{name}
            and password=#{password}
    </select>

    我们在接口方法中定义多个参数,Mybatis 会将这些参数封装成 Map 集合对象,值就是参数值,而键在没有使用 @Param 注解时有以下命名规则:

  • 以 arg 开头 :第一个参数就叫 arg0,第二个参数就叫 arg1,以此类推。如:

    map.put("arg0",参数值1);

    map.put("arg1",参数值2);

  • 以 param 开头 : 第一个参数就叫 param1,第二个参数就叫 param2,依次类推。如:

    map.put("param1",参数值1);

    map.put("param2",参数值2);

  • UserMapper 接口中定义如下方法

    User select(String name,String password);
  • UserMapper.xml 映射配置文件中定义SQL

    <select id="select" resultType="user">
        select *
        from tb_user
        where 
            name=#{arg0}
            and password=#{arg1}
    </select>

    或者

    <select id="select" resultType="user">
        select *
        from tb_user
        where 
            name=#{param1}
            and password=#{param2}
    </select>

==结论:以后接口参数是多个时,在每个参数上都使用 @Param 注解。这样代码的可读性更高。==

 6.注解实现CRUD

@Select(value = "select * from tb_user where id = #{id}")
public User selectById(int id);

==注意:==

  • 注解是用来替换映射配置文件方式配置的,所以使用了注解,就不需要再映射配置文件中书写对应的 statement

Mybatis 针对 CURD 操作都提供了对应的注解,已经做到见名知意。如下:

  • 查询 :@Select

  • 添加 :@Insert

  • 修改 :@Update

  • 删除 :@Delete

4.mybatis综合案例

4.1,目录结构

4.2在pom.xml中导入坐标

<properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <!--<dependency>-->
            <!--<groupId>junit</groupId>-->
            <!--<artifactId>junit</artifactId>-->
            <!--<version>4.12</version>-->
            <!--<scope>test</scope>-->
        <!--</dependency>-->

        <!--
           属性配置
             maven.compiler.source  maven编译源码环境 是jdk8
             maven.compiler.target  maven目标代码运行环境 jdk8
             <project.build.sourceEncoding 当前模块中 源码的编码集 utf-8
       -->


        <!--
           mybatis
              需要导入哪些依赖
                     lombok
                     mysql
                     junit
                     mybatis
                     导入日志包  复制粘贴  就是可以看到 底层数据库运行的状态
        -->
            <!--lombok-->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.22</version>
            </dependency>

            <!--mybatis 依赖-->
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.5.5</version>
            </dependency>

            <!--mysql 驱动-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.46</version>
            </dependency>

            <!--junit 单元测试-->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.13</version>
                <scope>test</scope>
            </dependency>

            <!-- 添加slf4j日志api -->
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
                <version>1.7.20</version>
            </dependency>
            <!-- 添加logback-classic依赖 -->
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-classic</artifactId>
                <version>1.2.3</version>
            </dependency>
            <!-- 添加logback-core依赖 -->
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-core</artifactId>
                <version>1.2.3</version>
            </dependency>

    </dependencies>

 4.3mybatis核心配置文件

<?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">
<!--
   这个配置文件中什么需要我们填写
       起别名 <typeAliases>  每次复制之后要进行检查
       连接池 四个信息 dataSource 每次复制之后要进行检查
       映射文件   <mappers>  关注包
-->
<configuration>
    <!--给类型起别名-->
    <typeAliases>
        <package name="com.tjtc.pojo"/>
    </typeAliases>
    <!--
       environments 环境们
               default 选择哪一个环境
         environment 环境  id代表不同的环境id
    -->
    <environments default="development">
        <!--开发环境-->
        <environment id="development">
            <!--
            transactionManager  事务管理器
               当前框架中的事务管理 谁来管理
                  type="JDBC"  使用JDBC中的事务管理操作(推荐)
                  MANAGED  自己管理事务
            -->
            <transactionManager type="JDBC"/>
            <!--
               mybatis 自带连接池
                  type="POOLED"  你用连接
                  type="UNPOOLED"  不用连接池
                  type="JNDI"  连接池是一个服务器 以客户端身份连接 已过时。
            -->
            <dataSource type="POOLED">
                <!--
                     driver  驱动 连接那种数据库就写哪种数据库的驱动
                     url 连接哪个数据库
                -->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>

    </environments>

    <!--
      映射文件
         咱们的sql在mybatis都是写在  XxxMapper.xml中的
           mappers
             里面的mapper就代表着 找到 咱们 的sql文件
    -->
    <mappers>
        <package name="com.tjtc.mapper"/>
    </mappers>
</configuration>

4.4 打印日志文件

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!--
        CONSOLE :表示当前的日志信息是可以输出到控制台的。
    -->
    <appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>[%level] %blue(%d{HH:mm:ss.SSS}) %cyan([%thread]) %boldGreen(%logger{15}) - %msg %n</pattern>
        </encoder>
    </appender>

    <logger name="com.tjtc" level="DEBUG" additivity="false">
        <appender-ref ref="Console"/>
    </logger>


    <!--

      level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF
     , 默认debug
      <root>可以包含零个或多个<appender-ref>元素,标识这个输出位置将会被本日志级别控制。
      -->
    <root level="DEBUG">
        <appender-ref ref="Console"/>
    </root>
</configuration>

4.5数据库

use mybatis;
-- 删除tb_brand表
drop table if exists tb_brand;
-- 创建tb_brand表
create table tb_brand
(
    -- id 主键
    id           int primary key auto_increment,
    -- 品牌名称
    brandName   varchar(20),
    -- 企业名称
    companyName varchar(20),
    -- 排序字段
    ordered      int,
    -- 描述信息
    description  varchar(100),
    -- 状态:0:禁用  1:启用
    status       int
);
-- 添加数据
insert into tb_brand (brandName, companyName, ordered, description, status)
values ('三只松鼠', '三只松鼠股份有限公司', 5, '好吃不上火', 0),
       ('华为', '华为技术有限公司', 100, '华为致力于把数字世界带入每个人、每个家庭、每个组织,构建万物互联的智能世界', 1),
       ('小米', '小米科技有限公司', 50, 'are you ok', 1);

4.6实体类

package com.tjtc.pojo;

public class Brand {
    private Integer id;
    private String brandName;
    private String companyName;
    private Integer ordered;
    private String description;
    private Integer status;


    public Brand() {
    }

    public Brand(Integer id, String brandName, String companyName, Integer ordered, String description, Integer status) {
        this.id = id;
        this.brandName = brandName;
        this.companyName = companyName;
        this.ordered = ordered;
        this.description = description;
        this.status = status;
    }

    public Integer getId() {
        return id;
    }

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

    public String getBrandName() {
        return brandName;
    }

    public void setBrandName(String brandName) {
        this.brandName = brandName;
    }

    public String getCompanyName() {
        return companyName;
    }

    public void setCompanyName(String companyName) {
        this.companyName = companyName;
    }

    public Integer getOrdered() {
        return ordered;
    }

    public void setOrdered(Integer ordered) {
        this.ordered = ordered;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    @Override
    public String toString() {
        return "Brand{" +
                "id=" + id +
                ", brandName='" + brandName + '\'' +
                ", companyName='" + companyName + '\'' +
                ", ordered=" + ordered +
                ", description='" + description + '\'' +
                ", status=" + status +
                '}';
    }
}

4.7mapper接口 

package com.tjtc.mapper;

import com.tjtc.pojo.Brand;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface BrandMapper {
//    查询 所有 数据
    List<Brand> selectAll();

//    根据id 进行 查询
    Brand selectById(int id);

//    小于 id 取出
    List<Brand> selectByIds(int id);

//    多条件 查询 (三种方法  @Param   对象    map集合)
    List<Brand> selectByCondition(@Param("status") int status,
                                  @Param("companyName") String companyName,
                                  @Param("brandName") String brandName);

//    mybatis 动态sql 来进行查询
    List<Brand> selectByConditions(@Param("status") int status,
                                   @Param("companyName") String companyName,
                                   @Param("brandName") String brandName);


//    添加数据  添加 Brand
    void addBrand(Brand brand);

//   添加数据 返回主键
    void addBrandBackId(Brand brand);


//    修改
    void updateBrand(Brand brand);


//    根据id 进行删除
    void deleteBrandById(int id);

//    进行批量删除
    void deleteBrandByIds(int[] ids);

}

4.8  映射 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">
<!--
  映射   现在BrandMapper.xml是一个 关于 user表操作的 映射文件
-->
<!--
   namespace=""  跟接口名 包名+类名 一致
      复制之后需要关注 这个名字是不 接口的包名+类名
   mapper标签里面子标签
     根据的不同操作 选择不同的 标签
       <select>  <insert> <update> <delete>
     id值 跟 接口方法名一致
     参数类型 跟接口方法参数类型一致
     返回值 跟接口的方法的返回值一致

-->
<mapper namespace="com.tjtc.mapper.BrandMapper">
    <select id="selectAll" resultType="Brand">
        select * from tb_brand;
    </select>

    <select id="selectById" resultType="Brand">
        select * from tb_brand where id = #{id};
    </select>


    <!--穿一个id  将 比传入id 小的 取出-->
    <!--考察点  mybatis 有几种特殊 情况 不能和 mysql语句相比-->
    <select id="selectByIds" resultType="Brand">
        select * from tb_brand where id &lt; #{id};
    </select>

    <!--多条件 查询 模糊查询-->
    <select id="selectByCondition" resultType="Brand">
        select * from
          tb_brand
        where
           status = #{status}
        and
          companyName like #{companyName}
        and
          brandName like #{brandName}
    </select>
    <!--上边这种 多个 查询方式 有些不好,如果 status为null (用户 不输出值)  那么用户永远也查不到-->


    <!--多条件 查询  运用sql 模糊查询  mybatis 动态 sql-->
    <select id="selectByConditions" resultType="Brand">
        select * from
          tb_brand
        where
            <if test="status != null">
               status =#{status}
            </if>
            <if test="companyName != null and companyName != ''">
                and companyName like #{companyName}
            </if>
            <if test="brandName != null and brandName != ''">
                and brandName like #{brandName}
            </if>
    </select>

    <!--添加数据 -->
    <insert id="addBrand">
        insert into
          tb_brand(brandName,companyName,ordered,description,status)
        values
          (#{brandName},#{companyName},#{ordered},#{description},#{status})
    </insert>
    
    <!--添加 数据 返回主键-->
    <insert id="addBrandBackId" useGeneratedKeys="true" keyProperty="id">
        insert into
          tb_brand(brandName,companyName,ordered,description,status)
        values
          (#{brandName},#{companyName},#{ordered},#{description},#{status})
    </insert>

    <!--修改-->
    <update id="updateBrand">
        update tb_brand set
          brandName = #{brandName},
          companyName = #{companyName},
          ordered = #{ordered},
          description = #{description},
          status = #{status}
          where id = #{id};
    </update>



    <delete id="deleteBrandById">
        delete from tb_brand where id = #{id};
    </delete>

    <delete id="deleteBrandByIds">
        delete from tb_brand where id in
        <foreach collection="array" open="(" close=")" separator="," item="id">
            #{id}
        </foreach>
    </delete>

</mapper>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

華同学.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值