深入浅出 MyBatis | CRUD 操作、配置解析

3、CRUD

3.1 namespace

namespace 中的包名要和 Dao/Mapper 接口的包名一致!

比如将 UserDao 改名为 UserMapper

在这里插入图片描述

运行发现抱错,这是因为 UserMapper.xml 中没有同步更改 namespace
在这里插入图片描述
在这里插入图片描述

成功运行
在这里插入图片描述


给出 UserMapper 中的所有接口,接下来一一对这些接口实现 CRUD 操作

在这里插入图片描述

pojo 下对应的数据库表的实体类 User
在这里插入图片描述

说明:下述的 sql 语句中的如:select * from mybatis.user,其中 mybatis.user 的 mybatis 是我定义的数据库的名,如果你的数据库名为 xxx,因为为 select * from xxx.user

3.2 select

选择,查询语句;

  • id:就是对应的 namespace 中的方法名;、
  • resultType:Sql 语句执行的返回值!
  • parameterType:参数类型!
<!--namespace绑定一个对应的 Dao/Mapper 接口-->
<mapper namespace="com.uestc.dao.UserMapper">
	<select id="getUserList" resultType="com.uestc.pojo.User">
	    select * from mybatis.user
	</select>
</mapper>

接下来实现根据 ID 查询用户

在 UserMapper 接口中加入方法

// 根据 ID 查询用户
User getUserById(int id);

在 UserMapper.xml 中配置

<!--namespace绑定一个对应的 Dao/Mapper 接口-->
<mapper namespace="com.uestc.dao.UserMapper">

	<select id="getUserById" parameterType="int" resultType="com.uestc.pojo.User">
	    select * from mybatis.user where id = #{id}
	</select>
	
</mapper>
  • id=“getUserById” 对应 UserMapper 接口中 getUserById 方法
  • parameterType 为传入的参数 int id;
  • resultType 为返回的类型 User
  • select * from mybatis.user where id = #{id},其中 #{} 表示取值,传入 id 这个参数,然后 #{id} 取出即可,注意是花括号,不是圆括号

在 test 中进行测试
在这里插入图片描述

@Test
public void getUserByIdTest() {
    //第一步:获得SqlSession对象
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    User user = mapper.getUserById(1); // 查询 id = 1 的用户
    System.out.println(user);
    //关闭SqlSession
    sqlSession.close();
}

3.3 Insert(增)

在 UserMapper 接口中加入方法 addUser

//插入一个用户
int addUser(User user);

在 UserMapper.xml 中配置(插入操作的 sql 语句为:INSERT INTO students (id, name, age) VALUES (1, 'Alice', 20);

<!--namespace绑定一个对应的 Dao/Mapper 接口-->
<mapper namespace="com.uestc.dao.UserMapper">

	<!--    对象中的属性可以直接取出-->
	<insert id="addUser" parameterType="com.uestc.pojo.User">
	    insert into mybatis.user (id, name, pwd) values (#{id},#{name},#{pwd})
	</insert>
	
</mapper>
  • insert 标签用于插入,其中实体类 User 中的属性可以直接通过属性名获取:#{id}, #{name}, #{pwd}

在 test 中进行测试

@Test
public void addUserTest() {
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    mapper.addUser(new User(4, "哈哈", "123456"));
    sqlSession.close();
}

执行
在这里插入图片描述

刷新数据库,没有看到
在这里插入图片描述

那是因为数据库增删改一定要提交事务 sqlSession.commit();

@Test
public void addUserTest() {
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    int res = mapper.addUser(new User(4, "哈哈", "123456"));
    if (res > 0) {
        System.out.println("插入成功!");
    }

    // 提交事务
    sqlSession.commit();
    sqlSession.close();
}

成功插入!
在这里插入图片描述

3.4 Update(改)

在 UserMapper 接口中加入方法 updateUser

int updateUser(User user);

在 UserMapper.xml 中配置

<!--namespace绑定一个对应的 Dao/Mapper 接口-->
<mapper namespace="com.uestc.dao.UserMapper">

	<update id="updateUser" parameterType="com.uestc.pojo.User">
	    update mybatis.user set name=#{name},pwd=#{pwd} where id = #{id}
	</update>

</mapper>
  • update mybatis.user set name=#{name},pwd=#{pwd} where id = #{id},之前 sql 中是直接 set 赋值,在这里,直接将 User 实例中的属性赋过去即可,即 name=#{name},pwd=#{pwd} where id = #{id}

测试:注意一定要提交事务

@Test
public void updateUserTest() {
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    int res = mapper.updateUser(new User(4, "啊啊", "12345678"));

    // 提交事务
    sqlSession.commit();
    sqlSession.close();
}

在这里插入图片描述

3.5 Delete(删)

在 UserMapper 接口中加入方法 deleteUser

int deleteUser(int id);

在 UserMapper.xml 中配置

<!--namespace绑定一个对应的 Dao/Mapper 接口-->
<mapper namespace="com.uestc.dao.UserMapper">

	<delete id="deleteUser" parameterType="int">
	    delete from mybatis.user where id = #{id}
	</delete>
	
</mapper>

测试:

@Test
 public void deleteUserTest() {
     SqlSession sqlSession = MybatisUtils.getSqlSession();
     UserMapper mapper = sqlSession.getMapper(UserMapper.class);
     int res = mapper.deleteUser(4);

     // 提交事务
     sqlSession.commit();
     sqlSession.close();
 }

在这里插入图片描述

注意点:

  • 增删改需要提交事务!

3.6 分析错误

  1. xml 文件中注释不能出现中文报错,查看自己的是UTF-8还是GBK编码,改成为相应的就行。
<?xml version="1.0" encoding="UTF-8" ?>
<?xml version="1.0" encoding="GBK" ?>

即可成功测试。

  1. 标签不要匹配错!

  2. resource绑定mapper,需要使用路径!
    在这里插入图片描述

  3. 程序配置文件必须符合规范!

  4. NullPointerException,没有注册到资源!

  5. maven资源没有导出问题!

3.7 万能 Map(企业中常用)

假设,实体类,或者数据库中的表,字段或者参数过多,我们应当考虑使用Map!

比如在 UserMapper 接口中加入方法 addUser2。用 Map 作为参数来传,不需要知道数据库内有什么

// 万能的Map
int addUser2(Map<String,Object> map); // 同 int addUser(User user); 功能

在 UserMapper.xml 中配置

<!--namespace绑定一个对应的 Dao/Mapper 接口-->
<mapper namespace="com.uestc.dao.UserMapper">

	<!--对象中的属性,可以直接取出来  传递map的key-->
	<insert id="addUser2" parameterType="map">
	    insert into mybatis.user (id, pwd) values (#{userid},#{password})
	</insert>
	
</mapper>

老方式:

<!--namespace绑定一个对应的 Dao/Mapper 接口-->
<mapper namespace="com.uestc.dao.UserMapper">

	<!--    对象中的属性可以直接取出-->
	<insert id="addUser" parameterType="com.uestc.pojo.User">
	    insert into mybatis.user (id, name, pwd) values (#{id},#{name},#{pwd})
	</insert>
	
</mapper>
  1. 对比之前添加用户注册的值,之前没有 map 参数时,传入的值 #{id}, #{name}, #{pwd} 必须与实体的属性一致,而使用 map 后,随意传入什么都可以,因为传递的是 map 的 key,不需要与数据库中的表的属性一致,传入什么都可以 #{userid}, #{password}
  2. 这里与之前的老方式比较:某个key省去都不影响,比如 #{userid},#{password},没有 name 了。这就可以应付参数过多的情况,并不需要写出所有参数

测试

@Test
public void addUser2Test() {

    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    Map<String,Object> map = new HashMap<String, Object>();
    map.put("userid", 4);
    map.put("password","123321");

    mapper.addUser2(map);

    // 提交事务
    sqlSession.commit();
    sqlSession.close();
}

在这里插入图片描述


再来看对上面 User getUserById(int id); 用 map 作为参数传递

User getUserById2(Map<String,Object> map);

在 UserMapper.xml 中配置

<!--namespace绑定一个对应的 Dao/Mapper 接口-->
<mapper namespace="com.uestc.dao.UserMapper">

	<select id="getUserById2" parameterType="map" resultType="com.uestc.pojo.User">
	    select * from mybatis.user where id = #{helloid} and name = #{helloname}
	</select>
	
</mapper>
  • id = #{helloid} and name = #{helloname} 这里 helloid 和 helloname 都可以任意,但是用之前的方式,这里就限制死了,必须要实体类和数据库属性一致

测试

@Test
public void getUserById2Test() {

    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);

    Map<String,Object> map = new HashMap<String, Object>();
    map.put("helloid", 1);
    map.put("helloname", "洪");
    User user = mapper.getUserById2(map);
    System.out.println(user);

    // 提交事务
    sqlSession.commit();
    sqlSession.close();
}

在这里插入图片描述
Map传递参数,直接在sql中取出key即可!【parameterType=“map”】

对象传递参数,直接在sql中取对象的属性即可!【parameterType=“Object”】

只有一个基本类型参数的情况下,可以直接在sql中取到!

多个参数用Map,或者注解!

3.8 思考题

模糊查询怎么写?

1. java 代码执行的时候,传递通配符% %

UserMapper 接口中加入方法 getUserLike

List<User> getUserLike(String value);

在 UserMapper.xml 中配置

<!--namespace绑定一个对应的 Dao/Mapper 接口-->
<mapper namespace="com.uestc.dao.UserMapper">

	<select id="getUserLike">
	    select * from mybatis.user where name like "%"#{value}"%"
	</select>
	
</mapper>
  • "%"#{value}"%",其中 value 就是要传入的值,这样传入可能导致 SQL 注入问题

测试

@Test
public void getUserLikeTest() {
    //第一步:获得SqlSession对象
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    List<User> userList = mapper.getUserLike("%李%");
    for (User user : userList) {
        System.out.println(user);
    }
    //关闭SqlSession
    sqlSession.close();
}

在这里插入图片描述

4、配置解析

4.1 核心配置文件

  • mybatis-config.xml
  • MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。
configuration(配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)

只需掌握红色圈起来的即可,其他了解
在这里插入图片描述

4.2 环境配置(environments)

  • Mybatis 可以配置成适应多种环境

  • 不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。
    在这里插入图片描述

  • 学会使用配置多套运行环境!

  • Mybatis默认的事务管理器就是 JDBC, 连接池:POOLED

了解事物管理器,不只有 JDBC 还有 MANAGED
在这里插入图片描述

了解什么是数据源(dataSource),作用只有一个:连接数据库
在这里插入图片描述

在 MyBatis 中,dataSourcetransactionManager 是两个重要的概念,分别用于数据库连接管理和事务控制。

1. DataSource(数据源)

DataSource 是指数据库连接池的配置和管理组件,它负责提供数据库连接。使用数据源可以提高应用程序对数据库连接的管理效率,避免每次操作都重新创建数据库连接。

在 MyBatis 中,DataSource 主要用于管理与数据库的连接。常见的数据源类型有:

  • DriverManagerDataSource:最简单的数据源,直接使用 JDBC 驱动来建立数据库连接。
  • BasicDataSource(来自 Apache Commons DBCP)和 HikariCP:更常用的连接池实现,通过池化技术来提高性能。

MyBatis 通过配置 dataSource 来指定如何连接到数据库。通常会在 mybatis-config.xml 或 Spring 配置文件中进行配置。例如:

<dataSource type="org.apache.ibatis.datasource.pooled.PooledDataSource">
    <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/mydatabase"/>
    <property name="username" value="root"/>
    <property name="password" value="password"/>
</dataSource>

2. TransactionManager(事务管理器)

TransactionManager 是 MyBatis 中的事务控制组件,用于管理数据库事务的开始、提交和回滚。它帮助开发者处理事务的生命周期,并确保事务在正确的时机进行提交或回滚。

在 MyBatis 中,TransactionManager 有两种常见的实现:

  • JDBCTransaction:通过 JDBC 来管理事务,适用于不使用 Spring 等容器的简单项目。
  • ManagedTransaction:通过外部容器(如 Spring)来管理事务,适用于集成到 Spring 框架的应用。

如果使用 Spring 框架,MyBatis 通常会与 Spring 的事务管理器集成,使用 SpringManagedTransaction 来管理事务。在 Spring 环境中,事务管理器可以通过 @Transactional 注解来控制事务的提交和回滚。

示例配置:
<transactionManager type="JDBC">
    <!-- JDBC事务管理器配置 -->
</transactionManager>

或在 Spring 中:

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>

小结:

  • DataSource:用于数据库连接池的管理,提供数据库连接。
  • TransactionManager:用于事务的管理,控制事务的开启、提交和回滚。

这两个组件在 MyBatis 中共同工作,以保证应用程序能够高效且安全地与数据库进行交互,同时确保事务的一致性。


标签顺序

在 MyBatis 配置文件中,XML 标签的顺序通常是固定的,遵循一定的逻辑结构,确保各个组件按正确的顺序初始化。下面是常见的 mybatis-config.xml 配置文件中的标签顺序及其含义:

1. <?xml version="1.0" encoding="UTF-8"?>

这是 XML 文件的声明部分,通常位于文件的开头。

2. <configuration>

<configuration> 是 MyBatis 配置文件的根标签,所有其他标签都在这个标签内。

<configuration>
    <!-- 配置内容 -->
</configuration>
3. <properties> (可选)

在配置文件的开始部分,可以定义一些外部属性,这些属性可以在整个配置文件中引用。通常用于配置数据库连接信息等。

<properties>
    <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/mydatabase"/>
    <property name="username" value="root"/>
    <property name="password" value="password"/>
</properties>
4. <settings>

<settings> 标签用于配置 MyBatis 的全局设置,例如缓存开关、懒加载等。

<settings>
    <setting name="cacheEnabled" value="true"/>
    <setting name="lazyLoadingEnabled" value="false"/>
    <setting name="multipleResultSetsEnabled" value="true"/>
</settings>
5. <typeAliases>

<typeAliases> 标签用于定义类型别名,可以为 Java 类创建简化的别名。

在 MyBatis 中,<typeAliases> 标签可以通过两种方式为 Java 类型创建别名:一种是为单个类型设置别名,另一种是为整个包中的所有类创建别名。两种方式的配置如下:

  1. 单个类型设置别名
<typeAliases>
    <typeAlias alias="User" type="com.example.User"/>
</typeAliases>
  1. 为整个包设置别名

另一种方式是为整个包中的所有类创建别名,MyBatis 会自动为该包中的每个类生成别名。默认情况下,MyBatis 会使用类名的首字母小写作为别名(但你也可以通过 <typeAlias> 标签自定义别名)。

<typeAliases>
    <package name="com.uestc.pojo"/>
</typeAliases>
  • name:指定了要扫描的包路径,这里是 com.uestc.pojo 包。

此配置告诉 MyBatis 扫描 com.uestc.pojo 包中的所有类,并自动为每个类创建别名。默认情况下,MyBatis 会将每个类名的首字母转换为小写,并将其作为别名。例如:

  • com.uestc.pojo.User 类的别名将自动生成为 user
  • com.uestc.pojo.Order 类的别名将自动生成为 order
6. <typeHandlers> (可选)

<typeHandlers> 标签用于配置自定义的类型处理器。类型处理器用于在 Java 类型与 JDBC 类型之间转换。

<typeHandlers>
    <typeHandler handler="com.example.CustomTypeHandler"/>
</typeHandlers>
7. <objectFactory> (可选)

<objectFactory> 标签用于指定自定义的对象工厂,用于 MyBatis 实例化对象。

<objectFactory type="com.example.CustomObjectFactory"/>
8. <plugins> (可选)

<plugins> 标签用于配置 MyBatis 插件,例如分页插件、性能分析插件等。

<plugins>
    <plugin interceptor="org.mybatis.example.PluginExample"/>
</plugins>
9. <environments>

<environments> 标签用于定义多个环境(例如开发环境、生产环境),每个环境可以指定不同的数据源和事务管理器。

<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/mydatabase"/>
            <property name="username" value="root"/>
            <property name="password" value="password"/>
        </dataSource>
    </environment>
</environments>
10. <mappers>

<mappers> 标签用于指定映射器(Mapper)的配置,可以是 .xml 文件的路径,也可以是 Mapper 接口的类名。

<mappers>
    <mapper resource="com/example/mapper/UserMapper.xml"/>
    <mapper class="com.example.mapper.ProductMapper"/>
</mappers>

总体结构

根据上述内容,MyBatis 的配置文件通常遵循以下顺序:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <!-- 可选的外部属性 -->
    <properties>
        <!-- 配置项 -->
    </properties>

    <!-- 全局设置 -->
    <settings>
        <!-- 设置项 -->
    </settings>

    <!-- 类型别名 -->
    <typeAliases>
        <!-- 别名配置 -->
    </typeAliases>

    <!-- 类型处理器 -->
    <typeHandlers>
        <!-- 自定义类型处理器 -->
    </typeHandlers>

    <!-- 对象工厂 -->
    <objectFactory>
        <!-- 自定义对象工厂 -->
    </objectFactory>

    <!-- 插件 -->
    <plugins>
        <!-- 插件配置 -->
    </plugins>

    <!-- 环境设置 -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!-- 数据源配置 -->
            </dataSource>
        </environment>
    </environments>

    <!-- 映射器配置 -->
    <mappers>
        <mapper resource="com/example/mapper/UserMapper.xml"/>
        <mapper class="com.example.mapper.ProductMapper"/>
    </mappers>

</configuration>

小结:

在 MyBatis 的配置文件中,标签的顺序通常为:

  1. properties(可选)
  2. settings
  3. typeAliases
  4. typeHandlers(可选)
  5. objectFactory(可选)
  6. plugins(可选)
  7. environments
  8. mappers

标签顺序通常没有严格的约束,但遵循这个顺序可以使配置文件更加清晰易懂。


新建项目 Mybatis-02

在这里插入图片描述

将 Mybatis-01 中所有的环境都打包过来,然后删除掉部分内容,使其简洁

UserMapper 只保留这几个基本方法,并删除相应的 UserMapper.xml 中的配置
在这里插入图片描述
测试 UserDaoTest 只留一个

在这里插入图片描述

4.3 属性(properties)

在这里插入图片描述

我们可以通过properties属性来实现引用配置文件

这些属性都是可外部配置且可动态替换的,既可以在典型的Java属性文件中配置,亦可通过properties元素的子元素来传递。【db.properties】

编写一个配置文件 db.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://112.124.60.179:3310/mybatis?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8
username=root
password=123456

在这里插入图片描述

在核心配置文件中映入

<!--引入外部配置文件-->
<properties resource="db.properties">
    <property name="username" value="root"/>
    <property name="pwd" value="123123"/>
</properties>
  • 可以直接引入外部文件
  • 可以在其中增加一些属性配置
  • 如果两个文件有同一个字段,优先使用外部配置文件的!

标签是有放的顺序的,必须保证这个顺序,所以 properties 是放在最上面
在这里插入图片描述

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 core file-->
<configuration>

    <!--引入外部配置文件-->
    <properties resource="db.properties">
<!--        <property name="username" value="root"/>-->
<!--        <property name="pwd" value="123456"/>-->
    </properties>

    <environments default="development">
        <environment id="development">
            <!--事务管理-->
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!--数据库相关配置-->
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

    <!--每一个 Mapper.xml 都需要在 Mybatis 核心配置文件(mybatis-config.xml) 中注册!-->
    <mappers>
        <mapper resource="com/uestc/dao/UserMapper.xml"/>
    </mappers>

</configuration>

运行测试,成功
在这里插入图片描述

同时可以 properties 中写一部分 db.properties 中写一部分
在这里插入图片描述
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 core file-->
<configuration>

    <!--引入外部配置文件-->
    <properties resource="db.properties">
        <property name="username" value="root"/>
        <property name="pwd" value="123456"/>
    </properties>

    <environments default="development">
        <environment id="development">
            <!--事务管理-->
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!--数据库相关配置-->
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${pwd}"/>
            </dataSource>
        </environment>
    </environments>

    <!--每一个 Mapper.xml 都需要在 Mybatis 核心配置文件(mybatis-config.xml) 中注册!-->
    <mappers>
        <mapper resource="com/uestc/dao/UserMapper.xml"/>
    </mappers>

</configuration>

在这里插入图片描述

properties 和 db.properties 如果都有相同的字段,比如 username 和 password,就存在优先级的问题

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

测试成功出结果,说明优先使用的是 db.properties 里面的

在这里插入图片描述

  • 可以直接引入外部文件
  • 可以在其中增加一些属性配置
  • 如果两个文件有同一个字段,优先使用外部配置文件的

4.4 类型别名(typeAliases)[ˈeɪliəsɪz] 别名

  • 类型别名是为Java类型设置一个短的名字。
  • 存在的意义仅在于用来减少类完全限定名的冗余。

在这里插入图片描述

在这里插入图片描述

mybatis-config.xml 中取别名

<!--可以给实体类起别名-->
<typeAliases>
    <typeAlias type="com.uestc.pojo.User" alias="User" />
</typeAliases>

注意 typeAliases 标签放置得位置顺序
在这里插入图片描述

UserMapper.xml 中使用

<!--namespace绑定一个对应的 Dao/Mapper 接口-->
<mapper namespace="com.uestc.dao.UserMapper">

	<!--sql查询语句,getUserList 以前需要放到 UserDaoImpl实现类中重写,现在只需要标签即可-->
	<select id="getUserList" resultType="User">
	    select * from mybatis.user
	</select>

</mapper>	

在这里插入图片描述

执行测试
在这里插入图片描述

也可以指定一个包名,MyBatis会在包名下面搜索需要的 JavaBean,比如:
扫描实体类的包,它的默认别名就为这个类的类名,首字母小写!(比如类名为 User,替换时用 user 也可以跑出来)

<!--可以给实体类起别名-->
<typeAliases>
    <package name="com.uestc.pojo"/>
</typeAliases>

在这里插入图片描述

下面大写小写首字母都可以运行成功,推荐使用首字母小写
在这里插入图片描述

在这里插入图片描述
在实体类比较少的时候,使用第一种方式。

如果实体类十分多,建议使用第二种。

第一种可以DIY别名,第二种则不行,如果非要改,需要在实体上增加注解,见下:(即在第二种方式的基础上,增加注解)

@Alias("user")
//实体类
public class User {xxx}

在这里插入图片描述

测试
在这里插入图片描述

原因是通过注解更改了别名,所以要用 hello
在这里插入图片描述
在这里插入图片描述

4.5 设置

这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。
在这里插入图片描述
在这里插入图片描述

4.6 其他配置

  • typeHandlers(类型处理器)
  • objectFactory(对象工厂)
  • plugins(插件)
  • mybatis-generator-core
  • mybatis-plus
  • 通用mapper

4.7 映射器(mappers)

MapperRegistry:注册绑定我们的 Mapper 文件;
方式一:【推荐使用】 在 mybatis-config.xml 中加入如下:

<!--每一个 Mapper.xml 都需要在 Mybatis 核心配置文件(mybatis-config.xml) 中注册!-->
<mappers>
    <mapper resource="com/uestc/dao/UserMapper.xml"/>
</mappers>

将 UserMapper.xml 文件放入到其他地方,同时更改 mapper 标签下路径,可以正常运行
在这里插入图片描述

方式二:使用 class 文件绑定注册

<!--每一个Mapper.xml都需要在Mybatis核心配置文件中注册!-->
<mappers>
    <mapper class="com.uestc.dao.UserMapper"/>
</mappers>

将 UserMapper.xml 文件放入到其他地方,同时更改 mapper 标签下路径,运行失败
在这里插入图片描述

将 UserMapper.xml 与其绑定得接口 UserMapper 放在同一个包下,运行成功
在这里插入图片描述

因此第二个方式注意点:

  • 接口和它的Mapper配置文件必须同名!
  • 接口和它的Mapper配置文件必须在同一个包下!

方式三:使用扫描包进行注入绑定

<!--每一个Mapper.xml都需要在Mybatis核心配置文件中注册!-->
<mappers>
    <package name="com.uestc.dao"/>
</mappers>

方式三注意点:

  • 接口和它的Mapper配置文件必须同名!
  • 接口和它的Mapper配置文件必须在同一个包下!

4.8 生命周期和作用域

在这里插入图片描述

生命周期和作用域是至关重要的,因为错误的使用会导致非常严重的并发问题。

SqlSessionFactoryBuilder:

  • 一旦创建了 SqlSessionFactory,就不再需要它了。
  • 局部变量

SqlSessionFactory:

  • 说白就是可以想象为:数据库连接池。
  • SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。
  • SqlSessionFactory 的最佳作用域是应用作用域。
  • 最简单的就是使用单例模式或者静态单例模式。

SqlSession:

  • 连接到连接池的一个请求!
  • SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。
  • 用完后需要赶紧关闭,否则资源被占用!

在这里插入图片描述
这里的每一个Mapper,就代表一个具体的业务!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/944772.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【LLM综述】29种大模型Prompt Engineering技术

note 从零样本&#xff08;Zero-shot&#xff09;提示到最新进展的各种提示技术&#xff0c;包括推理和逻辑链&#xff08;Chain-of-Thought, CoT&#xff09;提示、自动链式思考&#xff08;Auto-CoT&#xff09;提示、自我一致性&#xff08;Self-Consistency&#xff09;提…

【Java基础-29】深入理解Java中的super关键字:用法、场景与最佳实践

在Java编程中&#xff0c;super关键字是一个非常重要的概念&#xff0c;尤其在继承和多态的上下文中。它用于访问父类的成员&#xff08;属性、方法或构造函数&#xff09;&#xff0c;帮助开发者在子类中更好地管理和扩展父类的功能。本文将深入探讨super关键字的用法、适用场…

linux-软硬链接

我们今天再来聊一下这个"软硬链接"的问题. 目录 1. 软硬链接长什么样?2. 软连接和硬链接的特征 和 应用2.1 软连接特征 及其 应用?①软连接是什么?②软连接的应用1: 快捷方式③软连接的应用2: 方便维护库文件 2.2 硬连接特征 及其 应用?①硬链接是什么?②引用计…

学习threejs,THREE.CircleGeometry 二维平面圆形几何体

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.CircleGeometry 圆形…

ISO/IEC 25012:2008 系统和软件的质量模型(数据质量模型)

本文是对GBT 25000.12-2017《软件产品系统与软件质量要求与评价&#xff08;SQuaRE&#xff09;第12部分&#xff1a;数据质量模型》一文的转载&#xff0c;此外还参考了ISO/IEC 25012:2008(en) Software engineering — Software product Quality Requirements and Evaluation…

鸿蒙开发工程师成长的五个阶段

在科技日新月异的今天&#xff0c;鸿蒙&#xff08;HarmonyOS&#xff09;作为华为自主研发的操作系统&#xff0c;正以其独特的魅力和广阔的应用前景吸引着越来越多的开发者加入。鸿蒙不仅承载着华为对未来智能设备互联互通的愿景&#xff0c;也为开发者提供了一个充满挑战与机…

torch.nn.LSTM介绍

torch.nn.LSTM 是 PyTorch 提供的一个高级封装,用于构建长短时记忆网络(LSTM)。相比手动实现,torch.nn.LSTM 更高效且支持批量处理、双向 LSTM、多层 LSTM 等功能,适合大多数实际应用。 LSTM基本原理 门控机制(Gating Mechanism)是深度学习中常见的一种设计,用于控制信…

termux-boot安卓开机自动启动应用

termux安装 github 蓝奏云 v119.1 termux-boot安装 github 蓝奏云 v0.8.1 安装 给权限运行加锁后台 am启动应用命令 am start -n 包名/启动项获取包名和启动入口&#xff08;图中app为爱玩机工具箱&#xff09; 例 简黑时钟蓝奏云 包名com.hm.jhclock 桌面启动项com.hm.jh…

【畅购商城】购物车模块之查看购物车

目录 分析 接口 后端实现 前端实现&#xff1a;显示页面 前端实现&#xff1a;显示购物车信息 分析 用户如果没有登录&#xff0c;购物车存放在浏览器端的localStorage处&#xff0c;且以数组的方式进行存储。用户如果登录了&#xff0c;购物车存放在redis中&#xff0c…

Kimi进行学术方向选择精讲!

目录 1.文献搜索 2.辅助选题 3.选题判断 在我们之前的文章中&#xff0c;小编都强调了选题在文章价值中的核心作用。一篇优秀的文章背后&#xff0c;肯定有一个精心挑选的选题。选题的好坏直接影响着文章能够发表的期刊等级。许多宝子们却采取了相反的做法&#xff0c;将大量…

记一次内存泄漏分析(待写稿)

背景 线上Flink频繁重启&#xff0c;先后排查了很多情况&#xff0c;目前在内存阶段排查&#xff0c;首先说说学到的知识 内存泄漏分析 JVM常用命令 JConsole JVisualvm 快照的这里是最有用的&#xff0c;它和jmap不同&#xff0c;jmap查找的是占用字节最多的类&#xff…

【PPTist】网格线、对齐线、标尺

前言&#xff1a;本篇文章介绍辅助我们摆放元素位置的几个功能 一、网格线功能 网格线主要是用来辅助我们对齐元素的&#xff0c;右键可以选择使用哪种网格线&#xff0c;以及关闭和打开 显示效果就是图中的这种效果。但是强迫症有点难受&#xff0c;它底部没对齐啊啊啊 不…

探究步进电机与输入脉冲的关系

深入了解步进电机 前言一、 步进电机原理二、 细分三、脉冲数总结 前言 主要是探究以下内容&#xff1a; 1、步进电机的步进角。 2、什么是细分。 3、脉冲的计算。 最后再扩展以下STM32定时器的计算方法。 一、 步进电机原理 其实语言描述怎么样都不直观&#xff0c;我更建议…

E-commerce .net+React(一)——项目初始化

文章目录 项目地址一、创建.Net环境1.1环境配置1.1.1 使用vscode创建webapi1.1.2 Clean architecture结构创建1.1.3 将创建好结构的项目添加到git里1.1.4 EF Core配置1. 在infrastructure里安装EF所需环境2. 创建Product数据模型3. 创建EF Core的DbContext 数据库上下文4. 创建…

Spring Bean 管理学习

Spring 框架的核心之一是 IOC&#xff08;控制反转&#xff09;容器&#xff0c;Bean 的管理是其中的重要功能。本文将从 Bean 的获取、作用域和第三方 Bean 的管理三个方面进行学习和总结。 1. 获取 Bean 在 Spring 项目启动时&#xff0c;IoC 容器会将所有的 Bean 创建好并托…

Excel for Finance 07 `FV PV` 函数

Excel 的 FV 函数用于计算一笔投资在未来的价值&#xff0c;基于固定的利率和定期付款。这是一个金融函数&#xff0c;常用来分析储蓄计划、贷款、或投资的增长。 语法&#xff1a; FV(rate, nper, pmt, [pv], [type])参数说明&#xff1a; rate&#xff08;必需&#xff09;&…

Lecture 18

Floating Point Numbers 1. 整数的局限性&#xff1a; • 在计算机中&#xff0c;并非所有数字都能用整数形式表示。例如&#xff1a; • 非整数&#xff08;如小数&#xff09;&#xff1a;345.0256。 • 超出整数表示范围的数&#xff1a; 5.375 \times 10^{25} 。 2. 浮…

【LC】19. 删除链表的倒数第 N 个结点

题目描述&#xff1a; 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5]示例 2&#xff1a; 输入&#xff1a;head [1], n 1 输出&#xff…

EasyExcel(读取操作和填充操作)

文章目录 1.准备Read.xlsx&#xff08;具有两个sheet&#xff09;2.读取第一个sheet中的数据1.模板2.方法3.结果 3.读取所有sheet中的数据1.模板2.方法3.结果 EasyExcel填充1.简单填充1.准备 Fill01.xlsx2.无模版3.方法4.结果 2.列表填充1.准备 Fill02.xlsx2.模板3.方法4.结果 …

五.Springboot通过AOP实现API接口的签名验证

文章目录 前言一、实现原理二、签名规则三、服务端实现4.1、创建自定义注解4.2、创建切面处理类4.3、对应工具类RequestUtil 四、测试4.1 签名失败测试&#xff1a;4.2 签名成功测试&#xff1a; 四、总结 前言 对外开放的接口&#xff0c;需要验证请求方发送过来的数据确实是…