Mybatis的使用


前言

介绍一下mybatis的使用

使用步骤

1.创建项目

第一步:new一个新的工程
在这里插入图片描述
在这里插入图片描述
创建好的项目结构是这样的
在这里插入图片描述

2.导入依赖

**在这里插入图片描述
**
刚导入的pom.xml应该是这样的
然后导入依赖包,需要什么依赖就去(https://mvnrepository.com/ )maven官网找想要的依赖。
测试mybatis用到的依赖如下

<dependencies>
        <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.28</version>
        </dependency>
        <!--mybatis-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.9</version>
        </dependency>
        <!--junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.26</version>
        </dependency>
    </dependencies>

3.添加配置

首先做一下mysql数据库的相关配置
在resources下创建一个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>
        <!--在控制台输出发送的sql日志-->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>


    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>

            <!--目前只关注这部分内容,它的作用就是声明要连接的数据信息-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <!--声明含有sql的接口所在包-->
        <package name="com.itheima.mapper"/>
    </mappers>
</configuration>

这里面几个注意的点:

  1. < setting name=“mapUnderscoreToCamelCase” value=“true”/>这个配置是开启驼峰命名的,开启这个配置后,如果数据库表中的字段名和实体类中的属性名符合驼峰映射的话,就不需要手动映射了。
    MyBatis允许你在配置文件或代码中启用驼峰命名规则转换,这样它会自动将Java驼峰式命名的属性名转换成下划线风格的数据库字段名。例如,firstName会转换成first_name。
  2. < property name=“url” value=“jdbc:mysql://localhost:3306/mybatis”/>这行配置用于指定连接数据库的URL。这里的各个部分含义如下:
    jdbc:mysql://:这是JDBC驱动程序的协议头,表明使用MySQL的JDBC驱动程序。
    localhost:表示数据库服务器的地址,这里的localhost意味着数据库运行在同一台机器上。
    3306:这是MySQL默认的端口号,用于监听客户端的连接请求。
    mybatis:这是数据库的名字,你将连接到这个特定的数据库实例。
    这里的配置指定了数据库的URL、驱动程序、用户名和密码,这些都是建立数据库连接所必需的信息。在实际应用中,你可能需要根据自己的数据库环境调整这些值,比如更换localhost为实际的服务器IP,修改端口号,以及使用正确的数据库名称、用户名和密码。
  3. 这一行是用来扫描指定包下的Mapper接口,以便MyBatis可以自动识别并加载这些接口对应的XML映射文件。

4.编写实体类

在这里插入图片描述
如上面图片所示:
在java包下创建一个公司域名的包,在这个包下创建一个domain的包,这个包就是装实体类的包(一般公司都是domain包,这个包名不固定)

package com.itheima.domain;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDate;
import java.time.LocalDateTime;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Emp {
    private Integer id;
    private String username;
    private String password;
    private String name;
    private String gender;
    private String image;
    private String job;

    //注意:这四个属性跟数据表中的字段不一致
    private LocalDate ed;

    private Integer deptId;
    private LocalDateTime createTime;
    private LocalDateTime updateTime;
}

在这里插入图片描述

这里的字段要和数据库表的字段一一对应,起名字不必和表字段一致,但要知道实体类中的属性是什么意思。
还要注意使用的是lombok这个包(有些公司不让用),只用lombok只需要加三个注释就可以实现有参和无参构造函数,get,set方法和equals的重写
在这里插入图片描述
前提是pom.xml中有lombok包

5.编写mapper接口

用注释编写sql语句

在这里插入图片描述
在这里插入图片描述
使用注释增删改查的注释就是图片上的注释
注意:如果实体类名字和数据库表中的名字不一样,也不是按照驼峰命名,那么需要使用@result这个注释表明。

用xml编写sql语句

在这里插入图片描述
这里mapper层不需要写注释了,
在这里插入图片描述
xml中的代码如上。
namespace是mapper接口的全类名。注意语句标签中的id要和接口中的方法名字一样,reseltMap是解决名称不一致的,type中写的是实体类中的全类名。
用xml写sql的好处是可以使用动态sql
演示代码如下:

 <update id="updateAll">
    update emp
    <set>
     <if  test="username != null and username != ''">
         username = #{username},
     </if>
     <if test="password != null and password != ''">
         password = #{password},
     </if>
        <if test="name != null and name != ''">
            name = #{name},
        </if>
     <if test="gender!=null">
         gender = #{gender},
     </if>
     <if test="image!=null and image!=''">
         image = #{image},
     </if>
     <if test="job!=null ">
         job = #{job},
     </if>
        <if test="ed != null">
            entrydate = #{ed},
        </if>
        <if test="deptId != null">
            dept_id = #{deptId},
        </if>
        <if test="createTime != null">
            create_time = #{createTime},
        </if>
        <if test="updateTime != null">
            update_time = #{updateTime},
        </if>
    </set>
        where id = #{id}
    </update>

这是if的动态sql,主要是进行判断的,符合条件的才进行sql查询
set:set元素会检查每个if语句中的条件。如果某个字段的值不为NULL,那么这个字段就会被包含在SET子句中。注意每个if语句的结尾都包含了逗号,这是因为set元素会自动移除最后一个字段后的逗号,以保证SQL语句的语法正确。

where元素的特点:
如果where元素内的任何条件都不满足,则整个where元素将被忽略,不会生成任何SQL。
如果where元素内的第一个条件满足,那么where元素会自动在生成的SQL中添加WHERE关键字。
where元素会移除它内部条件语句前的AND或OR关键字,以防止SQL语法错误。
代码如下:

<select id="selectUsers" parameterType="map" resultType="User">
    SELECT * FROM users
    <where>
        <if test="username != null">
            AND username = #{username}
        </if>
        <if test="email != null">
            AND email = #{email}
        </if>
        <if test="isActive != null">
            AND is_active = #{isActive}
        </if>
    </where>
</select>

foreach

<select id="findUsersByIds" parameterType="java.util.List" resultType="com.example.User">
    SELECT * FROM users
    WHERE id IN
    <foreach item="item" index="index" collection="list" open="(" separator="," close=")">
        #{item}
    </foreach>
</select>

在这个例子中,collection属性设置为list,意味着传入的参数应该是一个List。item属性定义了一个变量item,用于表示List中的每个元素。open和close属性用于生成括号包围IN子句,而separator属性则指定了元素之间的逗号分隔符。
注意:
这个写sql的xml要放在resources,而且路径名字和上面的mapper接口名字一样
起包名要注意/的使用

在这里插入图片描述
在这里插入图片描述

5.编写测试类

编写测试类要在test/java下建包。
在这里插入图片描述
最好写一个util工具类
在这里插入图片描述
如果调用sql用这个工具类就好。
代码如下:


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.InputStream;

public class MybatisUtil {

    private static SqlSessionFactory sqlSessionFactory = null;

    //保证SqlSessionFactory仅仅创建一次
    static {
        try {
            //读取配置文件
            InputStream stream = Resources.getResourceAsStream("SqlMapConfig.xml");
            //创建SqlSessionFactory
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(stream);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //获取sqlSession
    public static SqlSession getSqlSession() {
        return sqlSessionFactory.openSession();
    }

    //提交事务 关闭sqlSession
    public static void close(SqlSession sqlSession) {
        if (sqlSession != null) {
            //提交事务
            sqlSession.commit();
            //释放资源
            sqlSession.close();
        }
    }
}

接下来写测试类就可以了
代码如下:


import com.itheima.domain.Emp;
import com.itheima.mapper.EmpMapper;
import com.itheima.util.MybatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.time.LocalDate;

public class EmpTest {
    @Test
    public void testFindById() {
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);

        Emp emp = empMapper.findById(1);
        System.out.println(emp);

        MybatisUtil.close(sqlSession);
    }
    @Test
    public void insertOne() {
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);
        Emp emp = new Emp();
        emp.setEd(LocalDate.of(2001,5,2));
        empMapper.insertOne(emp.getEd());
        MybatisUtil.close(sqlSession);
    }
}

注意:要加上@Test这个注解,就可以测试了。。。

MyBatis是一个流行的Java持久化框架之一,可以简化与关系型数据库的交互。在使用MyBatis时,我们可以使用properties来配置一些常用的属性,以便在不同环境中灵活地配置和管理。 然而,有时候我们会遇到MyBatis使用properties无效的情况。这可能由以下原因导致: 1. properties文件未正确配置:首先,要确保properties文件的路径和名称是正确的,并且在配置文件中正确引用。此外,还需要检查properties文件中的属性是否按照MyBatis规定的格式进行了正确定义。 2. properties文件未加载:MyBatis在加载配置文件时,默认会加载classpath下的mybatis-config.xml文件。如果你将properties文件放置在了其他位置,需要确保在mybatis-config.xml文件中进行了正确的配置和引用。 3. 属性引用错误:在MyBatis的配置文件中,我们可以通过`${property.name}`的方式引用properties文件中的属性值。如果你没有正确引用或引用了不存在的属性值,可能会导致properties文件无效。 4. XML配置错误:在MyBatis的配置文件中,如果XML格式错误或标签使用不正确,可能会导致properties文件无法正确加载和使用。 总之,当我们发现MyBatis使用properties无效时,我们需要仔细检查properties文件的配置和引用是否正确,确保properties文件被正确加载,并且在配置文件中通过正确的方式引用属性值。此外,还需要注意XML配置文件的正确性。如果所有配置都正确,但问题仍然存在,可能需要查看MyBatis的日志文件以获取更多的错误信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值