首页 > 其他分享 >MyBatis及相关文件配置

MyBatis及相关文件配置

时间:2024-11-12 20:20:25浏览次数:3  
标签:文件 数据库 配置 publish public SQL MyBatis id

MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。以下是对MyBatis的详细讲解:

一、MyBatis的起源与发展

  • MyBatis最初是Apache的一个开源项目iBATIS,2010年迁移到Google Code并改名为MyBatis,2013年11月又迁移到GitHub。
  • MyBatis的最新版本是3.5.13,发布于2023年3月11日。

二、MyBatis的核心特性

  • 定制化SQL:MyBatis允许开发人员直接编写SQL语句,可以更灵活地控制SQL语句的编写和执行过程,适用于复杂查询需求。
  • 存储过程支持:MyBatis支持存储过程的调用,使得数据库操作更加灵活和高效。
  • 高级映射:MyBatis提供了强大的对象关系映射功能,可以将数据库中的记录映射成Java对象,也可以将Java对象映射成数据库中的记录。

三、MyBatis的工作原理

  • 配置文件:MyBatis通过配置文件来配置数据库连接信息、SQL语句的映射关系以及其他的一些配置项。
  • 映射文件:映射文件定义了SQL语句与Java方法的映射关系,包括SQL语句的编写、参数的绑定以及结果集的映射等。
  • SQL会话:应用程序通过调用MyBatis的API来创建SQL会话对象,SQL会话是与数据库交互的入口。
  • SQL执行器:SQL执行器负责将SQL语句发送给数据库执行,并将执行结果返回给应用程序。
  • 对象映射器:对象映射器负责将数据库返回的结果集映射成Java对象,同时也负责将Java对象转换成数据库操作所需的参数。

四、MyBatis的功能架构

MyBatis的功能架构可以分为三层:

  • API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。
  • 数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
  • 基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理等。这些都是共用的组件,为上层的数据处理层提供最基础的支撑。

五、MyBatis的应用场景

  • 数据访问层:MyBatis可以作为数据库访问层框架,简化数据库操作的编码工作,提供了灵活的SQL映射和参数绑定功能。
  • 企业级应用:MyBatis适用于各种规模的企业级应用,可以与Spring等容器框架集成,提供灵活的数据库访问解决方案。
  • 分布式系统:MyBatis可以与分布式系统集成,通过配置多个数据源实现数据的分布式访问,可以在分布式环境下提供高性能的数据库操作。
  • 高性能需求:MyBatis是一个轻量级的数据库访问框架,具有较高的性能,适合对数据库操作性能要求较高的场景。
  • 多数据库支持:MyBatis支持多种类型的数据库,包括关系型数据库(如MySQL、Oracle等)和非关系型数据库(如MongoDB、Redis等),适用于需要同时操作多种数据库的场景。

六、MyBatis的优缺点

  • 优点

    • 灵活性高:MyBatis相对于其他ORM框架更加灵活,可以直接编写SQL语句,更加精确地控制数据库操作。
    • SQL优化能力强:MyBatis可以通过手动编写SQL语句来优化数据库查询,减少不必要的查询操作,提高性能。
    • 易于集成:MyBatis可以与其他框架(如Spring)无缝集成,方便使用。
    • 易于学习和使用:MyBatis的学习曲线相对较低,使用简单,对于熟悉SQL语句的开发人员来说更容易上手。
  • 缺点

    • SQL编写工作量大:相对于其他ORM框架,MyBatis需要手动编写SQL语句,对于复杂的查询操作或者数据库表结构变化较大时,需要编写大量的SQL语句。
    • 不适合简单的增删改操作:对于简单的增删改操作,MyBatis相对于其他ORM框架来说需要编写更多的代码。
    • 缺乏自动化功能:MyBatis缺乏一些自动化功能,需要手动编写大部分的SQL语句和映射配置。
    • 灵活性可能导致开发人员犯错:MyBatis的灵活性可能导致开发人员在编写SQL语句时出现错误,对于不熟悉SQL语句的开发人员来说可能更容易出错。

综上所述,MyBatis是一款功能强大、灵活易用的持久层框架,适用于各种规模的企业级应用。然而,它也存在一些缺点,需要开发人员在使用时注意并采取相应的措施来避免潜在的问题。

MyBatis的第一个项目

1. 创建一个maven类型的项目,使用maven帮我们导入框架需要的jar包。

2.创建数据库和表 3.创建MyBatis配置文件conf.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>
    
<!-- 引入外部的资源文件 -->
    <properties resource="db.properties"/>

    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
<!--        开启二级缓存的总开关  -->
        <setting name="cacheEnabled" value="true"/>
<!--        下划线命名方式自动转驼峰命名方式-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    
    <typeAliases>
        <!--        给book类设置别名-->
        <typeAlias type="mybatis.Book" alias="book"/>
    </typeAliases>


    <environments default="dev">
        <environment id="dev">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${driverClassName}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${dbusername}"/>
                <property name="password" value="${dbpassword}"/>
            </dataSource>
        </environment>
    </environments>


<mappers>
    <!-- 告诉核心配置文件,要加载一下图书表的映射文件 -->
    <mapper resource="mappers/bookMapper.xml"/>
    <mapper resource="mappers/userMapper.xml"/>
</mappers>
</configuration>

userMapper.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属性的作用是用来关联该文件对应的dao接口的 -->
<mapper namespace="mybatis.UserDao">

<!--    设置数据库表的字段名与user类的属性名的对应关系-->
<!--    在数据库字段名与类中的属性名不一致的时候,必须使用resultMap,对于名称相同的字段,可以不用写在里面-->
    <resultMap id="abc" type="mybatis.User">

<!--    <id column="id" property="id"/>    -->
<!--        column表示数据库里的字段名,property表示类中的属性名-->
        <result column="ctime" property="createTime"/>
    </resultMap>

    <select id="selectById" resultMap="abc">
        select * from user where id=#{id}
    </select>

    <insert id="batchInsert">
        insert into user (username, password, real_name, age, ctime) values
        <foreach collection="list" item="u" separator=",">
            (#{u.username}, #{u.password}, #{u.realName}, #{u.age}, #{u.createTime})
        </foreach>
    </insert>
</mapper>

bookMapper.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属性的作用是用来关联该文件对应的dao接口的 -->
<mapper namespace="mybatis.BookDao">

    <cache>
        <property name="size" value="10"/>
    </cache>

<!-- id必须与对应的方法名一样,resultType表示本次查询的结果类型 -->
<!-- #{}用来读取方法的参数值 -->
<select id="selectById" resultType="book" useCache="true">
        select * from book where id=#{id}
    </select>

<select id="selectAll" resultType="mybatis.Book">
        select * from book
    </select>
</mapper>
public class test1 {
    public static void main(String[] args) throws Exception {

        String config = "mybatis-config.xml";

        //使用io流读取配置文件
        InputStream in = Resources.getResourceAsStream(config);

        //通过配置文件的内容,构建连接工厂
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);

        //从工厂中获取一个数据库的连接
        SqlSession session = factory.openSession();

        //从session中获取mybatis给我们生成的BookDao接口的实现类对象
        BookDao bookDao = session.getMapper(BookDao.class);

        Book book = bookDao.selectById(1);

        System.out.println(book.getName());

        List<Book> books = bookDao.selectAll();
        System.out.println(books.size());

        List<Book> list = bookDao.selectByName("三国演义");
        System.out.println(list.size());

        int i = bookDao.deleteById(3);
        System.out.println(i);

        List<Book> books1 = bookDao.selectByAuthorAndPub("罗贯中", "北京大学出版社");

        Book b = new Book();
        b.setName("水浒传");
        b.setAuthor("施耐庵");
        b.setPrice(40);
        b.setPublish("清华大学出版社");
        bookDao.insert(b);

        Book b2 = bookDao.selectById(2);
        b2.setName("西游记");
        b2.setPrice(70);
        bookDao.update(b2);

        //增删改操作,需要提交事务才会生效
        session.commit();
    }
}
public interface BookDao {

    Book selectById(int id);

    List<Book> selectAll();

    @Select("select * from book where name=#{name}")
    List<Book> selectByName(String name);

    //新增,修改,删除这三种操作都只能返回int结果,或者void,返回的值表示受影响的行数
    @Delete("delete from book where id=#{id}")
    int deleteById(int id);

    //同一个方法,注解和配置文件,不可以同时存在
    //@Select("select * from book where author=#{param1} and publish=#{param2}")
    @Select("select * from book where author=#{author} and publish=#{publish}")
    List<Book> selectByAuthorAndPub(@Param("author") String author,
                                    @Param("publish") String publish);

    //values左边的字段名是与数据库表保持一致的,values右边的
    @Insert("insert into book(name,author,price,publish) values" +
            "(#{name},#{author},#{price},#{publish})")
    int insert(Book bo);

    @Update("update book set name=#{name},author=#{author},price=#{price}," +
            "publish=#{publish} where id=#{id}")
    int update(Book bo);

}
//这个类与数据库里的表是对应的,数据库表中有几个字段,这个类中就要有几个属性
//而且数据类型要适配
public class Book implements Serializable {

    private int id;
    private String name;
    private String author;
    private int price;
    private String publish;

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public String getAuthor() {
        return author;
    }

    public int getPrice() {
        return price;
    }

    public String getPublish() {
        return publish;
    }

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

    public void setName(String name) {
        this.name = name;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    public void setPublish(String publish) {
        this.publish = publish;
    }
}

标签:文件,数据库,配置,publish,public,SQL,MyBatis,id
From: https://blog.csdn.net/tjxzjbs/article/details/143722438

相关文章

  • Linux文件属性
    文件属性【1】、ls-ihl每一列的含义[root@kylin-xu~]#ls-ilh总用量105M102604839-rw-r--r--1rootroot57M9月212017access.log102685193-rw-------1rootroot2.7K11月312:29anaconda-ks.cfg102407797-rw-r--r--1rootroot3.1K11月312:3......
  • ansible-复制文件案例
    ansible-复制文件案例1)aoa.tgzansible-i/data/ld_fabu/ansible_cfg/hostsall-mcopy-a'src=/data/ld_fabu/env_online/sourcefile/aoa.tgzdest=/data/game/update/aoa.tgzowner=ledou00group=ledou00mode=0644'2)删除ansible-i/data/ld_fabu/ansible_cfg/......
  • nextjs 动态生成sitemap.xml 文件
    在app目录下创建文件sitemap.js,默认导出sitemap方法importfsfrom"fs";importpathfrom"path";constbaseUrl=process.env.NEXT_PUBLIC_SITE_URL||"https://www.adog.life";constbaseDir="src/app";constdynamicDirs=[......
  • debian11 使用python3 启动http文件服务器和ftp服务器脚本
    http文件服务器start_http_server.sh#!/bin/bashport=$1host=0.0.0.0functionUsage(){echo-e"Usage:${0}[port]"exit0}if[[${port}==""]];thenUsagefi#检查端口号是否被占用check_port=`netstat-ant|grepLISTEN|grep${port}......
  • Linux搭建FTP服务器配置
    一、概念1.1介绍FTP:Filetransferprotocol文件传输协议端口TCP21:命令TCP20:数据1.2原理默认采用被动模式被动模式FTP为了解决服务器发起到客户的连接的问题,人们开发了一种不同的FTP连接方式。这就是所谓的被动方式,或者叫做PASV,当客户端通知服务器它处于被动模式时才启......
  • ATE测试 - STDF文件分析 - Excel报表格式探讨
    1、转换对象:STDF文件2、适用人员:TE或解决方案人员或需要对测试项TestItem原始测试值进行分析的2、Excel格式:如下示意图4、局限性:Excel一个sheet中,列数最大不能超过16384列,行数最大不能超过1048576行,因此这种格式对于超过16384颗Die的文件就无法生成Excel文件了,但对于TE来......
  • ubuntu下配置vim插件,实现轻量级代码编辑器
    背景因为需要用虚拟机做实验,然后虚拟机配置的内存很小,如果使用vscode编辑器,内存占用太高,所以放弃,远程使用vscode通过sftp链接也会有很多bug,所以也放弃,鉴于以上。只能考虑使用vimvim的优点轻量级不需要gui的支持,可以在server和desktop版本之间不限制是使用vim插件安装cu......
  • VS Code配置CMake
    在Windows上为VisualStudioCode配置CMake,构建管理CMake项目。1.安装CMake(国内镜像下载更快),安装完成后在终端中输入cmake命令测试是否安装成功。2.为VSCode安装扩展CMake和CMakeTools。3.创建CMake项目。  3.1.打开命令面板(Ctrl+Shift+P)并运行CMake:QuickStart......
  • 【Java】Java读写Excel文件
    常见的JavaExcel操作方法Java中常用的Excel操作方式有什么呢?ApachePOIEasyExcel这两种方法有什么区别和联系?ApachePOI是一个用于操作MicrosoftOffice格式文件(如Excel、Word等)的Java库。它提供了一系列的API来读写Excel文件。POI的基本功能如下:结构说......
  • 运维系列&虚拟机系列:Ubuntu Server 24.04.1 配置静态ip
    UbuntuServer24.04.1配置静态ipUbuntuServer24.04.1配置静态ip1.找到NetPlan配置文件2.cat一下3.我这里用的无线网卡,修改wlp1s0下的配置4.保存文件后,执行5.检查IP地址和网络连接UbuntuServer24.04.1配置静态ip实体机安装完后,记录一下静......