为了账号安全,请及时绑定邮箱和手机立即绑定

Mybatis入门教程:从基础到简单项目实战

标签:
SSM
概述

本文详细介绍了Mybatis的入门教程,从Mybatis的基本概念和环境搭建开始,涵盖了核心概念、动态SQL、与Spring的集成以及项目实战等内容,帮助读者全面了解并掌握Mybatis的使用方法。

Mybatis入门教程:从基础到简单项目实战
Mybatis简介与环境搭建

Mybatis是什么

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 可以通过简单的 XML 或注解进行配置和原始映射,将接口和 Java 的 POJO 代理成 JDBC 代码。它是一个半自动化的 ORM(对象关系映射)框架,可以根据 XML 文件生成 SQL 语句,同时具备一定的动态 SQL 能力。

Mybatis的优势与适用场景

MyBatis 的主要优势如下:

  1. 灵活性:MyBatis 的 SQL 语句是直接书写在 XML 文件中,易于理解和维护。
  2. 易于扩展:通过扩展插件,可以方便地扩展功能。
  3. 性能好:基于 JDBC 的直接操作,没有过多的中间层,性能较高。

适用场景:

  • 项目规模适中,对 SQL 语句的定制化要求较高。
  • 需要频繁进行复杂的 SQL 操作,特别是涉及大量 JOIN 操作的情况。
  • 需要对 SQL 语句进行动态生成和优化。

开发环境搭建(IDE、JDK、Mybatis安装等)

为了开始 MyBatis 的学习,我们需要准备好以下开发环境:

  1. IDE:推荐使用 IntelliJ IDEA 或 Eclipse。
  2. JDK:需要安装 Java 开发工具包 JDK,目前最新版本为 JDK 11。
  3. MyBatis:安装 MyBatis 可以通过 Maven 依赖管理来引入。
  4. 数据库:例如 MySQL 或 Oracle。

环境搭建步骤

  1. 安装 JDK

    • 下载最新版本的 JDK 从 Oracle 官网。
    • 安装 JDK,设置 JAVA_HOME 环境变量,并将 JDK 的 bin 目录添加到系统 PATH 环境变量中。
  2. 安装数据库

    • 下载并安装 MySQL 数据库。
    • 启动 MySQL 并创建一个用于测试的数据库。
  3. 配置 Maven 项目

    • 创建一个新的 Maven 项目。
    • pom.xml 文件中添加 MyBatis 依赖:
      <dependencies>
       <dependency>
           <groupId>org.mybatis</groupId>
           <artifactId>mybatis</artifactId>
           <version>3.5.6</version>
       </dependency>
       <dependency>
           <groupId>mysql</groupId>
           <artifactId>mysql-connector-java</artifactId>
           <version>8.0.26</version>
       </dependency>
       <dependency>
           <groupId>org.apache.logging.log4j</groupId>
           <artifactId>log4j-core</artifactId>
           <version>2.14.1</version>
       </dependency>
      </dependencies>
  4. 数据库连接配置
    • resources 目录下创建 mybatis-config.xml 文件,配置数据库连接信息以及 MyBatis 核心配置。
      <?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/mybatis"/>
                   <property name="username" value="root"/>
                   <property name="password" value="password"/>
               </dataSource>
           </environment>
       </environments>
       <mappers>
           <mapper resource="UserMapper.xml"/>
       </mappers>
      </configuration>

通过以上步骤,开发环境已经搭建完成,可以开始学习 MyBatis 的核心概念和使用方法。

Mybatis核心概念解析

SqlSession和SqlSessionFactory

SqlSession 是 MyBatis 的核心接口,它负责执行 SQL 语句,并返回结果。SqlSessionFactory 是创建 SqlSession 的工厂,它通过 SqlSessionFactoryBuilder 创建。SqlSessionFactoryBuilder 通过解析 MyBatis 配置文件,生成 SqlSessionFactory。

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();

Mapper接口

Mapper 接口是 MyBatis 中用于映射数据库表和 Java 对象的接口。接口中的方法对应特定的 SQL 语句。例如:

public interface UserMapper {
    List<User> selectAll();
    User selectById(int id);
    int insert(User user);
    int update(User user);
    int delete(int id);
}

配置文件详解

MyBatis 配置文件 mybatis-config.xml 包含数据库连接、环境配置、映射器配置等信息。

<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/mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="password"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="UserMapper.xml"/>
    </mappers>
</configuration>

{}与${}的区别与使用场景

在 SQL 语句中,#{}${} 有不同的作用:

  • #{} 用于编写预处理语句,防止 SQL 注入。
  • ${} 直接拼接字符串,可能导致 SQL 注入。
public interface UserMapper {
    User selectById(int id);
    int insert(User user);
}

// UserMapper.xml
<select id="selectById" resultType="com.example.User">
    SELECT * FROM user WHERE id = #{id}
</select>

<insert id="insert" parameterType="com.example.User">
    INSERT INTO user (id, name, age) VALUES (#{id}, #{name}, #{age})
</insert>

结果集映射

结果集映射通过 <resultMap> 标签定义,将 SQL 语句查询的结果映射到 Java 对象。

<resultMap id="UserResult" type="com.example.User">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <result property="age" column="age"/>
</resultMap>

<select id="selectAll" resultMap="UserResult">
    SELECT id, name, age FROM user
</select>
Mybatis动态SQL与条件查询

动态SQL标签(if,choose, when, otherwise等)

MyBatis 提供了多种动态 SQL 标签,如 <if>, <choose>, <when>, <otherwise> 等,可以根据条件生成不同的 SQL 语句。

<select id="selectByCondition" resultType="com.example.User">
    SELECT id, name, age FROM user
    <where>
        <if test="id != null">
            AND id = #{id}
        </if>
        <if test="name != null">
            AND name = #{name}
        </if>
        <if test="age != null">
            AND age = #{age}
        </if>
    </where>
</select>

使用动态SQL实现条件查询

通过动态 SQL 标签实现条件查询,可以灵活地生成 SQL 语句。

public interface UserMapper {
    List<User> selectByCondition(@Param("id") Integer id, @Param("name") String name, @Param("age") Integer age);
}
<select id="selectByCondition" resultType="com.example.User">
    SELECT id, name, age FROM user
    <where>
        <if test="id != null">
            AND id = #{id}
        </if>
        <if test="name != null">
            AND name = #{name}
        </if>
        <if test="age != null">
            AND age = #{age}
        </if>
    </where>
</select>
Mybatis与数据库交互

CRUD操作实现(增删改查)

MyBatis 支持基本的 CRUD 操作,通过 SQL 语句实现。

public interface UserMapper {
    int insert(User user);
    int update(User user);
    int delete(int id);
    User selectById(int id);
    List<User> selectAll();
}
<insert id="insert" parameterType="com.example.User">
    INSERT INTO user (id, name, age) VALUES (#{id}, #{name}, #{age})
</insert>

<update id="update" parameterType="com.example.User">
    UPDATE user SET name=#{name}, age=#{age} WHERE id=#{id}
</update>

<delete id="delete" parameterType="int">
    DELETE FROM user WHERE id=#{id}
</delete>

<select id="selectById" resultType="com.example.User">
    SELECT * FROM user WHERE id=#{id}
</select>

<select id="selectAll" resultType="com.example.User">
    SELECT * FROM user
</select>

批量操作:批量插入和批量删除

MyBatis 支持批量操作,如批量插入和批量删除。

public interface UserMapper {
    int batchInsert(List<User> users);
    int batchDelete(List<Integer> ids);
}
<insert id="batchInsert" parameterType="java.util.List">
    INSERT INTO user (id, name, age) VALUES
    <foreach item="item" index="index" collection="users" separator=",">
        (#{item.id}, #{item.name}, #{item.age})
    </foreach>
</insert>

<delete id="batchDelete" parameterType="java.util.List">
    DELETE FROM user WHERE id IN
    <foreach item="item" index="index" collection="ids" separator=",">
        #{item}
    </foreach>
</delete>

批量查询:分页查询

MyBatis 支持分页查询,通过 SQL 语句实现。

public interface UserMapper {
    List<User> selectByPage(int offset, int limit);
}
<select id="selectByPage" resultType="com.example.User">
    SELECT * FROM user
    LIMIT #{offset}, #{limit}
</select>
Mybatis与Spring集成

Mybatis与Spring集成的意义

MyBatis 与 Spring 集成可以实现事务管理,简化数据库操作。Spring 可以管理 MyBatis 的 SqlSessionFactory 和 SqlSession,提供依赖注入功能。

Mybatis与Spring集成的基本步骤

  1. 添加依赖
    pom.xml 中添加 Spring 和 MyBatis 依赖。

    <dependencies>
       <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-context</artifactId>
           <version>5.3.10</version>
       </dependency>
       <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-jdbc</artifactId>
           <version>5.3.10</version>
       </dependency>
       <dependency>
           <groupId>org.mybatis.spring</groupId>
           <artifactId>mybatis-spring</artifactId>
           <version>2.0.6</version>
       </dependency>
    </dependencies>
  2. 配置数据源和 SqlSessionFactory
    在 Spring 配置文件中配置数据源和 SqlSessionFactory。

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
       <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
       <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
       <property name="username" value="root"/>
       <property name="password" value="password"/>
    </bean>
    
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
       <property name="dataSource" ref="dataSource"/>
       <property name="configLocation" value="classpath:mybatis-config.xml"/>
    </bean>
  3. 配置 Mapper 扫描
    通过 <mybatis:scan> 标签自动扫描 Mapper 接口。

    <mybatis:scan base-package="com.example.mapper"/>
  4. 使用 Mapper 接口
    在 Spring 配置文件中注入 Mapper 接口。

    <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
       <property name="mapperInterface" value="com.example.mapper.UserMapper"/>
       <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
    </bean>
  5. 使用事务管理
    配置事务管理器并启用事务管理。

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
       <property name="dataSource" ref="dataSource"/>
    </bean>
    
    <tx:annotation-driven transaction-manager="transactionManager"/>

Mybatis与Spring事务管理

通过注解 @Transactional 可以实现 Spring 事务管理。

@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;

    @Transactional
    public void addUser(User user) {
        userMapper.insert(user);
    }
}
Mybatis项目实战

项目需求与设计

假设我们正在开发一个简单的用户管理系统,需实现以下功能:

  1. 用户信息的增删改查。
  2. 用户信息的批量操作。
  3. 用户信息的分页查询。
  4. 用户信息的条件查询。

数据库表设计与实体类定义

创建一个包含用户信息的表 user,包含字段 id, name, age

CREATE TABLE user (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    age INT
);

创建 User 实体类,用于映射数据库表中的数据。

public class User {
    private int id;
    private String name;
    private int age;

    // Getter and Setter methods
    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

项目实现步骤

  1. 创建数据库表
    创建一个包含用户信息的表 user,包含字段 id, name, age

    CREATE TABLE user (
       id INT PRIMARY KEY,
       name VARCHAR(50),
       age INT
    );
  2. 创建实体类
    创建 User 实体类,用于映射数据库表中的数据。

    public class User {
       private int id;
       private String name;
       private int age;
    
       // Getter and Setter methods
       public int getId() {
           return id;
       }
    
       public void setId(int id) {
           this.id = id;
       }
    
       public String getName() {
           return name;
       }
    
       public void setName(String name) {
           this.name = name;
       }
    
       public int getAge() {
           return age;
       }
    
       public void setAge(int age) {
           this.age = age;
       }
    }
  3. 创建 Mapper 接口
    创建 UserMapper 接口,定义数据库操作方法。

    public interface UserMapper {
       int insert(User user);
       int update(User user);
       int delete(int id);
       User selectById(int id);
       List<User> selectAll();
       int batchInsert(List<User> users);
       int batchDelete(List<Integer> ids);
       List<User> selectByPage(int offset, int limit);
       List<User> selectByCondition(@Param("id") Integer id, @Param("name") String name, @Param("age") Integer age);
    }
  4. 创建 Mapper XML 文件
    创建 UserMapper.xml 文件,编写 SQL 语句实现 Mapper 接口中的方法。

    <mapper namespace="com.example.mapper.UserMapper">
       <insert id="insert" parameterType="com.example.User">
           INSERT INTO user (id, name, age) VALUES (#{id}, #{name}, #{age})
       </insert>
    
       <update id="update" parameterType="com.example.User">
           UPDATE user SET name=#{name}, age=#{age} WHERE id=#{id}
       </update>
    
       <delete id="delete" parameterType="int">
           DELETE FROM user WHERE id=#{id}
       </delete>
    
       <select id="selectById" resultType="com.example.User">
           SELECT * FROM user WHERE id=#{id}
       </select>
    
       <select id="selectAll" resultType="com.example.User">
           SELECT * FROM user
       </select>
    
       <insert id="batchInsert" parameterType="java.util.List">
           INSERT INTO user (id, name, age) VALUES
           <foreach item="item" index="index" collection="users" separator=",">
               (#{item.id}, #{item.name}, #{item.age})
           </foreach>
       </insert>
    
       <delete id="batchDelete" parameterType="java.util.List">
           DELETE FROM user WHERE id IN
           <foreach item="item" index="index" collection="ids" separator=",">
               #{item}
           </foreach>
       </delete>
    
       <select id="selectByPage" resultType="com.example.User">
           SELECT * FROM user
           LIMIT #{offset}, #{limit}
       </select>
    
       <select id="selectByCondition" resultType="com.example.User">
           SELECT * FROM user
           <where>
               <if test="id != null">
                   AND id = #{id}
               </if>
               <if test="name != null">
                   AND name = #{name}
               </if>
               <if test="age != null">
                   AND age = #{age}
               </if>
           </where>
       </select>
    </mapper>
  5. 编写 Service 层代码
    创建 UserService 类,实现用户信息的增删改查操作,并使用 Spring 注解管理事务。

    @Service
    public class UserService {
       @Autowired
       private UserMapper userMapper;
    
       @Transactional
       public void addUser(User user) {
           userMapper.insert(user);
       }
    
       @Transactional
       public void updateUser(User user) {
           userMapper.update(user);
       }
    
       @Transactional
       public void deleteUser(int id) {
           userMapper.delete(id);
       }
    
       public User getUserById(int id) {
           return userMapper.selectById(id);
       }
    
       public List<User> getAllUsers() {
           return userMapper.selectAll();
       }
    
       @Transactional
       public void batchAddUsers(List<User> users) {
           userMapper.batchInsert(users);
       }
    
       @Transactional
       public void batchDeleteUsers(List<Integer> ids) {
           userMapper.batchDelete(ids);
       }
    
       public List<User> getUsersByPage(int offset, int limit) {
           return userMapper.selectByPage(offset, limit);
       }
    
       public List<User> getUsersByCondition(@Param("id") Integer id, @Param("name") String name, @Param("age") Integer age) {
           return userMapper.selectByCondition(id, name, age);
       }
    }
  6. 编写 Controller 层代码
    创建 UserController 类,提供 RESTful API 接口,处理用户请求。

    @RestController
    @RequestMapping("/users")
    public class UserController {
       @Autowired
       private UserService userService;
    
       @PostMapping
       public void addUser(@RequestBody User user) {
           userService.addUser(user);
       }
    
       @PutMapping
       public void updateUser(@RequestBody User user) {
           userService.updateUser(user);
       }
    
       @DeleteMapping("/{id}")
       public void deleteUser(@PathVariable int id) {
           userService.deleteUser(id);
       }
    
       @GetMapping("/{id}")
       public User getUserById(@PathVariable int id) {
           return userService.getUserById(id);
       }
    
       @GetMapping
       public List<User> getAllUsers() {
           return userService.getAllUsers();
       }
    
       @PostMapping("/batch")
       public void batchAddUsers(@RequestBody List<User> users) {
           userService.batchAddUsers(users);
       }
    
       @DeleteMapping("/batch")
       public void batchDeleteUsers(@RequestBody List<Integer> ids) {
           userService.batchDeleteUsers(ids);
       }
    
       @GetMapping("/page")
       public List<User> getUsersByPage(@RequestParam int offset, @RequestParam int limit) {
           return userService.getUsersByPage(offset, limit);
       }
    
       @GetMapping("/condition")
       public List<User> getUsersByCondition(@RequestParam(required = false) Integer id, @RequestParam(required = false) String name, @RequestParam(required = false) Integer age) {
           return userService.getUsersByCondition(id, name, age);
       }
    }

项目调试与常见问题解决

常见问题及解决方法

  1. SQL 注入问题

    • 使用 #{} 代替 ${},防止 SQL 注入。
    • 配置拦截器或过滤器,对输入参数进行校验。
  2. Mapper 接口未找到

    • 确保 Mapper XML 文件和 Mapper 接口在同一包下。
    • 检查配置文件中 <mybatis:scan> 标签是否正确配置。
  3. 数据库连接问题

    • 确保数据库已启动且连接信息正确。
    • 使用数据库连接池(如 BasicDataSource)。
  4. 事务管理问题
    • 确保事务管理器配置正确,@Transactional 注解使用正确。
    • 检查 Spring 配置文件中事务管理器是否正确配置。

通过以上步骤,我们可以完成一个简单的 MyBatis 用户管理系统。在实际开发过程中,还需要根据具体需求进行进一步的扩展和优化。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消