Mybatis

简介

MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和参数的手动设置,简化了开发过程。此外,它还提供了对象关系映射工具,可以将普通的 Java 对象自动映射成数据库表中的记录。MyBatis 还提供了插件机制,可以方便地实现自己的功能

官网:https://mybatis.org/mybatis-3/zh/index.htmlicon-default.png?t=N7T8https://mybatis.org/mybatis-3/zh/index.html

MyBatis的使用主要包括配置依赖、创建实体类、编写映射文件和执行数据库操作等步骤。以下是使用MyBatis的基本步骤:

  1. 配置依赖:需要在项目中引入MyBatis的依赖,这可以通过Maven或Gradle等构建工具来完成。在Maven项目的pom.xml文件中添加MyBatis相关的依赖项。
  2. 创建实体类:根据数据库表结构创建相应的Java实体类,这些实体类将与数据库中的记录一一对应。
  3. 编写映射文件:为每个实体类创建对应的XML映射文件,定义SQL语句和结果映射规则。这些映射文件会被MyBatis用来生成最终的SQL语句并映射执行结果到实体类对象。
  4. 执行数据库操作:通过MyBatis提供的SqlSession接口执行增删改查等数据库操作。可以使用XML配置文件或者注解的方式来配置SQL语句和参数映射。
  5. 日志配置:为了方便调试和记录操作信息,可以配置日志工具如Log4j来输出MyBatis的操作日志。
  6. 测试连接:在完成上述配置后,应该对数据库连接进行测试,确保MyBatis能够正确连接到数据库并执行SQL语句。
  7. 优化配置:根据实际需求对mybatis.xml配置文件进行优化,以提高性能和效率。
  8. 封装工具类:可以封装一些工具类来简化数据库连接和操作的过程,提高代码的复用性和可维护性。

 配置Mybatis

在springboot项目中,可以编写application.properties文件,配置数据库连接信息。我们要连接数据库,就需要配置数据库连接的基本信息,包括:driver-class-name、url 、username,password。

application.properties:

#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接的url
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis
#连接数据库的用户名
spring.datasource.username=root
#连接数据库的密码
spring.datasource.password=1234

编写SQL语句

@Mapper
public interface UserMapper {
    
    //查询所有用户数据
    @Select("select id, name, age, gender, phone from user")
    public List<User> list();
    
}

@Mapper注解:表示是mybatis中的Mapper接口

  • 程序运行时:框架会自动生成接口的实现类对象(代理对象),并给交Spring的IOC容器管理

@Select注解:代表的就是select查询,用于书写select查询语句

 测试

@SpringBootTest
public class MybatisQuickstartApplicationTests {
	
    @Autowired
    private UserMapper userMapper;
	
    @Test
    public void testList(){
        List<User> userList = userMapper.list();
        for (User user : userList) {
            System.out.println(user);
        }
    }

}

 JDBC(了解)

JDBC,全称为Java数据库连接(Java Database Connectivity),是一套为Java程序提供数据库访问的标准API

JDBC作为Java语言的数据库接口,提供了一系列的接口和类,允许Java应用程序通过SQL语句与各种关系型数据库进行交互。以下是JDBC的一些关键点:

  1. 标准接口:JDBC定义了一组标准的接口和类,使得Java程序可以以一种统一的方式访问不同的数据库系统。
  2. 数据库独立性:使用JDBC编写的程序具有很高的可移植性,因为它们不依赖于特定的数据库实现。只要数据库提供了相应的JDBC驱动程序,程序就能够运行。
  3. SQL执行:JDBC的核心功能是执行SQL语句,包括数据查询、更新、插入和删除等操作。
  4. 驱动管理:JDBC通过驱动程序管理器来加载和管理数据库驱动,确保应用程序能够与数据库建立连接。
  5. 连接池:为了提高性能和资源利用率,JDBC支持连接池技术,这允许应用程序重用现有的数据库连接,而不是每次都创建新的连接。
  6. 事务管理:JDBC提供了事务管理的机制,允许应用程序执行一系列的数据库操作,并确保这些操作要么全部成功,要么全部失败,从而维护数据的一致性。

代码 

public class JdbcTest {
    @Test
    public void testJdbc() throws Exception {
        //1. 注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");

        //2. 获取数据库连接
        String url="jdbc:mysql://127.0.0.1:3306/mybatis";
        String username = "root";
        String password = "1234";
        Connection connection = DriverManager.getConnection(url, username, password);

        //3. 执行SQL
        Statement statement = connection.createStatement(); //操作SQL的对象
        String sql="select id,name,age,gender,phone from user";
        ResultSet rs = statement.executeQuery(sql);//SQL查询结果会封装在ResultSet对象中

        List<User> userList = new ArrayList<>();//集合对象(用于存储User对象)
        //4. 处理SQL执行结果
        while (rs.next()){
            //取出一行记录中id、name、age、gender、phone下的数据
            int id = rs.getInt("id");
            String name = rs.getString("name");
            short age = rs.getShort("age");
            short gender = rs.getShort("gender");
            String phone = rs.getString("phone");
            //把一行记录中的数据,封装到User对象中
            User user = new User(id,name,age,gender,phone);
            userList.add(user);//User对象添加到集合
        }
        //5. 释放资源
        statement.close();
        connection.close();
        rs.close();

        //遍历集合
        for (User user : userList) {
            System.out.println(user);
        }
    }
}

DriverManager(类):数据库驱动管理类。

  • 作用:

    1. 注册驱动

    2. 创建java代码和数据库之间的连接,即获取Connection对象

Connection(接口):建立数据库连接的对象

  • 作用:用于建立java程序和数据库之间的连接

Statement(接口): 数据库操作对象(执行SQL语句的对象)。

  • 作用:用于向数据库发送sql语句

ResultSet(接口):结果集对象(一张虚拟表)

  • 作用:sql查询语句的执行结果会封装在ResultSet中

数据库连接池

数据库连接池是一种资源池设计模式,它能够有效地管理数据库连接,提高系统性能和稳定性

数据库连接池的主要作用是负责分配、管理和释放数据库连接。它允许应用程序重复使用一个现有的数据库连接,而不是每次都重新建立一个新连接。这样做的好处是显著的,因为数据库连接是一种关键的有限资源,尤其是在多用户的网页应用程序中,频繁地打开和关闭物理连接会导致系统性能低下。通过使用连接池,应用程序可以在启动时建立足够的数据库连接,并将这些连接组成一个连接池,由应用程序动态地对池中的连接进行申请、使用和释放。

连接池的优势在于:

  • 提高性能:避免了频繁建立和关闭连接的开销,使得数据库操作更加迅速。
  • 资源复用:连接可以被多个请求复用,减少了资源的浪费。
  • 管理便捷:连接池通常提供了监控和管理工具,可以方便地查看连接状态和性能指标。
  • 动态调整:应用程序可以根据池中连接的使用率,动态增加或减少池中的连接数,以适应不同的负载需求。

常见的连接池实现方案包括但不限于HikariCP、c3p0和Apache DBCP等。这些连接池实现通常会提供一系列的配置参数,以便根据具体的应用场景进行调整。例如,可以设置最大连接数、最小连接数、连接超时时间等。同时,它们也会有自己的生命周期管理策略,包括如何处理空闲连接和异常连接。

lombok

Lombok 是一个旨在通过注解简化Java代码的库。它可以帮助开发者减少编写样板代码的时间,专注于业务逻辑的实现。

具体来说,Lombok提供了一系列的注解,这些注解可以应用在类、字段和方法上,以自动生成常见的代码,如getter和setter方法、构造函数、equalshashCode方法等。这样,开发者就不需要手动编写这些重复性的代码,从而提高了开发效率。例如:

  • @Getter 和 @Setter:用于自动生成getter和setter方法。
  • @NoArgsConstructor@RequiredArgsConstructor 和 @AllArgsConstructor:用于生成构造函数。
  • @Data:是一个方便的注解,包含了getter、setter、equals、hashCode和toString方法。
  • @ToString:用于自动生成toString方法。
  • @EqualsAndHashCode:用于自动生成equalshashCode方法。

值得一提的是,Lombok的使用需要在开发环境中安装对应的插件,如IntelliJ IDEA中的Lombok插件,以确保编辑器能够识别Lombok注解并正确地处理代码。

在pom.xml文件中引入依赖  

<!-- 在springboot的父工程中,已经集成了lombok并指定了版本号,故当前引入依赖时不需要指定version -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

 添加注释

import lombok.Data;

@Data //getter方法、setter方法、toString方法、hashCode方法、equals方法
@NoArgsConstructor //无参构造
@AllArgsConstructor//全参构造
public class User {
    private Integer id;
    private String name;
    private Short age;
    private Short gender;
    private String phone;
}

CRUD

以下是使用Mybatis实现增删改查的示例代码:

  • 创建数据库表
CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  • 创建User实体类
public class User {
    private Integer id;
    private String name;
    private Integer age;

    // getter和setter方法省略
}
  • 创建UserMapper接口
import org.apache.ibatis.annotations.*;

@Mapper
public interface UserMapper {
    @Insert("INSERT INTO user(name, age) VALUES(#{name}, #{age})")
    int insert(User user);

    @Delete("DELETE FROM user WHERE id = #{id}")
    int deleteById(Integer id);

    @Update("UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id}")
    int update(User user);

    @Select("SELECT * FROM user WHERE id = #{id}")
    User selectById(Integer id);

    @Select("SELECT * FROM user")
    List<User> selectAll();
}
  • 在Mybatis配置文件中添加mapper映射
<configuration>
    <!-- ... -->
    <mappers>
        <mapper class="com.example.mapper.UserMapper"/>
    </mappers>
</configuration>
  • 测试增删改查操作
public class MybatisDemo {
    public static void main(String[] args) {
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try {
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

            // 插入用户
            User user = new User();
            user.setName("张三");
            user.setAge(20);
            userMapper.insert(user);
            System.out.println("插入用户:" + user.getId());

            // 查询用户
            User selectedUser = userMapper.selectById(user.getId());
            System.out.println("查询用户:" + selectedUser);

            // 更新用户
            selectedUser.setName("李四");
            selectedUser.setAge(25);
            userMapper.update(selectedUser);
            System.out.println("更新用户:" + selectedUser);

            // 删除用户
            userMapper.deleteById(selectedUser.getId());
            System.out.println("删除用户:" + selectedUser.getId());
        } finally {
            sqlSession.close();
        }
    }
}

xml文件映射

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="">
 
</mapper>

namespace需要mapper接口的全类名

Mybatis动态SQL

基本动态SQL

Mybatis动态SQL是指在XML映射文件中使用动态SQL语句,根据不同的条件生成不同的SQL语句。Mybatis提供了多种动态SQL元素,可以根据需要灵活地构建SQL语句。

以下是一个简单的示例:

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">
<mapper namespace="com.example.mapper.UserMapper">
    <select id="selectUsers" parameterType="map" resultType="com.example.entity.User">
        SELECT * FROM user
        <where>
            <if test="name != null and name != ''">
                AND name = #{name}
            </if>
            <if test="age != null">
                AND age = #{age}
            </if>
        </where>
    </select>
</mapper>

在这个示例中,我们使用了和元素来构建动态的WHERE子句。当传入的参数中name和age不为空时,会生成相应的条件。这样可以根据不同的查询条件生成不同的SQL语句,提高代码的复用性和灵活性。

动态SQL-sql&include

动态SQL中的和元素可以用来复用相同的SQL片段,提高代码的可维护性和可读性。

元素用于定义可重用的SQL片段,可以在多个地方引用。例如:

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">
<mapper namespace="com.example.mapper.UserMapper">
    <sql id="userColumns">id, name, age</sql>
    <select id="selectUsers" resultType="com.example.entity.User">
        SELECT <include refid="userColumns"/> FROM user
    </select>
</mapper>

在这个示例中,我们使用元素定义了一个名为userColumns的SQL片段,包含了查询用户所需的列名。然后在元素中使用元素引用了这个SQL片段,实现了代码的复用。 

动态SQL-foreach

动态SQL中的元素可以用来遍历集合,生成多个相同的SQL片段。例如:

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">
<mapper namespace="com.example.mapper.UserMapper">
    <select id="selectUsersByIds" parameterType="list" resultType="com.example.entity.User">
        SELECT * FROM user WHERE id IN
        <foreach item="id" index="index" collection="list" open="(" separator="," close=")">
            #{id}
        </foreach>
    </select>
</mapper>

在这个示例中,我们使用元素遍历传入的id列表,生成一个IN子句,用于查询指定id的用户。其中,item属性表示集合中的每个元素,index属性表示元素的索引,collection属性表示要遍历的集合,open和close属性表示生成的SQL片段的开始和结束标记,separator属性表示元素之间的分隔符。

  • 64
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值