1. 基于代理 Dao 实现 CRUD 操作
使用要求:
- 持久层接口和持久层接口的映射配置必须在相同的包下
- 持久层映射配置中 mapper 标签的 namespace 属性取值必须是持久层接口的全限定类名
- SQL 语句的配置标签
<select>
,<insert>
,<delete>
,<update>
的 id 属性必须和持久层接口的方法名相同。
1.1 根据 ID 查询
1.1.1 在持久层接口中添加查询方法
1 | /** |
1.1.2 在用户的映射配置文件中配置
1 | <!-- 根据id查询用户 --> |
细节:
resultType 属性:
用于指定结果集的类型。
parameterType 属性:
用于指定传入参数的类型。
sql 语句中使用#{} 字符 :
它代表占位符,相当于原来 jdbc 部分所学的?,都是用于执行语句时替换实际的数据。
具体的数据是由#{}里面的内容决定的。
#{}
中内容的写法:由于数据类型是基本类型,所以此处可以随意写。
1.1.3 在测试类添加测试
1 | /** |
1.2 保存操作
1.2.1 在持久层接口中添加新增方法
1 | /** |
1.2.2 在用户的映射配置文件中配置
1 | <!-- 保存用户 --> |
细节:
parameterType 属性:
代表参数的类型,因为我们要传入的是一个类的对象,所以类型就写类的全名称。
sql 语句中使用#{}字符:
它代表占位符,相当于原来 jdbc 部分所学的?,都是用于执行语句时替换实际的数据。
具体的数据是由#{}里面的内容决定的。
#{}
中内容的写法:由于我们保存方法的参数是 一个 User 对象,此处要写 User 对象中的属性名称。
它用的是 ognl 表达式。
ognl 表达式:
它是 apache 提供的一种表达式语言,全称是:Object Graphic Navigation Language 对象图导航语言
它是按照一定的语法格式来获取数据的。
语法格式就是使用 #{对象.对象}的方式
#{user.username}
它会先去找 user 对象,然后在 user 对象中找到 username 属性,并调用getUsername()方法把值取出来。但是我们在 parameterType 属性上指定了实体类名称,所以可以省略 user.而直接写 username。
1.2.3 在测试类添加测试
1 | /** |
打开 Mysql 数据库发现并没有添加任何记录,原因是什么?
这一点和 jdbc 是一样的,我们在实现增删改时一定要去控制事务的提交,那么在 mybatis 中如何控制事务提交呢?
可以使用:session.commit();来实现事务提交。加入事务提交后的代码如下:
1 | //用于在测试方法执行之后执行 |
1.2.4 问题扩展:新增用户 id 的返回值
新增用户后,同时还要返回当前新增用户的 id 值,因为 id 是由数据库的自动增长来实现的,所以就相当于我们要在新增后将自动增长 auto_increment 的值返回。
1 | <!-- 保存用户 --> |
1.3 用户更新
1.3.1 在持久层接口中添加更新方法
1 | /** |
1.3.2 在用户的映射配置文件中配置
1 | <!-- 更新用户 --> |
1.3.3 在测试类添加测试
1 | /** |
1.4 用户删除
1.4.1 在持久层接口中添加删除方法
1 | /** |
1.4.2 在用户的映射配置文件中配置
1 | <!-- 删除用户--> |
1.4.3 在测试类添加测试
1 | /** |
1.5 用户模糊查询
1.5.1 在持久层接口中添加模糊查询方法
1 | /** |
1.5.2 在用户的映射配置文件中配置
1 | <!-- 根据名称模糊查询 --> |
1.5.3 在测试类添加测试
1 | /** |
在控制台输出的执行 SQL 语句如下:
我们在配置文件中没有加入%来作为模糊查询的条件,所以在传入字符串实参时,就需要给定模糊查询的标识%。配置文件中的#{username}也只是一个占位符,所以 SQL 语句显示为“?”。
1.5.4 模糊查询的另一种配置方式
第一步:修改 SQL 语句的配置,配置如下:
1 | <!-- 根据名称模糊查询 --> |
我们在上面将原来的#{}占位符,改成了${value}。注意如果用模糊查询的这种写法,那么${value}的写法就是固定的,不能写成其它名字。
第二步:测试,如下:
1 | /** |
在控制台输出的执行 SQL 语句如下:
可以发现,我们在程序代码中就不需要加入模糊查询的匹配符%了,这两种方式的实现效果是一样的,但执行的语句是不一样的。
1.5.5 #{}
与${}
的区别
#{}
表示一个占位符号通过#{}可以实现 preparedStatement 向占位符中设置值,自动进行 java 类型和 jdbc 类型转换,#{}可以有效防止 sql 注入。 #{}可以接收简单类型值或 pojo 属性值。 如果 parameterType 传输单个简单类型值,#{}括号中可以是 value 或其它名称。
${}
表示拼接 sql 串通过${}可以将 parameterType 传入的内容拼接在 sql中且不进行 jdbc 类型转换, ${}可以接收简单类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值,${}括号中只能是 value。
1.5.6 模糊查询的${value}
源码分析
这就说明了源码中指定了读取的 key 的名字就是”value”,所以我们在绑定参数时就只能叫 value 的名字了。
1.6 查询使用聚合函数
1.6.1 在持久层接口中添加聚合函数查询方法
1 | /** |
1.6.2 在用户的映射配置文件中配置
1 | <!-- 获取用户的总记录条数 --> |
1.6.3 在测试类添加测试
1 | /** |
2. Mybatis 的参数深入
2.1 parameterType 配置参数
2.1.1 使用说明
SQL 语句传参,使用标签的 parameterType 属性来设定。该属性的取值可以是基本类型,引用类型(例如:String 类型),还可以是实体类类型(POJO 类)。同时也可以使用实体类的包装类
2.1.2 注意事项
基本类 型和 String 我们可以直接写类型名称 ,也可以使用包名 . 类名的方式 ,例如 :java.lang.String。实体类类型,目前我们只能使用全限定类名。
2.2 传递 pojo 包装对象
开发中通过 pojo 传递查询条件 ,查询条件是综合的查询条件,不仅包括用户查询条件还包括其它的查询条件(比如将用户购买商品信息也作为查询条件),这时可以使用包装对象传递输入参数。Pojo 类中包含 pojo。
需求:根据用户名查询用户信息,查询条件放到 QueryVo 的 user 属性中。
2.2.1 编写 QueryVo
1 | /** |
2.2.2 在持久层接口中添加查询方法
1 | /** |
2.2.3 在用户的映射配置文件中配置
1 | <!-- 根据queryVo的条件查询用户 --> |
2.2.4 在测试类添加测试
1 | /** |
3. Mybatis 的输出结果封装
3.1 resultType 配置结果类型
resultType 属性可以指定结果集的类型,它支持基本类型和实体类类型。
它和 parameterType 一样,如果注册过类型别名的,可以直接使用别名。没有注册过的必须使用全限定类名。
3.1.1 基本类型示例
案例1.6
3.1.2 实体类类型示例
案例1.1
3.1.3 特殊情况示例
3.1.3.1 修改实体类
实体类属性和数据库表的列名已经不一致
3.1.3.2 修改映射配置
使用别名查询
1 | <!--配置查询所有--> |
3.2 resultMap 结果类型
resultMap 标签可以建立查询的列名和实体类的属性名称不一致时建立对应关系。从而实现封装。
在 select 标签中使用 resultMap 属性指定引用即可。同时 resultMap 可以实现将查询结果映射为复杂类型的 pojo,比如在查询结果映射对象中包括 pojo 和 list 实现一对一查询和一对多查询。
3.2.1 定义 resultMap
1 | <!-- 建立 User 实体和数据库表的对应关系 |
3.2.2 映射配置
1 | <!--配置查询所有--> |
4. Mybatis 传统 DAO 层开发
使用 Mybatis 开发 Dao,通常有两个方法,即原始 Dao开发方式和 Mapper 接口代理开发方式。而现在主流的开发方式是接口代理开发方式,这种方式总体上更加简便。
4.1 Mybatis 实现 DAO 的传统开发方式
4.1.1 持久层 Dao 接口
1 | /** |
4.1.2 持久层 Dao 实现类
1 | /** |
4.1.3 持久层映射配置
1 |
|
4.1.4 测试类
1 | /** |
5. SqlMapConfig.xml 配置文件
5.1 配置内容
5.1.1 SqlMapConfig.xml 中配置的内容和顺序
1 | -properties (属性) |
5.2 properties(属性)
在使用 properties 标签配置时,我们可以采用两种方式指定属性配置。
5.2.1 第一种
1 | <properties> |
5.2.2 第二种
5.2.2.1 在 classpath 下定义 db.properties
1 | com.mysql.jdbc.Driver = |
5.2.2.2 properties 标签配置
1 | <!-- 配置properties |
5.2.3 dataSource 标签引用配置
1 | <dataSource type="POOLED"> |
5.3 typeAliases(类型别名)
除了前面 Mybatis 支持的默认别名,也可以采用自定义别名方式来开发。
5.3.1 自定义别名
在 SqlMapConfig.xml 中配置:
1 | <typeAliases> |
5.4 mappers(映射器)
5.4.1 <mapper resource=" " />
1 | 使用相对于类路径的资源 |
5.4.2 <mapper class=" " />
1 | 使用 mapper 接口类路径 |
5.4.3 <package name=""/>
1 | 注册指定包下的所有 mapper 接口 |
-------------本文结束感谢您的阅读-------------
本文标题: MyBatis(二)
本文链接: https://wgy1993.gitee.io/archives/8f423109.html
版权声明: 本作品采用 CC BY-NC-SA 4.0 进行许可。转载请注明出处!
![知识共享许可协议](https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png)