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

news/2024/12/27 11:22:39/

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);//关闭SqlSessionsqlSession.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>

测试:

@Testpublic 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);}//关闭SqlSessionsqlSession.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 configurationPUBLIC "-//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 configurationPUBLIC "-//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.ppmy.cn/news/1558512.html

相关文章

修改vue-element-admin,如何连接我们的后端

改哪几个文件就可以连接我们后端 ​​​​​​​ 主要就这四个 main.js&#xff0c;屏蔽这个或者删除 vue-config 最后两个文件改下端口即可 这样基本就能发了&#xff0c;但是还要改下 改成api 然后还要修改request.js 这里改成我们返回的状态码 我讲一个东西很容易就懂了&…

【设计模式学习笔记】1. 设计模式概述

学习声明&#xff1a; 本笔记仅供博主个人学习记录。 参考课程来自&#xff1a; 【【狂神说Java】通俗易懂的23种设计模式教学&#xff08;停更&#xff09;】 一、设计模式概述&#xff1a; 1. 设计模式&#xff1a; - 前辈对代码开发经验的总结&#xff0c;用于解决特定问题…

某家政小程序系统 httpRequest 任意文件读取

0x01 产品描述: ‌家政上门预约服务小程序‌是一种基于移动互联网的家政服务平台,旨在为用户提供便捷、高效、安全的家政服务。用户可以通过手机随时随地预约家政服务,满足家庭日常清洁、照料、维修等需求‌。0x02 漏洞描述: 家政小程序系统 httpRequest 接口存在任意文件读…

全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之循环结构(for循环语句)(一)

在C编程中&#xff0c;顺序结构和分支结构是两种基本的控制流结构&#xff0c;其中顺序结构是一种最简单、最基本的控制结构&#xff0c;即代码按照从上到下的顺序逐行执行&#xff0c;每个语句按照顺序执行&#xff0c;一条语句执行完再执行下一条语句&#xff0c;依次执行所有…

人工智能的崛起:从机器学习到深度学习,再到计算机视觉

在科技迅速发展的今天&#xff0c;人工智能&#xff08;AI&#xff09;已经从科幻的想象&#xff0c;逐步成为改变社会的核心动力之一。从自动驾驶到智能语音助手&#xff0c;从医疗诊断到推荐系统&#xff0c;人工智能技术的应用场景无处不在。在这些技术背后&#xff0c;机器…

Elasticsearch-脚本查询

脚本查询 概念 Scripting是Elasticsearch支持的一种专门用于复杂场景下支持自定义编程的强大的脚本功能&#xff0c;ES支持多种脚本语言&#xff0c;如painless&#xff0c;其语法类似于Java,也有注释、关键字、类型、变量、函数等&#xff0c;其就要相对于其他脚本高出几倍的性…

Llama3.370B超越GPT-4o和Claude3.5 Sonnet

AI领域日新月异&#xff0c;最近AI 领域发生了太多事情&#xff0c;本文就语言大模型Llama 3.3 70B、GPT-4o 和 Claude 3.5 Sonnet进行对比。 12月7日&#xff0c;Meta今年的最终AI模型将要来了。Meta12月6日发布了Llama 3.3&#xff0c;拥有700亿个参数&#xff0c;但其性能与…

springboot476基于vue篮球联盟管理系统(论文+源码)_kaic

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统篮球联盟管理系统信息管理难度大&#xff0c;容错率低&am…