MyBatis 连接数据库与增删改查

简介: MyBatis 连接数据库与增删改查

前言

学习了一段时间的 mybatis,写此文章用于查漏补缺,整理该框架的使用流程。mybatis 原名iBatis,是一个持久层(dao)框架,提供了简便的操作数据库的功能(CRUD)。是对原生JDBC操作的封装,用来替换原生JDBC访问数据库。


相关依赖、配置文件、工具类

有关 jar 包我已经上传到 CSDN 的资源里(免费):mybatis 依赖,其中也包含一个log4j的配置文件,直接复制粘贴到src目录即可。


a62d715a65104df0923eebfa2ce82745.png


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>
    <properties resource="db.properties"></properties> 
    <settings>
        <setting name="cacheEnabled" value="true"/>
    </settings>
    <!--typeAliases
        type :指明实体类
        alias :给实体类起的别名
        批量起别名:package name="实体类包" ,别名自动为短类名 com.xx.entity.Xxx = Xxx
    -->
    <typeAliases>
        <package name="com.qj.entity"/>
    </typeAliases>
    <!--
        配置数据库连接参数集
        default:指定当前使用的数据库连接
    -->
    <environments default="e1">
        <!--
            配置一个数据库连接
            id:值 自定义  给当前数据库连接起名字
        -->
        <environment id="e1">
            <!--
                指定事务提交的方式
                type :JDBC 使用默认的数据库事务操作
                       MANGED 使用第三方所编写的事务操作
            -->
            <transactionManager type="JDBC"></transactionManager>
            <!--配置数据库连接具体信息
                type: POOLED 使用数据库连接池
                      UNPOOLED 不使用连接池
            -->
            <dataSource type="POOLED">
                <property name="driver" value="${driverClassName}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!--配置XXX_mapper.xml使用-->
        <!--<mapper resource="com/qj/mapper/BookDAOMapper.xml"/>-->
        <!--批量扫描,注册mapper.xml 写到包名即可-->
        <package name="com.qj.mapper"/>
    </mappers>
</configuration>

1.所有的标签需要写在 configuration 之内,这是配置文件的范围。

2.properties 标签里引入的是有关数据库连接的资源文件,其位置在最上面。

资源文件展示:

4888bc935cf8487cb83f6658066222dc.png

3.settings 用来开启二级缓存,这个会在缓存的知识中解释,位置在typeAliases与properties之间

4.typeAliases 用来给实体类起别名,原来的名字默认为长名字,即 com.xx.包名.类名

建议直接使用批量起别名的方法:package name = “实体类包”,别名自动为短类名

5.environments 标签用来配置数据库连接参数集,default 指定当前的数据库连接

注意:&是关键字,不能在 xml 文件直接使用(用&amp;代替)

其余子标签我都加了注释,作用都很清晰

6.mappers 用来注册XXXMapper.xml使用,两种配置方式,推荐批量扫描方式

工具类 MybatisUtil

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;
public class MybatisUtil {
    private static SqlSessionFactory ssf;
    // 静态代码块在类加载的时候只执行一次
    static {
        try {
            // 1.获取配置文件
            InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
            // 2.创建sqlSessionFactory利用build方法加载资源
             ssf = new SqlSessionFactoryBuilder().build(is);
        } catch (IOException e) {
            throw new RuntimeException("读取配置文件异常:" + e);
        }
    }
    // 获取sqlSession
    public static SqlSession getSqlSession() {
        // 获取sqlSession
        SqlSession sqlSession = ssf.openSession();
        return sqlSession;
    }
    // 释放资源
    public static void closeSqlSession(SqlSession sqlSession) {
        sqlSession.close();
    }
}

SqlSession 为mybatis中的数据库连接,需要通过工厂类SqlSessionFactory获取。需要加载一次,因此将其放入静态代码块中,同时静态成员函数才能访问静态变量,所以 ssf 要被static 修饰。


增删改查操作

dao 包变为 mapper ,接口的实现类也变为相应的 xml 文件,并且在xml文件的作用域中写上对应的mapper接口类。


根据 id 查询所有

mapper 中写接口:

9e8a2f09e7cd4b6e9129fa2a680cbc07.png


对应xml文件写 sql:

3df4b561443644849a8e4201593266ba.png


这里的t_book_column是自己定义的一个 sql 标签的键,内容如下:

7e9b185617234af1ad3c960ff195d822.png

这样写与 select * 效果一样,但是在运行时显然是前者更高效。


查询的返回值是Book 类型,使用resultMap来接收:


a7c8bea069f141d3bae243f1636cc510.png

resultMap 常用来映射数据库字段与实体类属性,其妙用在一对一,一对多关系中更能体现。


#{} 用来读取参数,大括号里填写mapper接口中函数的参数。


接下来测试是否能够查询成功,编写 BookMapperTest:

public class BookMapperTest {
    @Test
    public void selectById() {
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        BookMapper mapper = sqlSession.getMapper(BookMapper.class);
        Book book = mapper.selectById(12);
        System.out.println(book);
    }
}

数据库连接为 sqlSession,通过获取接口的代理类对象来得到mapper 从而调用接口中的方法:

ced056681ee2414eb4c6f634c4f5024c.png


根据书名和价格查书

接口中的方法:

  Book selectByNameAndPrice(@Param("name") String name, @Param("price") double price);

xml 中的 sql :

  <select id="selectByNameAndPrice" resultMap="bookMap">
        <include refid="t_book_column"/>
        from t_book
        where book_name = #{name}
        and book_price = #{price}
    </select>

参数多的情况下需要使用注解来绑定参数,只有一个参数时可以在{}中随便写,但是习惯上和接口中的参数保持一致。


插入操作

接口中的方法:


  void insert(Book book);

xml 中的 sql :

  <insert id="insert">
        insert into t_book
        values (null, #{bookName}, #{bookPrice}, #{bookDesc})
  </insert>

插入和修改操作类似,传入的是一个类对象,参数直接写属性即可。

一旦给对象参数加上了注解,那就需要用这样的形式:“键.属性”


#{} 与 ${}的区别

#{}本质上是占位符,而${}本质上是字符串拼接,二者区别:


?占位符可以防止 sql注入攻击,但是只能绑定数据,不能绑定关键字

字符串拼接容易被sql注入,但是可以绑定关键字等

总结

使用 sql 标签代替 select * 提高运行效率

查询结果无论是实体类还是实体类集合,都要写配置好的resultMap

除了 查找 操作,增、删、改需要自己提交事务,mybatis 并不会自动提交

函数中的参数多的时候使用注解,类对象加上注解后不能直接写属性

这部分为mybatis的基础部分,掌握简单的增删改查以及配置文件的配置即可。表连接、动态sql与缓存等内容下篇文章总结,需要的小伙伴可以订阅专栏。


目录
相关文章
|
1月前
|
SQL Java 数据库连接
深入 MyBatis-Plus 插件:解锁高级数据库功能
Mybatis-Plus 提供了丰富的插件机制,这些插件可以帮助开发者更方便地扩展 Mybatis 的功能,提升开发效率、优化性能和实现一些常用的功能。
197 26
深入 MyBatis-Plus 插件:解锁高级数据库功能
|
21天前
|
数据库 C# 开发者
ADO.NET连接到南大通用GBase 8s数据库
ADO.NET连接到南大通用GBase 8s数据库
|
20天前
|
数据库连接 Linux Shell
Linux下ODBC与 南大通用GBase 8s数据库的无缝连接配置指南
本文详细介绍在Linux系统下配置GBase 8s数据库ODBC的过程,涵盖环境变量设置、ODBC配置文件编辑及连接测试等步骤。首先配置数据库环境变量如GBASEDBTDIR、PATH等,接着修改odbcinst.ini和odbc.ini文件,指定驱动路径、数据库名称等信息,最后通过catalog.c工具或isql命令验证ODBC连接是否成功。
|
1月前
|
SQL 安全 Java
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
MyBatis-Plus 提供了一套强大的条件构造器(Wrapper),用于构建复杂的数据库查询条件。Wrapper 类允许开发者以链式调用的方式构造查询条件,无需编写繁琐的 SQL 语句,从而提高开发效率并减少 SQL 注入的风险。
26 1
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
|
19天前
|
JSON JavaScript 关系型数据库
node.js连接GBase 8a 数据库 并进行查询代码示例
node.js连接GBase 8a 数据库 并进行查询代码示例
|
1月前
|
SQL Java 数据库连接
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
50 3
|
20天前
|
数据库连接 数据库 C#
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(上)
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(上)
|
20天前
|
数据库连接 数据库 C#
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(下)
本文接续前文,深入讲解了在Windows环境下使用C#和ADO.NET操作南大通用GBase 8s数据库的方法。通过Visual Studio 2022创建项目,添加GBase 8s的DLL引用,并提供了详细的C#代码示例,涵盖数据库连接、表的创建与修改、数据的增删查改等操作,旨在帮助开发者提高数据库管理效率。
|
1月前
|
Java 数据库连接 数据库
深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
34 1
|
1月前
|
Java 数据库连接 数据库
Java连接池在数据库性能优化中的重要作用。连接池通过预先创建和管理数据库连接,避免了频繁创建和关闭连接的开销
本文深入探讨了Java连接池在数据库性能优化中的重要作用。连接池通过预先创建和管理数据库连接,避免了频繁创建和关闭连接的开销,显著提升了系统的响应速度和吞吐量。文章介绍了连接池的工作原理,并以HikariCP为例,展示了如何在Java应用中使用连接池。通过合理配置和优化,连接池技术能够有效提升应用性能。
50 1