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

news2025/2/12 13:16:00

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,就代表一个具体的业务!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于c语言的union、字符串、格式化输入输出

结构体之共用体union 共用体也叫联合体&#xff0c;其关键词为union 与结构体不同的是&#xff0c;共用体所开辟的存储空间仅仅为其中最长类型变量的存储空间而不是全部变量的存储空间&#xff0c;由于同一内存单元在同一时间内只能存放其中一种的数据类型&#xff0c;因此在每…

IntelliJ Idea常用快捷键详解

文章目录 IntelliJ Idea常用快捷键详解一、引言二、文本编辑与导航1、文本编辑2、代码折叠与展开 三、运行和调试四、代码编辑1、代码补全 五、重构与优化1、重构 六、使用示例代码注释示例代码补全示例 七、总结 IntelliJ Idea常用快捷键详解 一、引言 在Java开发中&#xff…

AI开发:使用支持向量机(SVM)进行文本情感分析训练 - Python

支持向量机是AI开发中最常见的一种算法。之前我们已经一起初步了解了它的概念和应用&#xff0c;今天我们用它来进行一次文本情感分析训练。 一、概念温习 支持向量机&#xff08;SVM&#xff09;是一种监督学习算法&#xff0c;广泛用于分类和回归问题。 它的核心思想是通过…

Linux-----进程处理(子进程创建)

【尚硅谷嵌入式Linux应用层开发&#xff0c;linux网络编程&#xff0c;linux进程线程&#xff0c;linux文件io】https://www.bilibili.com/video/BV1DJ4m1M77z?p35&vd_source342079de7c07f82982956aad8662b467 main函数 fork创建进程 fork()参数 /*** brief 创建一个子进…

一种寻路的应用

应用背景 利用长途车进行货物转运的寻路计算。例如从深圳到大连。可以走有很多条长途车的路线。需要根据需求计算出最合适路线。不同的路线的总里程数、总价、需要的时间不一样。客户根据需求进行选择。主要有一些细节&#xff1a; 全国的长途车车站的数据的更新&#xff1a; …

2. FPGA基础了解--全局网络

前言 引入扇出的概念介绍FPGA中的全局网络为后续时序优化埋下伏笔 扇出 在FPGA设计中扇出是一个重要的概念&#xff0c;所谓的扇出就是一个控制信号所能控制的数据信号的总个数&#xff0c;比如ctrl信号的扇出就是16 reg ctrl 0; reg [15:0] out 0; always (posedge c…

Excel中一次查询返回多列

使用Excel或wps的时候&#xff0c;有时候需要一次查询返回多列内容&#xff0c;这种情况可以选择多次vlookup或者多次xlookup&#xff0c;但是这种做法费时费力不说&#xff0c;效率还有些低下&#xff0c;特别是要查询的列数过多时。我放了3种查询方法&#xff0c;效果图&…

智能化军事【五】精确制导武器智能化实现

文章目录 前言精确制导武器智能化实现基于深度学习实现的智能化功能基于强化学习实现的智能化功能强化学习深度强化学习 网络模型轻量化网络剪枝&#xff08;通道剪枝&#xff09;技术层剪枝权值量化技术低秩近似技术知识蒸馏技术强化学习联合训练 解决有效训练样本不足或获取困…

解锁高效密码:适当休息,让学习状态满格

一、“肝帝” 的困境 在当今竞争激烈的职场中&#xff0c;“肝帝” 现象屡见不鲜。超长工时仿佛成为了许多行业的 “标配”&#xff0c;从互联网企业的 “996”“007”&#xff0c;到传统制造业的轮班倒、无休无止的加班&#xff0c;员工们的工作时间被不断拉长。清晨&#xff…

asp.net 高校学生勤工俭学系统设计与实现

博主介绍&#xff1a;专注于Java&#xff08;springboot ssm 等开发框架&#xff09; vue .net php python(flask Django) 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找…

WebRTC服务质量(12)- Pacer机制(04) 向Pacer中插入数据

WebRTC服务质量&#xff08;01&#xff09;- Qos概述 WebRTC服务质量&#xff08;02&#xff09;- RTP协议 WebRTC服务质量&#xff08;03&#xff09;- RTCP协议 WebRTC服务质量&#xff08;04&#xff09;- 重传机制&#xff08;01) RTX NACK概述 WebRTC服务质量&#xff08;…

RTMW:实时多人2D和3D 全人体姿态估计

单位&#xff1a;上海AI实验室 代码&#xff1a;mmpose/tree/main/projects/rtmpose 系列文章目录 RTMO: 面向高性能单阶段的实时多人姿态估计 目录 系列文章目录摘要一、背景二、相关工作2.1 自上而下的方法。2.2 坐标分类。2.3 3D Pose 3 实验方法3.1.1 任务限制3.1.3训练技…

AI智能养站神器-SEO助理原创文章批量生成发布工具

很多站长最头疼的就是网站每天的内容更新&#xff0c;因为不知道写什么&#xff0c;采集被人的文章又会被定义为抄袭&#xff0c;而且现在伪原创已经没有多大的效果了&#xff0c;所以今天给大家分享的就是一款AI智能养战神器-SEO助理原创文章批量生成发布工具。 这款工具支持…

用Python开启人工智能之旅(三)常用的机器学习算法与实现

第三部分&#xff1a;常用的机器学习算法与实现 用Python开启人工智能之旅&#xff08;一&#xff09;Python简介与安装 用Python开启人工智能之旅&#xff08;二&#xff09;Python基础 用Python开启人工智能之旅&#xff08;三&#xff09;常用的机器学习算法与实现 用Pyt…

FD(File Descriptor)泄漏

File Descriptor是Linux下概念&#xff0c;fd 是 int类型非负数&#xff01; 进程打开File&#xff0c;Socket&#xff0c;Pipe后生成一个File Descriptor&#xff0c;它是打开这个系统资源的标识符。 Linux每个进程fd最大1024个&#xff0c;超过之后进程 crash&#xff0c;c…

英语单词拼读小程序开发制作介绍

英语单词拼读小程序开发制作介绍本英语单词拼读小程序系统开发的主要功能有&#xff1a; 1、按年级分类展示每个年级阶段的英语单词信息。 2、点击选择的单词进入单词拼读页面&#xff0c;展示英语单词的拼读音标、中文意思、单词发音、拆分词汇发音、用户通过朗读发音对比。通…

TCP客户端模拟链接websocket服务端发送消息(二)

兄弟们&#xff0c;我来填坑了&#xff0c;o(╥﹏╥)o o(╥﹏╥)o o(╥﹏╥)o o(╥﹏╥)o o(╥﹏╥)o o(╥﹏╥)o&#xff0c;前几天写了个tcp模拟websocket客户端的以为完成&#xff0c;后面需要发送消息给服务端&#xff0c;以为简单不就是一个发送消息么&#xff0c;这不是一…

Docker 镜像加速访问方案

在数字化时代&#xff0c;Docker以其轻量级和便捷性成为开发者和运维人员的首选容器技术。然而自2023年5月中旬起&#xff0c;Docker Hub 的访问速度较慢或不稳定&#xff0c;这对依赖Docker Hub拉取镜像的用户来说无疑是一个挑战。本文将提供 Docker Hub 访问的一系列替代方案…

牛客网刷题 ——C语言初阶——BC112小乐乐求和

1.牛客网刷题 ——C语言初阶 牛客网&#xff1a;BC112小乐乐求和 小乐乐最近接触了求和符号Σ&#xff0c;他想计算的结果。但是小乐乐很笨&#xff0c;请你帮助他解答。 输入描述: 输入一个正整数n (1 ≤ n ≤ 109) 输出描述: 输出一个值&#xff0c;为求和结果。 示例1 输…

Eclipse常用快捷键详解

文章目录 Eclipse常用快捷键详解一、引言二、编辑快捷键三、选择和移动快捷键四、行操作快捷键五、搜索和导航快捷键六、调试快捷键七、重构快捷键八、其他快捷键九、使用案例场景一&#xff1a;代码编写代码示例 场景二&#xff1a;代码调试场景三&#xff1a;代码重构代码示例…