【MyBatis】入门IDEA搭建

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
可观测可视化 Grafana 版,10个用户账号 1个月
简介: MyBatis是一个,它提供了一种。它的主要作用是将Java对象与数据库表之间进行映射,使开发者可以通过面向对象的方式操作数据库,而。MyBatis是一个orm框架。


一、概念

1、什么是mybatis?

MyBatis是一个开源的Java持久层框架,它提供了一种简化数据库访问的方式。它的主要作用是将Java对象与数据库表之间进行映射,使开发者可以通过面向对象的方式操作数据库,而不需要编写大量的SQL语句MyBatis是一个orm框架。

2、MyBatis主要有那些几个作用?

    1. 对象关系映射(Object-Relational Mapping, ORM):MyBatis通过配置文件将Java对象与数据库表之间建立映射关系,可以方便地进行数据库操作,包括增删改查。
    2. 简化SQL操作:MyBatis可以将复杂的SQL语句拆分为多个简单的SQL片段,并且可以通过参数动态地生成SQL语句,从而减少编写SQL的工作量。
    3. 提供灵活性:MyBatis不会限制开发者的自由度,可以自定义SQL语句和映射规则,灵活适应各种复杂业务需求。
    4. 支持多种数据库:MyBatis支持主流的关系型数据库,如MySQL、Oracle、SQL Server等,也支持一些非关系型数据库。

    3、MyBatis适用场景

      1. 对数据库操作较为复杂、SQL语句较多的项目。
      2. 需要灵活控制SQL语句的生成和执行过程。
      3. 需要在代码和SQL之间建立良好的分离和解耦。
      4. 对数据库性能要求较高,需要高效地执行SQL语句。

      MyBatis是一个优秀的持久层框架,它能够简化数据库访问的过程,提高开发效率,并且在各种复杂业务场景下都有良好的适应性。

      4、MyBatis步骤搭建思路

        1. 创建一个Maven项目:在IDEA中,选择File -> New -> Project,然后选择"Maven"作为项目类型,并填写相应的项目信息。
        2. 引入MyBatis依赖:在pom.xml文件中添加MyBatis相关依赖,例如mybatis、mybatis-spring等。可以通过Maven的仓库或者搜索引擎来查找最新的版本。
        3. 配置数据源:在src/main/resources目录下创建一个名为application.properties(或application.yml)的配置文件,配置数据库连接信息,包括数据库URL、用户名和密码等。
        4. 创建与数据库表对应的POJO类:根据需要操作的数据库表结构,使用Java类创建对应的实体类,并注解字段与数据库表的映射关系。
        5. 创建Mapper接口:创建一个接口,命名规则为XXXMapper.java,用于定义数据库的增删改查操作方法,方法的名称和参数要与Mapper XML文件中的语句对应。
        6. 创建Mapper XML文件:在src/main/resources目录下创建一个与Mapper接口同名的xml文件,用于编写具体的SQL语句。
        7. 配置MyBatis:在spring配置文件中进行MyBatis的相关配置,包括扫描Mapper接口的路径、指定Mapper XML的位置、配置数据源等。
        8. 编写业务逻辑代码:在Service层或者Controller层中调用Mapper接口中定义的方法,实现具体的业务逻辑。
        9. 运行测试:编写相应的JUnit测试用例,验证代码逻辑是否正确。
        10. 部署与发布:完成开发和测试后,将项目打包部署至服务器或云平台上,供外部访问使用。

        二、搭建MyBatis框架环境

        首先创建我们的maven项目

        1、web.xml

        image.gif编辑

        修改web.xml由2.3至3.1

        <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
                 version="3.1">
            <display-name>Archetype Created Web Application</display-name>
        </web-app>
        image.gif

        2、pox.xml更改

        在pox.xml里面加载我们的插件和jia包

        <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
            <modelVersion>4.0.0</modelVersion>
            <groupId>org.example</groupId>
            <artifactId>MyBatis</artifactId>
            <packaging>war</packaging>
            <version>1.0-SNAPSHOT</version>
            <name>MyBatis Maven Webapp</name>
            <url>http://maven.apache.org</url>
            <dependencies>
                <!-- ********************** junit单元测试依赖 ********************** -->
                <dependency>
                    <groupId>junit</groupId>
                    <artifactId>junit</artifactId>
                    <version>4.12</version>
                    <scope>test</scope>
                </dependency>
                <!-- ********************** Java Servlet API  ********************** -->
                <dependency>
                    <groupId>javax.servlet</groupId>
                    <artifactId>javax.servlet-api</artifactId>
                    <version>4.0.0</version>
                    <scope>provided</scope>
                </dependency>
                <!-- ********************** Mybatis依赖 ********************** -->
                <dependency>
                    <groupId>org.mybatis</groupId>
                    <artifactId>mybatis</artifactId>
                    <version>3.4.5</version>
                </dependency>
                <!-- ********************** Mysql JDBC驱动 ********************** -->
                <dependency>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                    <version>5.1.44</version>
                </dependency>
                <!-- **********************  日志配置  ********************** -->
                <!--记得修改mybatis.cfg.xml添加如下内容-->
                <!--<setting name="logImpl" value="LOG4J2"/>-->
                <!--核心log4j2jar包-->
                <dependency>
                    <groupId>org.apache.logging.log4j</groupId>
                    <artifactId>log4j-core</artifactId>
                    <version>2.9.1</version>
                </dependency>
                <dependency>
                    <groupId>org.apache.logging.log4j</groupId>
                    <artifactId>log4j-api</artifactId>
                    <version>2.9.1</version>
                </dependency>
                <!--web工程需要包含log4j-web,非web工程不需要-->
                <dependency>
                    <groupId>org.apache.logging.log4j</groupId>
                    <artifactId>log4j-web</artifactId>
                    <version>2.9.1</version>
                </dependency>
            </dependencies>
            <build>
                <resources>
                    <!--解决mybatis-generator-maven-plugin运行时没有将XxxMapper.xml文件放入target文件夹的问题-->
                    <resource>
                        <directory>src/main/java</directory>
                        <includes>
                            <include>**/*.xml</include>
                        </includes>
                    </resource>
                    <!--解决mybatis-generator-maven-plugin运行时没有将jdbc.properites文件放入target文件夹的问题-->
                    <resource>
                        <directory>src/main/resources</directory>
                        <includes>
                            <include>jdbc.properties</include>
                            <include>*.xml</include>
                        </includes>
                    </resource>
                </resources>
                <plugins>
                    <plugin>
                        <groupId>org.mybatis.generator</groupId>
                        <artifactId>mybatis-generator-maven-plugin</artifactId>
                        <version>1.3.2</version>
                        <dependencies>
                            <!--使用Mybatis-generator插件不能使用太高版本的mysql驱动 -->
                            <dependency>
                                <groupId>mysql</groupId>
                                <artifactId>mysql-connector-java</artifactId>
                                <version>5.1.44</version>
                            </dependency>
                        </dependencies>
                        <configuration>
                            <overwrite>true</overwrite>
                        </configuration>
                    </plugin>
                </plugins>
                <finalName>MyBatis</finalName>
            </build>
        </project>
        image.gif

        3、Jdbc.properties

        jdbc.driver=com.mysql.jdbc.Driver
        jdbc.url=jdbc:mysql://localhost:3306/mybatis_ssm?useUnicode=true&characterEncoding=UTF-8
        jdbc.username=root
        jdbc.password=123456

        image.gif

        4、准备插件

        进入设置、插件的位置搜索下载以下插件;

        MybatisX

        Mybatis generator

        mybatis tools

        maven helper

        image.gif编辑

        5、mybatis.cfg.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="jdbc.properties"/>
            <settings>
                <setting name="logImpl" value="LOG4J2"/>
            </settings>
            <!-- 别名 -->
            <typeAliases>
                <!--<typeAlias type="com.javaxl.model.Book" alias="Book"/>-->
            </typeAliases>
            <!-- 配置mybatis运行环境 -->
            <environments default="development">
                <environment id="development">
                    <!-- type="JDBC" 代表使用JDBC的提交和回滚来管理事务 -->
                    <transactionManager type="jdbc"/>
                    <!-- mybatis提供了3种数据源类型,分别是:POOLED,UNPOOLED,JNDI -->
                    <!-- POOLED 表示支持JDBC数据源连接池 -->
                    <!-- UNPOOLED 表示不支持数据源连接池 -->
                    <!-- JNDI 表示支持外部数据源连接池 -->
                    <dataSource type="POOLED">
                        <property name="driver"
                                  value="${jdbc.driver}"/>
                        <property name="url"
                                  value="${jdbc.url}"/>
                        <property name="username" value="${jdbc.username}"/>
                        <property name="password" value="${jdbc.password}"/>
                    </dataSource>
                </environment>
            </environments>
            <mappers>
                <mapper resource="com/tgq/mapper/BookMapper.xml"/>
            </mappers>
        </configuration>

        image.gif

        这一行代码后面是自动生成后的文件

        <mappers>
                <mapper resource="com/tgq/mapper/BookMapper.xml"/>
            </mappers>
        image.gif

        6、generatorConfig.xml

        <?xml version="1.0" encoding="UTF-8" ?>
        <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
                "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >
        <generatorConfiguration>
            <!-- 引入配置文件 -->
            <properties resource="jdbc.properties"/>
            <!--指定数据库jdbc驱动jar包的位置 maven里面 -->
            <classPathEntry
                    location="D:\\zking App\\mvn_repository\\mysql\\mysql-connector-java\\5.1.44\\mysql-connector-java-5.1.44.jar"/>
            <!-- 一个数据库一个context -->
            <context id="infoGuardian">
                <!-- 注释 -->
                <commentGenerator>
                    <property name="suppressAllComments" value="true"/><!-- 是否取消注释 -->
                    <property name="suppressDate" value="true"/> <!-- 是否生成注释代时间戳 -->
                </commentGenerator>
                <!-- jdbc连接 -->
                <jdbcConnection driverClass="${jdbc.driver}"
                                connectionURL="${jdbc.url}" userId="${jdbc.username}" password="${jdbc.password}"/>
                <!-- 类型转换 -->
                <javaTypeResolver>
                    <!-- 是否使用bigDecimal, false可自动转化以下类型(Long, Integer, Short, etc.) -->
                    <property name="forceBigDecimals" value="false"/>
                </javaTypeResolver>
                <!-- 01 指定javaBean生成的位置 -->
                <!-- targetPackage:指定生成的model生成所在的包名 -->
                <!-- targetProject:指定在该项目下所在的路径  -->
                <javaModelGenerator targetProject="src/main/java"
                                    targetPackage="com.tgq.model"
                >
                    <!-- 是否允许子包,即targetPackage.schemaName.tableName -->
                    <property name="enableSubPackages" value="false"/>
                    <!-- 是否对model添加构造函数 -->
                    <property name="constructorBased" value="true"/>
                    <!-- 是否针对string类型的字段在set的时候进行trim调用 -->
                    <property name="trimStrings" value="false"/>
                    <!-- 建立的Model对象是否 不可改变  即生成的Model对象不会有 setter方法,只有构造方法 -->
                    <property name="immutable" value="false"/>
                </javaModelGenerator>
                <!-- 02 指定sql映射文件生成的位置 -->
                <sqlMapGenerator targetProject="src/main/java" targetPackage="com.tgq.mapper">
                    <!-- 是否允许子包,即targetPackage.schemaName.tableName -->
                    <property name="enableSubPackages" value="false"/>
                </sqlMapGenerator>
                <!-- 03 生成XxxMapper接口 -->
                <!-- type="ANNOTATEDMAPPER",生成Java Model 和基于注解的Mapper对象 -->
                <!-- type="MIXEDMAPPER",生成基于注解的Java Model 和相应的Mapper对象 -->
                <!-- type="XMLMAPPER",生成SQLMap XML文件和独立的Mapper接口 -->
                <javaClientGenerator targetProject="src/main/java" targetPackage="com.tgq.mapper" type="XMLMAPPER">
                    <!-- 是否在当前路径下新加一层schema,false路径com.oop.eksp.user.model, true:com.oop.eksp.user.model.[schemaName] -->
                    <property name="enableSubPackages" value="false"/>
                </javaClientGenerator>
                <!-- 配置表信息 -->
                <!-- schema即为数据库名 -->
                <!-- tableName为对应的数据库表 -->
                <!-- domainObjectName是要生成的实体类 -->
                <!-- enable*ByExample是否生成 example类 -->
                <!--<table schema="" tableName="t_book" domainObjectName="Book"-->
                <!--enableCountByExample="false" enableDeleteByExample="false"-->
                <!--enableSelectByExample="false" enableUpdateByExample="false">-->
                <!--&lt;!&ndash; 忽略列,不生成bean 字段 &ndash;&gt;-->
                <!--&lt;!&ndash; <ignoreColumn column="FRED" /> &ndash;&gt;-->
                <!--&lt;!&ndash; 指定列的java数据类型 &ndash;&gt;-->
                <!--&lt;!&ndash; <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> &ndash;&gt;-->
                <!--</table>-->
                <table schema="" tableName="t_mvc_Book" domainObjectName="Book"
                       enableCountByExample="false" enableDeleteByExample="false"
                       enableSelectByExample="false" enableUpdateByExample="false">
                    <!-- 忽略列,不生成bean 字段 -->
                    <!-- <ignoreColumn column="FRED" /> -->
                    <!-- 指定列的java数据类型 -->
                    <!-- <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> -->
                </table>
            </context>
        </generatorConfiguration>

        image.gif

        数据库jdbc驱动jar包的位置 maven里面,复制路径后需要再加一个斜杠

        <!--指定数据库jdbc驱动jar包的位置 maven里面 -->
            <classPathEntry
                    location="D:\\zking App\\mvn_repository\\mysql\\mysql-connector-java\\5.1.44\\mysql-connector-java-5.1.44.jar"/>
        image.gif

        对应生成文件位置

        <javaModelGenerator targetProject="src/main/java" targetPackage="com.tgq.model">
        image.gif

        对应需要生成的数据库表,需要生成几个表就写几个;tableName:数据库里面的表名;domainObjectName:生成的实体类名

        <table schema="" tableName="t_mvc_Book" domainObjectName="Book"
                       enableCountByExample="false" enableDeleteByExample="false"
                       enableSelectByExample="false" enableUpdateByExample="false">
                    <!-- 忽略列,不生成bean 字段 -->
                    <!-- <ignoreColumn column="FRED" /> -->
                    <!-- 指定列的java数据类型 -->
                    <!-- <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> -->
                </table>
        image.gif

        三、MyBatis的基础操作CRUD

        1、MyBatis自动生成

        右键我们的鼠标选中mybatis generator:generate

        image.gif编辑

        生成代码

        image.gif编辑

        2、 编写业务逻辑层

        编写BookBiz接口

        package com.tgq.biz;
        import com.tgq.model.Book;
        public interface Bookbiz {
            int deleteByPrimaryKey(Integer bid);
            int insert(Book record);
            int insertSelective(Book record);
            Book selectByPrimaryKey(Integer bid);
            int updateByPrimaryKeySelective(Book record);
            int updateByPrimaryKey(Book record);
        }
        image.gif

        编写BookBizImpl接口实现类

        package com.tgq.biz.impl;
        import com.tgq.biz.Bookbiz;
        import com.tgq.mapper.BookMapper;
        import com.tgq.model.Book;
        /**
         * @软件包名 com.tgq.biz.impl
         * @用户 tgq
         * @注释说明:
         */
        public class BookBizImpl implements Bookbiz {
            private BookMapper bookMapper;
             public BookMapper getBookMapper() {
                return bookMapper;
            }
            public void setBookMapper(BookMapper bookMapper) {
                this.bookMapper = bookMapper;
            }
            public int deleteByPrimaryKey(Integer bid) {
                return bookMapper.deleteByPrimaryKey(bid);
            }
            public int insert(Book record) {
                return bookMapper.insert(record);
            }
            public int insertSelective(Book record) {
                return bookMapper.insertSelective(record);
            }
            public Book selectByPrimaryKey(Integer bid) {
                return bookMapper.selectByPrimaryKey(bid);
            }
            public int updateByPrimaryKeySelective(Book record) {
                return bookMapper.updateByPrimaryKeySelective(record);
            }
            public int updateByPrimaryKey(Book record) {
                return bookMapper.updateByPrimaryKey(record);
            }
        }
        image.gif

        3、编写工具类

        编写一个工厂类SessionUtil

        package com.tgq.utils;
        import org.apache.ibatis.session.SqlSession;
        import org.apache.ibatis.session.SqlSessionFactory;
        import org.apache.ibatis.session.SqlSessionFactoryBuilder;
        public class SessionUtil {
            private static SqlSessionFactory sessionFactory;
            private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();
            static {
        //        对mybatis.cfg.xml进行建模
                sessionFactory = new SqlSessionFactoryBuilder().build(SessionUtil.class.getResourceAsStream("/mybatis.cfg.xml"));
            }
            public static SqlSession openSession() {
                SqlSession session = threadLocal.get();
                if (null == session) {
                    session = sessionFactory.openSession();
                    threadLocal.set(session);
                }
                return session;
            }
            public static void main(String[] args) {
                SqlSession session = openSession();
                System.out.println(session.getConnection());
                session.close();
        //        System.out.println(session.getConnection());
            }
        }
        image.gif

        4、编写测试类

        编写一个测试,测试我们生成的方法

        image.gif编辑

        package com.demo;
        import com.tgq.biz.Bookbiz;
        import com.tgq.biz.impl.BookBizImpl;
        import com.tgq.mapper.BookMapper;
        import com.tgq.model.Book;
        import com.tgq.utils.SessionUtil;
        import org.apache.ibatis.session.SqlSession;
        import org.junit.After;
        import org.junit.Before;
        import org.junit.Test;
        /**
         * @软件包名 com.demo
         * @用户 tgq
         * @create 2023-08-21 上午9:35
         * @注释说明:
         */
        public class demo01 {
            private SqlSession sqlSession;
            private Bookbiz bookbiz;
            @Before
            public void before() {
                System.out.println("执行方法之前初始化执行");
                //获取session对象
                sqlSession = SessionUtil.openSession();
                //实例化业务逻辑层
                BookBizImpl bookbiz = new BookBizImpl();
                //获取接口实例
                BookMapper mapper = sqlSession.getMapper(BookMapper.class);
                bookbiz.setBookMapper(mapper);
                //最后赋值给bookBiz接口,便于对数据库进行增删改查操作
                this.bookbiz = bookbiz;
            }
            @After
            public void after() {
                System.out.println("执行方法之后执行");
                //提交事务
                sqlSession.commit();
            }
            @Test
            public void test01() {
                System.out.println("测试查询");
                Book book = bookbiz.selectByPrimaryKey(12);
                System.out.println(book);
            }
            @Test
            public void test02() {
                System.out.println("测试删除");
                int insert = bookbiz.insert(new Book(23, "", 0f));
                System.out.println("影响行数" + insert);
            }
        }
        image.gif

        image.gif编辑image.gif编辑


        相关实践学习
        基于CentOS快速搭建LAMP环境
        本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
        全面了解阿里云能为你做什么
        阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
        相关文章
        |
        14天前
        |
        SQL Java 数据库连接
        MyBatis 框架入门理论与实践
        MyBatis 框架入门理论与实践
        37 6
        |
        13天前
        |
        Java 数据库连接 测试技术
        MyBatis-Plus入门
        MyBatis-Plus入门
        |
        14天前
        |
        安全 Java 数据库连接
        在IntelliJ IDEA中通过Spring Boot集成达梦数据库:从入门到精通
        在IntelliJ IDEA中通过Spring Boot集成达梦数据库:从入门到精通
        |
        14天前
        |
        SQL 监控 数据库
        MybatisPlus入门(下)
        MybatisPlus入门教程中介绍了如何使用拦截器和性能分析插件。配置拦截器只需添加`PaginationInterceptor`,测试分页查询显示底层使用了`limit`。逻辑删除功能通过`TableLogic`注解和`LogicSqlInjector`实现,性能分析插件`PerformanceInterceptor`用于监控SQL执行时间,超过设定值会抛出异常。条件构造器如`QueryWrapper`提供便捷的查询条件设置,支持多种比较操作。
        |
        14天前
        |
        数据库
        |
        14天前
        |
        Java 关系型数据库 数据库连接
        |
        14天前
        |
        Java 关系型数据库 数据库连接
        Mybatis-Plus 入门
        Mybatis-Plus 入门
        20 0
        |
        14天前
        |
        SQL Java 数据库连接
        Javaweb之Mybatis入门程序的详细解析
        Javaweb之Mybatis入门程序的详细解析
        23 0
        |
        14天前
        |
        SQL Java 数据库连接
        Javaweb之Mybatis入门的详细解析
        Javaweb之Mybatis入门的详细解析
        15 0
        |
        14天前
        |
        SQL JavaScript Java
        mybatis-flex入门体验(一)
        `shigen`,一个专注于Java、Python、Vue和Shell的博主,分享成长和认知。近期探索了`mybatis-flex`,通过官网学习了代码生成和编码体验。配置数据源和依赖后,利用示例代码生成了符合Lombok+MyBatis Plus规范的实体和Mapper。此外,展示了如何配置SQL打印,并用测试代码演示了查询、多条件查询和更新操作。`mybatis-flex`的亮点在于流畅的查询语法和连表查询功能。后续将分享更多关于连表查询的实践。一起学习,每天进步!
        62 0
        mybatis-flex入门体验(一)