我的JAVA-Web进阶--Mybatis

1.Mybatis概念

 2.Mybatis的简单使用

1. 引入相关依赖

首先,在你的项目中引入 MyBatis 的依赖。如果你使用的是 Maven 构建工具,那么可以在 pom.xml 文件中添加如下依赖:

<dependencies>
    <!-- MyBatis core library -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.13</version>
    </dependency>
    <!-- MyBatis-Spring integration (if using Spring) -->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.3.0</version>
    </dependency>
    <!-- Database driver, for example MySQL -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.33</version>
    </dependency>
</dependencies>

2. 编写实体类

创建一个与数据库表对应的实体类。例如,有一个名为 User 的表,你可以创建一个 User 类。

public class User {
    private Long id;
    private String name;
    private String email;

    // Getters and Setters
}

3. 编写接口

定义一个 Mapper 接口来描述 SQL 操作。MyBatis 会根据接口方法名和参数自动生成 SQL 语句(如果配置了 XML 映射文件,则按照映射文件执行)。

import org.apache.ibatis.annotations.Mapper;
import java.util.List;

@Mapper
public interface UserMapper {
    List<User> getAllUsers();
    User getUserById(Long id);
    int insertUser(User user);
    int updateUser(User user);
    int deleteUser(Long id);
}

4. 编写映射文件

为每个 Mapper 接口创建一个 XML 映射文件,该文件包含 SQL 语句。文件名应与接口名相同,并且放在相同的包下或指定路径下。

<?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">

<mapper namespace="com.example.mapper.UserMapper">
    # parameterType是传入的参数类型,resultType是返回的结果类型
    <select id="getAllUsers" resultType="com.example.model.User">
        SELECT * FROM users
    </select>

    <select id="getUserById" parameterType="long" resultType="com.example.model.User">
        SELECT * FROM users WHERE id = #{id}
    </select>

    <insert id="insertUser" parameterType="com.example.model.User">
        INSERT INTO users (name, email) VALUES (#{name}, #{email})
    </insert>

    <update id="updateUser" parameterType="com.example.model.User">
        UPDATE users SET name=#{name}, email=#{email} WHERE id=#{id}
    </update>

    <delete id="deleteUser" parameterType="long">
        DELETE FROM users WHERE id=#{id}
    </delete>
</mapper>

5. 编写核心文件

创建 MyBatis 的全局配置文件 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>
    <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/mydb"/>
                <property name="username" value="root"/>
                <property name="password" value="password"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/example/mapper/UserMapper.xml"/>
    </mappers>
</configuration>

6. 代码使用

最后,在应用程序中使用 MyBatis。以下是一个简单的例子,展示了如何获取 SqlSessionFactory 并执行查询。

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 MyBatisExample {
    public static void main(String[] args) throws IOException {
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession session = sqlSessionFactory.openSession();
        UserMapper mapper = session.getMapper(UserMapper.class);
        List<User> users = mapper.getAllUsers();
        // Process the list of users
        sqlSessionFactory.close();
    }
}

7.增删改查的接口以及映射文件的代码

// UserMapper.java - 这是MyBatis的Mapper接口
package com.example.mapper;

import org.apache.ibatis.annotations.*;
import java.util.List;

public interface UserMapper {

    // 插入新用户
    // 在映射文件中对应的SQL语句:
    // <insert id="insertUser" parameterType="com.example.model.User">
    //     INSERT INTO users (username, password, email)
    //     VALUES (#{username}, #{password}, #{email})
    // </insert>
    @Insert("INSERT INTO users (username, password, email) VALUES (#{username}, #{password}, #{email})")
    @Options(useGeneratedKeys = true, keyProperty = "id") // 使用自动生成的主键
    void insertUser(User user);

    // 根据ID删除用户
    // <delete id="deleteUserById" parameterType="int">
    //     DELETE FROM users WHERE id = #{id}
    // </delete>
    @Delete("DELETE FROM users WHERE id = #{id}")
    void deleteUserById(int id);

    // 更新用户信息
    // <update id="updateUser" parameterType="com.example.model.User">
    //     UPDATE users SET username = #{username}, password = #{password}, email = #{email} WHERE id = #{id}
    // </update>
    @Update("UPDATE users SET username = #{username}, password = #{password}, email = #{email} WHERE id = #{id}")
    void updateUser(User user);

    // 根据ID查询用户
    // <select id="getUserById" parameterType="int" resultType="com.example.model.User">
    //     SELECT * FROM users WHERE id = #{id}
    // </select>
    @Select("SELECT * FROM users WHERE id = #{id}")
    User getUserById(int id);

    // 查询所有用户
    // <select id="getAllUsers" resultType="com.example.model.User">
    //     SELECT * FROM users
    // </select>
    @Select("SELECT * FROM users")
    List<User> getAllUsers();
}

 注意

3.Mybatis的进阶操作

resultType别名配置

 核心文件的数据库配置

参数传递

使用如下方法后,便可以不用写ParamterType了,直接写变量

直接传递(不推荐)

注解传递

使用Map传递

 

返回参数的对象赋值

理解:当resultType是对象的时候,为了应对数据库查询到的数据列名与类的属性名字的不对应,需要使用resultMap标签

 

动态SQL 

理解:根据输入的参数不同,动态设置SQL语句

动态SQL-if

动态SQL-where 

 动态SQL-set

 动态SQL-choose(相当于switch)

 动态SQL-foreach

 

多表查询

理解:即通过SQL的多表查询,查询到不同的对象

一对一

 

一对多

 

增删改查注解 

package com.example.mapper;

import org.apache.ibatis.annotations.*;
import java.util.List;

public interface UserMapper {

    @Insert("INSERT INTO users (username, password, email) VALUES (#{username}, #{password}, #{email})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    void insertUser(User user);

    @Delete("DELETE FROM users WHERE id = #{id}")
    void deleteUserById(int id);

    @Update("UPDATE users SET username = #{username}, password = #{password}, email = #{email} WHERE id = #{id}")
    void updateUser(User user);

    @Select("SELECT * FROM users WHERE id = #{id}")
    User getUserById(int id);

    @Select("SELECT * FROM users")
    List<User> getAllUsers();
}

 返回参数的对象赋值注解

一对一注解

一对多注解

 延迟加载

当一对多和多对多查询的时候,相当于执行了多条SQL,当我想只执行多条SQL中一句SQL的时候

缓存

一级缓存

 

 二级缓存

二级缓存是使用session重新获取mapper对象,开启需要额外添加信息

Junit测试框架

4.Junit的简单使用

引入依赖

编写测试类

编写顺序:@BeforeEach,@Test,@AfterEach

public class UserMapperTest {
    private SqlSessionFactory sqlSessionFactory;
    private SqlSession sqlSession;
    private UserMapper userMapper;
    // 初始化资源
    @BeforeEach
    void setUp() throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        sqlSession = sqlSessionFactory.openSession();
        userMapper = sqlSession.getMapper(UserMapper.class);
    }
    // 编写单元测试
    @Test
    void testGetAllUsers() {
        List<User> users = userMapper.getAllUsers();
        assertNotNull(users, "用户列表不应为null");
        assertFalse(users.isEmpty(), "用户列表应包含数据");
    }
    @Test
    void testGetUserById() {
        User user = userMapper.getUserById(1L);
        assertNotNull(user, "根据ID获取的用户不应为null");
        assertEquals("expectedName", user.getName(), "用户名应符合预期");
    }
    // 清理资源
    @AfterEach
    void tearDown() {
        sqlSession.close();
    }
}

5.日志输出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值