MyBatis简化JDBC开发

2023-12-18 10:40:50

MyBatis是一款优秀的持久层框架,用于简化JDBC开发。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 持久层是负责将数据保存到数据库的那一层代码。? 框架是一个半成品软件,是一套可重用的,通用的,软件基础代码模型,在框架的基础上构建软件编写更加高效,规范,通用可扩展。

JDBC缺点:

? ? ? ?1、硬编码:在创建与数据库之间的连接时,会用到很多字符串,比如:用户名和密码。但很多时候用户名和密码不是一成不变的,需要改动;同时我们需要实现的需求不同时,sql语句也会不同,sql语句也需要改动。

? ? ? ? 2、操作繁琐:sql语句中有多个占位符 ? 时,我们需要一个一个的手动去设置参数。然后在获取对象的时候,我们需要把获取的每一条信息加入相应的对象中。

MyBatis可以解决上述问题,解决办法:把与数据库连接所需的字符串比如数据库ip,用户名和密码单独写入一个配置文件中,sql语句也是单独写入另一个配置文件中,这样我们就可以同时写多个数据库连接所需要的数据,而不需要重复修改同一个,而操作繁琐的那一部分也会有相应的方法自动完成。

下面开始配置写MyBatis所需要的环境:在pom文件中添加以下依赖。

<dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.5</version>
        </dependency>
        <dependency>
            <groupId>mysql </groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.21</version>
<--用于与数据库建立连接-->
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
<--用于写test测试代码-->
        </dependency>
<--下面全是用于写日志的配置-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.36</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>1.1.7</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-access</artifactId>
            <version>1.1.7</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.1.7</version>
        </dependency>

为了在写代码过程中能过速在接口方法和xml文件中找到对应的方法,建议大家可以在idea中下载一个MyBatisX的插件。

下面开始MyBatis的正式编写:? 这是MyBatis的官网,其中有我们需要的代码。有需要的可以去看看。

? ? 入门_MyBatis中文网icon-default.png?t=N7T8https://mybatis.net.cn/getting-started.html

首先让我们在resources资源文件下创建一个xml文件,名为? mybatis-config.xml? ?

然后编辑该文件

<?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>
    <!--设置日志-->
    <!--
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>-->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <!--配置数据源:创建Connection对象-->
            <dataSource type="POOLED">
                <!--driver:驱动内容-->
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <!--连接数据库的url-->
                <property name="url" value="jdbc:mysql://localhost:3306/mysql?useSSL=false&amp;
                serverTimezone=UTC&amp;
                allowPublicKeyRetrieval=true&amp;
                characterEncoding=utf8&amp;
                useUnicode=true"/>
                <!--用户名-->
                <property name="username" value="root"/>
                <!--密码-->
                <property name="password" value="quwenhao"/>
            </dataSource>
        </environment>
    </environments>

    <!--指定其他mapper文件的位置
        目的是找到其他mapper文件的sql语句
    -->
    <mappers>
        <!--使用mapper的resource属性指定mapper文件的路径
            这个路径是从target/classes路径开启的
            使用注意:resource="mapper"文件的路径,使用 / 分割路径
                    一个resource指定一个mapper文件


<!--        Mapper代理方式-->
        <package name="org.example.Mapper"/>
    </mappers>
</configuration>

注意上面是我连接我自己的MySql数据库,其中的url,username和password对应的value都需要改成你自己的数据库的对应数据。

mybatis-config.xml 中写明了连接数据库所需要的ip,用户名和密码,同时<mappers>中指明了接口方法所在的路径。

然后创建数据库中对应的实体类,先创建一个pojo包用于存放多个实体类,在pojo包中创建对应的实体类。

package org.example.pojo;

public class brand {
    private int id;
    private String city;
    private Integer points;
    private String firstName;
    private String lastName;
    private String state;

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }


    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    private String address;

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public int getId() {
        return id;
    }

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

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public Integer getPoints() {
        return points;
    }

    public void setPoints(Integer points) {
        this.points = points;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
}

在实体类中,声明与数据库中字段相应的属性,并写好对应的get和set方法。(数据库中的字段如first_name这样的,在实体类中用驼峰表示法firstName)。

然后写操作数据库的接口方法。先创建一个与pojo包位与同一目录下的Mapper包,Mapper包中存放了操作不同数据库表的多个接口方法。

我们可以先定义一个查询所有的接口方法

public interface brandMapper {
    //查询所有
List<brand>selectAll();

  }

各位在刚写时 selectAll下面会出现红线报错,各位不用担心,这是正常的,先不用管他。

然后继续写我们的配置文件:

? ?在resources资源包中创建一个Mapper包,然后在包中新建文件brandMapper.xml??

注意:在创建directory目录名字为的org.example.Mapper目录时,输入包名时应将 . 符号换成 \

应该这样写 org\example\Mapper 才能创建成我们所需要的目录结构

然后编写该文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--<mapper namespace="test">-->
<mapper namespace="org.example.Mapper.brandMapper">
    <select id="selectAll"resultType="org.example.pojo.brand">

    </select>
</mapper>

namespace是为sql语句和实体类这个整体起个名字,可以随意起;但在用MyBatis代理时有要求需要改成对应的Mapper接口的全限定名。

<select>标签中的id是为该组sql语句定义一个名字,最好与我们定义的对应的接口方法一致,resultType是对应的实体类的路径。我们需要实现的sql语句写在<select>标签中间。

<select id="selectAll" resultType="org.example.pojo.brand">
        select *
        from sql_store.customers
    </select>

然后来说一下MyBatis代理的要求:1、定义与sql映射文件同名的Mapper接口,并且将Mapper接口和sql映射文件配置在同一目录下。这个我们在写文件时已经搞完了。

? ?2、设置sql配置文件的namespace属性为Mapper接口的全限定名。这个上面也说明了,已经写好了。

? 3、在Mapper接口定义方法中,方法名就是sql映射文件中sql标签中的id,并保持参数类型和返回值类型一致。就是写<select id="selectAll" resultType="org.example.pojo.brand">,上面也写好了。

? 4、开始编码:(1)通过SqlSession的getMapper方法获取Mapper接口代理对象;(2)调用对应方法完成sql的执行。

下面开始写测试方法:在test包中创建如下结构的MyBatisTest类(MyBatisTest不需要统一,可自定义。)

public class MyBatisTest {
    @Test
    public void selectAll() throws IOException {
        //1.获取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.执行方法
        List<brand> brands = brandMapper.selectAll();
        System.out.println(brands);
        //5.释放资源
        sqlSession.close();
    }

}    

这样就可以实现查询我们需要查询的数据库表中的所有信息了。

在编码过程中大家不难发现在旁边出现了带红或蓝头巾的小鸟图标

这个小鸟图标就是我们前面下的MyBatisX插件的作用,只要我们点击一下红头巾的小鸟,就会跳转到对应的蓝头巾小鸟处,同样只要我们点击一下蓝头巾的小鸟,就会跳转到对应的红头巾小鸟处,这样等以后方法越写越多时,我们就不要在众多的方法中找我们需要的那个了,方便我们迅速找到对应的方法。

以上就是MyBatis代理的配置,以及简单的实现查询所有selectAll方法的步骤。

文章来源:https://blog.csdn.net/hguhbh/article/details/135041654
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。