JavaWeb:Mybatis

JavaWeb:Mybatis,第1张

JavaWeb:Mybatis

JavaWeb:Mybatis

一、Mybatis概述

1、JDBC的缺点2、Mybatis的优势 二、使用Mybatis执行相应的sql语句

1、创建模块,导入坐标2、编写Mybatis核心配置文件3、编写SQL映射文件4、编写代码 三、Mapper代理开发四、MyBatis核心配置文件五、解决数据库中的字段名称和实体名称不一致,导致无法自动封装数据

1、通过起别名解决2、通过resultMap解决(推荐) 六、用MyBatis实现各种sql语句

1、查询详情

1.1 、#{ } 与 ${ }的区别1.1、sql语句的特殊字段处理 2、多条件查询 七、动态SQL

1、If标签2、where标签3、choose标签和when标签(主要用于单个条件的动态sql语句)4、插入 *** 作5、set标签(用于修改 *** 作)6、删除 *** 作

6.1、简单的删除 *** 作6.2、批量删除(foreach标签) 八、Mybatis参数传递

1、单个参数2、多个参数 九、使用注解实现CRUD

一、Mybatis概述

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。

简单来讲,Mybatis就是一个简化JDBC(对JDBC代码进行封装)的框架,有了Mybatis我们就不用编写繁琐的JDBC代码,大大提高了我们编写代码的效率

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

那么什么是持久层呢??

持久层指的是负责将数据保存到数据库中的那些关键代码,因此在以后的Java程序开发中,我们将 *** 作数据库的Java代码作为持久层。


1、JDBC的缺点

在前面已经提了一下JDBC的缺点,就是繁琐,我们每次对数据库进行 *** 作都是要注册驱动然后获取链接,接下来再对编写sql语句,极度不便开发。

*** 作繁琐

使用JDBC对数据库进行 *** 作,除了要手动编写链接数据库的代码,还需要手动设置sql语句的参数查询的结果需要手动封装,当数量一多就会显得极度繁琐 硬编码

注册驱动、获取链接这些都是写死了的代码,倘若日后程序需要更换数据库,那么那些写死了的代码都需要修改,不利于程序日后的维护当表结构或者查询内容发生改变,便需要修改sql语句的内容,大量sql语句的修改不利于后期维护


2、Mybatis的优势

在Mybatis中,JDBC的缺点都得到了一定程度下的优化,减少了程序猿的工作压力

硬编码可以通过配置到配置文件来实现SQL语句可以动态 *** 作繁琐的代码Mybatis中可以自动完成


二、使用Mybatis执行相应的sql语句

想要使用Mybatis替代JDBC进行数据库的 *** 作,使用Mybatis有以下步骤:

创建相对应的模块,导入对应的Mybatis坐标编写Mybatis核心配置文件,其主要是为了配置数据库的连接信息,从而解决JDBC的硬编码问题编写SQL映射文件,为的是统一管理sql语句,解决硬编码问题编写代码

定义相对应得POJO类加载核心配置文件,获取SqlSessionFactory对象获取SqlSession对象,执行SQL语句释放资源

在编写代码那一部分,我们真正要做的往往只是执行SQL语句那一部分即可,因为其他的部分在MyBatis官网已经提供了,我们只需要在官网CV过来然后修改一丢丢即可投入使用。

MyBatis官网:https://mybatis.org/mybatis-3/zh/index.html


1、创建模块,导入坐标

在新建好的模块的工程目录下可以找到一个pom.xml的配置文件,我们需要在该配置文件中添加相应的依赖坐标



    4.0.0

    org.example
    MyBstis_Demo
    1.0-SNAPSHOT

    
        8
        8
    

    
        
        
            org.mybatis
            mybatis
            3.5.5
        

        
        
            mysql
            mysql-connector-java
            5.1.46
        

        
        
            junit
            junit
            4.13
            test
        

        
        
            org.slf4j
            slf4j-api
            1.7.20
        
        
        
            ch.qos.logback
            logback-classic
            1.2.3
        
        
        
            ch.qos.logback
            logback-core
            1.2.3
        
    


2、编写Mybatis核心配置文件

创建好模块和导入坐标之后,我们需要编写Mybatis核心配置文件来实现数据库的连接




    
    
        
    
    
    
        
            
            
                
                
                
                
                
                
            
        
    
    
        
        
    


3、编写SQL映射文件

在Mybatis核心配置文件中的mappers标签,设置了一个UserMapper.xml的SQL映射文件,那么创建一个SQL的映射文件





    
        select * from tb_user;
    


4、编写代码

首先定义相对应得POJO类

package com.kang.pojo;


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

    public User(Integer id, String username, String password, String gender, String addr) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.gender = gender;
        this.addr = addr;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer 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 + ''' +
                '}';
    }
}

接着编写测试类代码

package com.kang;

import com.kang.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 java.io.IOException;
import java.io.InputStream;
import java.util.List;


public class MyBatisDemo {
    public static void main(String[] args) throws IOException {
        //1、加载mybatis核心配置文件
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //获取SqlSession对象,用来执行sql
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //执行sql,通过名称空间来识别执行哪一个sql语句
        List users = sqlSession.selectList("test.selectAll");
        System.out.println(users);
        //释放资源
        sqlSession.close();
    }
}

运行程序


三、Mapper代理开发

使用上面的方法对数据库进行 *** 作的时候不难发现,这当中依然存在着硬编码的问题,那么当我们用Mapper代理开发的时候就可以更好地解决这一问题。

使用Mapeer代理开发需要完成以下步骤:

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

设置SQL映射的namespace属性为Mapper接口全限定名(也就是接口名字要和namespace的空间名字要相同)

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

编写程序


代码如下:

BrandMapper接口

package com.kang.mapper;

import com.kang.pojo.Brand;
import com.kang.pojo.User;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;


public interface BrandMapper {
    
    public List selectAll();
}

SQL映射文件






    
select

from tb_brand;


2、通过resultMap解决(推荐)

使用sql片段的方式可以解决上述问题,但是这当中难免也存在问题,比如我们只需要查询其中一个字段段的时候,又需要重新编写一个sql片段,这样代码会显得非常冗余。

在映射配置文件中,使用resultMap定义字段和属性的映射关系

    
        

        
        
    

而sql语句可以正常编写,但是之前的resultType换为resultMap

    
        select *
        from mybatis.tb_brand
        where id = #{id};
    

其中花括号的id要与接口中的参数一致

编写测试类

    @Test
    public void testSelectById() throws IOException {
        //传入参数
        int id = 1;
        //1.加载mybatis的核心配置文件,从而获取SqlSessionFactory
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //2.获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //3.获取Mapper接口代理对象
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);

        //4.执行方法
        Brand brand = brandMapper.selectById(id);
        System.out.println(brand);
        //5.释放资源
        sqlSession.close();
    }

1.1 、#{ } 与 ${ }的区别

#{}:执行sql时候,会将#{}占位符替换为?,将来自动设置参数值${}:拼接sql语句,会存在sql注入问题


1.1、sql语句的特殊字段处理

在编写sql语句的xml文件中,当我们使用小于(<)或者大于(>)的时候,会报错

针对这种情况下,有两种解决方案

转义字符

比如以下就是小于号的转移字符

<

使用来将小于包裹,表明这是一个小于的符号,这样计算机就不会报错了


2、多条件查询

在实际开发中,我们难免会遇到多条件查询,也就是查询的条件有多个,而Mybatis针对多参数有多种实现

通过@Param(“参数名称”)标记每一个产生,在映射配置文件中就需要使用#{参数名称}进行占位

List selectByCondition(@Param("status") int status, @Param("companyName") String companyName,@Param("brandName") String brandName);

将多个参数标记为一个实体类对象,并将该实体类对象作为接口的方法参数,该方法要求在映射文件中sql中使用#{内容}的时候,里面的内容必须和实体类的属性名保持一致

List selectByCondition(Brand brand);

将多个参数封装到map集合中,将map集合作为接口方法参数。该方法要求在映射文件中sql中使用#{内容}的时候,里面的内容必须map集合中的键保持一致

List selectByCondition(Map map);

注意:倘若使用模糊查询,需要将字符串拼接成%XXXX%的形式才可以

//接收参数
int status = 1;
String companyName = "华为";
String brandName = "华为";
// 处理参数
companyName = "%" + companyName + "%";
brandName = "%" + brandName + "%";

七、动态SQL

上述的功能实现无非还是有点硬编码的味道,当我们查询的内容不一样的时候,则需要修改SQL语句,极度不方便我们开发

针对这种情况,Mybatis对动态SQL提供了很强的支撑:

Ifchoose(when,otherwise)trim(where,set)foreach


1、If标签

if标签:条件判断标签

test属性:逻辑表达式

    
select *
from tb_brand


and status = #{status}


and company_name like #{companyName}


and brand_name like #{brandName}




3、choose标签和when标签(主要用于单个条件的动态sql语句)

在实际开发中,查询的时候难免可以选择查询条件来查询,因此Mybatis提供了choose(when,otherwise)来实现动态但条件查询