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 分析错误
-
xml 文件中注释不能出现中文报错,查看自己的是UTF-8还是GBK编码,改成为相应的就行。
<?xml version="1.0" encoding="UTF-8" ?> <?xml version="1.0" encoding="GBK" ?>
即可成功测试。
-
标签不要匹配错!
-
resource绑定mapper,需要使用路径!
-
程序配置文件必须符合规范!
-
NullPointerException,没有注册到资源!
-
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>
- 对比之前添加用户注册的值,之前没有 map 参数时,传入的值
#{id}, #{name}, #{pwd}
必须与实体的属性一致,而使用 map 后,随意传入什么都可以,因为传递的是 map 的 key,不需要与数据库中的表的属性一致,传入什么都可以#{userid}, #{password}
- 这里与之前的老方式比较:某个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 中,dataSource
和 transactionManager
是两个重要的概念,分别用于数据库连接管理和事务控制。
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 类型创建别名:一种是为单个类型设置别名,另一种是为整个包中的所有类创建别名。两种方式的配置如下:
- 单个类型设置别名
xml
<typeAliases>
<typeAlias alias="User" type="com.example.User"/>
</typeAliases>
- 为整个包设置别名
另一种方式是为整个包中的所有类创建别名,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 的配置文件中,标签的顺序通常为:
properties
(可选)settings
typeAliases
typeHandlers
(可选)objectFactory
(可选)plugins
(可选)environments
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&useUnicode=true&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,就代表一个具体的业务!