深入浅出 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:参数类型!
xml 复制代码
<!--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 接口中加入方法

java 复制代码
// 根据 ID 查询用户
User getUserById(int id);

在 UserMapper.xml 中配置

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 中进行测试

java 复制代码
@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

java 复制代码
//插入一个用户
int addUser(User user);

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

xml 复制代码
<!--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 中进行测试

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

执行

刷新数据库,没有看到

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

java 复制代码
@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

java 复制代码
int updateUser(User user);

在 UserMapper.xml 中配置

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}

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

java 复制代码
@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

java 复制代码
int deleteUser(int id);

在 UserMapper.xml 中配置

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

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

测试:

java 复制代码
@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 作为参数来传,不需要知道数据库内有什么

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

在 UserMapper.xml 中配置

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>

老方式:

xml 复制代码
<!--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 了。这就可以应付参数过多的情况,并不需要写出所有参数

测试

java 复制代码
@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 作为参数传递

java 复制代码
User getUserById2(Map<String,Object> map);

在 UserMapper.xml 中配置

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 都可以任意,但是用之前的方式,这里就限制死了,必须要实体类和数据库属性一致

测试

java 复制代码
@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

java 复制代码
List<User> getUserLike(String value);

在 UserMapper.xml 中配置

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 注入问题

测试

java 复制代码
@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 行为的设置和属性信息。
java 复制代码
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 配置文件中进行配置。例如:

xml 复制代码
<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 注解来控制事务的提交和回滚。

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

或在 Spring 中:

xml 复制代码
<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 配置文件的根标签,所有其他标签都在这个标签内。

xml 复制代码
<configuration>
    <!-- 配置内容 -->
</configuration>
3. <properties> (可选)

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

xml 复制代码
<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 的全局设置,例如缓存开关、懒加载等。

xml 复制代码
<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. 单个类型设置别名
xml 复制代码
<typeAliases>
    <typeAlias alias="User" type="com.example.User"/>
</typeAliases>
  1. 为整个包设置别名

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

xml 复制代码
<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 类型之间转换。

xml 复制代码
<typeHandlers>
    <typeHandler handler="com.example.CustomTypeHandler"/>
</typeHandlers>
7. <objectFactory> (可选)

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

xml 复制代码
<objectFactory type="com.example.CustomObjectFactory"/>
8. <plugins> (可选)

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

xml 复制代码
<plugins>
    <plugin interceptor="org.mybatis.example.PluginExample"/>
</plugins>
9. <environments>

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

xml 复制代码
<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 接口的类名。

xml 复制代码
<mappers>
    <mapper resource="com/example/mapper/UserMapper.xml"/>
    <mapper class="com.example.mapper.ProductMapper"/>
</mappers>

总体结构

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

xml 复制代码
<?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

java 复制代码
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

在核心配置文件中映入

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

标签是有放的顺序的,必须保证这个顺序,所以 properties 是放在最上面

mybatis-config.xml 更改如下:

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 复制代码
<?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 中取别名

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

注意 typeAliases 标签放置得位置顺序

UserMapper.xml 中使用

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 也可以跑出来)

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

下面大写小写首字母都可以运行成功,推荐使用首字母小写

在实体类比较少的时候,使用第一种方式。

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

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

java 复制代码
@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 中加入如下:

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

将 UserMapper.xml 文件放入到其他地方,同时更改 mapper 标签下路径,可以正常运行

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

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

将 UserMapper.xml 文件放入到其他地方,同时更改 mapper 标签下路径,运行失败

将 UserMapper.xml 与其绑定得接口 UserMapper 放在同一个包下,运行成功

因此第二个方式注意点:

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

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

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

方式三注意点:

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

4.8 生命周期和作用域

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

SqlSessionFactoryBuilder:

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

SqlSessionFactory:

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

SqlSession:

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

这里的每一个Mapper,就代表一个具体的业务!

相关推荐
靖顺1 小时前
【OceanBase 诊断调优】—— packet fly cost too much time 的根因分析
数据库·oceanbase
liuxin334455661 小时前
学籍管理系统:实现教育管理现代化
java·开发语言·前端·数据库·安全
yuanbenshidiaos4 小时前
C++--------------树
java·数据库·c++
dengjiayue5 小时前
MySQL 查询大偏移量(LIMIT)问题分析
数据库·mysql
言之。5 小时前
【MySQL】在MySQL中如何定位慢查询?
数据库·mysql
DashVector6 小时前
如何通过HTTP API插入Doc
数据库·人工智能·http·阿里云·向量检索
DashVector6 小时前
如何通过HTTP API分组检索Doc
服务器·数据库·http·数据库开发·数据库架构
Suwg2096 小时前
【MySQL】踩坑笔记——保存带有换行符等特殊字符的数据,需要进行转义保存
数据库·笔记·mysql
听见~6 小时前
MyBatisPlus
mybatis
2401_857610036 小时前
中文学习系统:成本效益分析与系统优化
java·数据库·学习·架构