第1章 回顾
1.1自定义流程再分析
1.2mybatis环境搭建步骤
第一步:创建maven工程
第二步:导入坐标
第三步:编写必要代码(实体类和持久层接口)
第四步:编写SqlMapConfig.xml
第五步:编写映射配置文件
第六步:编写测试类
第二章基于代理Dao实现CRUD操作
目录基本结构为:
2.1根据id查询
2.1.1在持久层接口中添加findById方法
2.1.2在用户的映射配置文件中配置
注:
resultType属性:用于指定结果集类型
parameterType属性:用于指定传入参数的类型
sql语句中使用#{}字符:他表示占位符,相当于原来jdbc部分所学的?,都是用于执行语句时替换实际的数据。具体的数据是由#{}里面的内容决定的
#{}中内容的写法:
由于数据类型是基本类型,所以此处可以随意写
2.1.3在测试类添加测试
2.2保存操作
2.2.1在持久层接口中添加新增方法
2.2.2在用户的映射配置文件中配置
注:
parameterType属性:代表参数的类型,因为我们要传入的是一个类的对象,所以类型就写类的全名称。
sql 语句中使用#{}字符:它代表占位符,相当于原来 jdbc 部分所学的?,都是用于执行语句时替换实际的数据。具体的数据是由#{}里面的内容决定的。
#{}中内容的写法:由于我们保存方法的参数是 一个 User 对象,此处要写 User 对象中的属性名称。它用的是 ognl 表达式。
ognl 表达式:它是 apache 提供的一种表达式语言,全称是:Object Graphic Navigation Language 对象图导航语言,它是按照一定的语法格式来获取数据的。语法格式就是使用 #{对象.对象}的方式,#{user.username}它会先去找 user 对象,然后在 user 对象中找到 username 属性,并调用getUsername()方法把值取出来。但是我们在 parameterType 属性上指定了实体类名称,所以可以省略 user。而直接写 username。
2.2.3添加测试类中的测试方法
注:实现增删查改时要注意控制事务的提交,否则数据库不会发生改变,使用session.comit()来实现,即@After所示。
2.2.4问题扩展:新增用户id的返回值
新增用户后,同时还要返回当前新增用户的id值,因为id是由数据库的自动增长实现的,所以就相当于我们要在新增后将自动增长的auto_increment的值返回。
2.3用户更新
2.3.1在持久层接口中添加更新方法
2.3.2在用户的映射配置文件中配置
2.3.3加入更新的测试方法
2.4用户删除
2.4.1在持久层接口中添加删除方法
2.4.2在用户的映射配置文件中配置
2.4.3加入删除的测试方法
2.5用户模糊查询
2.5.1在持久层接口中添加模糊查询方法
2.5.2在用户的映射配置文件中配置
2.5.3加入模糊查询的测试方法
在控制台输出的执行 SQL 语句如下:
注:我们在配置文件中没有加入%来作为模糊查询的条件,所以在传入字符串实参时,就需要给定模糊查询的标识%。配置文件中的#{username}也只是一个占位符,所以SQL语句显示为"?"。
2.5.4模糊查询的另一种方式
我们在上面将原来的#{}占位符,改成了${value}。注意如果用模糊查询的这种写法,那么${value}的写法就是固定的,不能写成其他名字。
第二步测试,只需去掉两个%即可
在控制台输出的执行 SQL 语句如下:
可以发现,我们在程序代码中就不需要加入模糊查询的匹配符%了,这两种方式的实现效果是一样的,但执行的语句是不一样的。
2.5.5#{}与${}的区别
#{}表示一个占位符号
通过#{}可以实现 preparedStatement 向占位符中设置值,自动进行 java 类型和 jdbc 类型转换,#{}可以有效防止 sql 注入。 #{}可以接收简单类型值或 pojo 属性值。 如果 parameterType 传输单个简单类型值,#{}括号中可以是 value 或其它名称。
${}表示拼接 sql 串
通过${}可以将 parameterType 传入的内容拼接在 sql 中且不进行 jdbc 类型转换, ${}可以接收简单类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值,${}括号中只能是 value。
2.6查询使用聚合函数
2.6.1在持久层接口中添加模糊查询方法
2.6.2在用户的映射文件中配置
2.6.3加入聚合查询的测试方法
小结:使用mybatis实现增删查改主要只有三步,第一步在相应接口中写上需要的方法本文是在IUserdao中,第二步,在相应的映射配置文件中实现该方法,本文的映射文件是IUserdao.xml,第三步就是调用方法。
2.7Mybatis与JDBC编程的比较
1.数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
解决:在 SqlMapConfig.xml 中配置数据链接池,使用连接池管理数据库链接。
2.Sql 语句写在代码中造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变 java 代码。
解决:将 Sql 语句配置在 XXXXmapper.xml 文件中与 java 代码分离。
3.向 sql 语句传参数麻烦,因为 sql 语句的 where 条件不一定,可能多也可能少,占位符需要和参数对应。
解决:Mybatis 自动将 java 对象映射至 sql 语句,通过 statement 中的 parameterType 定义输入参数的类型。
4.对结果集解析麻烦,sql 变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成 pojo 对象解析比较方便。
解决:Mybatis 自动将 sql 执行结果映射至 java 对象,通过 statement 中的 resultType 定义输出结果的类型。
第三章Mybatis的参数深入
3.1parameterType 配置参数
3.1.1使用说明
我们在上一章节中已经介绍了 SQL 语句传参,使用标签的 parameterType 属性来设定。该属性的取值可以是基本类型,引用类型(例如:String 类型),还可以是实体类类型(POJO 类)。同时也可以使用实体类的包装类,本章节将介绍如何使用实体类的包装类作为参数传递。
3.1.2注意事项
基 本 类 型 和 String 我 们 可 以 直 接 写 类 型 名 称 , 也 可 以 使 用 包 名 . 类 名 的 方 式 , 例 如 :java.lang.String。实体类类型,目前我们只能使用全限定类名。究其原因,是 mybaits 在加载时已经把常用的数据类型注册了别名,从而我们在使用时可以不写包名,而我们的是实体类并没有注册别名,所以必须写全限定类名。
这些都是支持的默认别名。我们也可以从源码角度来看它们分别都是如何定义出来的。可以参考 TypeAliasRegistery.class 的源码。
3.2传递pojo包装对象
开发中通过 pojo 传递查询条件 ,查询条件是综合的查询条件,不仅包括用户查询条件还包括其它的查询条件(比如将用户购买商品信息也作为查询条件),这时可以使用包装对象传递输入参数。Pojo 类中包含 pojo。
需求:根据用户名查询用户信息,查询条件放到 QueryVo 的 user 属性中。
3.2.1编写QueryVo
3.2.2编写持久层接口
3.2.3持久层接口的映射文件
3.2.4测试包装类作为参数
第四章Mybatis的输出结果封装
4.1resultType配置结果类型
resultType 属性可以指定结果集的类型,它支持基本类型和实体类类型。我们在前面的 CRUD 案例中已经对此属性进行过应用了。需要注意的是,它和 parameterType 一样,如果注册过类型别名的,可以直接使用别名。没有注册过的必须使用全限定类名。例如:我们的实体类此时必须是全限定类名(今天最后一个章节会讲解如何配置实体类的别名)同时,当是实体类名称是,还有一个要求,实体类中的属性名称必须和查询语句中的列名保持一致,否则无法实现封装。
4.1.1基本类型示例
4.1.1.1Dao接口
4.1.1.2映射配置
4.1.2实体类类型示例
4.1.2.1Dao接口
4.1.2.1映射配置
4.1.3特殊情况示例
4.1.3.1修改实体类(让实体类属性和数据库表列名不一致)
4.1.3.3映射配置
4.1.3.4测试查询结果
只有名称有值,是因为mysql在windows系统中不区分大小写
4.1.3.5修改映射配置
使用别名查询
但是如果查询很多,那么使用别名会很麻烦。
4.2resultMap结果类型
resultMap 标签可以建立查询的列名和实体类的属性名称不一致时建立对应关系。从而实现封装。在 select 标签中使用 resultMap 属性指定引用即可。同时 resultMap 可以实现将查询结果映射为复杂类型的 pojo,比如在查询结果映射对象中包括 pojo 和 list 实现一对一查询和一对多查询。
4.2.1定义resultMap
type 属性:指定实体类的全限定类名
id 属性:给定一个唯一标识,是给查询 select 标签引用用的。
id标签:用于指定主键字段
result 标签:用于指定非主键字段
column 属性:用于指定数据库列名
property 属性:用于指定实体类属性名称
4.2.2映射配置
4.2.3测试结果
第五章SqlMapConfig.xml配置文件
5.1配置内容
5.1.1 SqlMapConfig.xml 中配置的内容和顺序
5.2 properties(属性)
在使用 properties 标签配置时,我们可以采用两种方式指定属性配置。
5.2.1第一种
5.2.2第二种:
5.2.2.1在classpath下定义db.properties
5.2.2.2properties标签配置
5.2.3此时我们的dataSource标签就变成了引用上面的配置
5.3typeAliases(类型别名)
在前面我们讲的 Mybatis 支持的默认别名,我们也可以采用自定义别名方式来开发。
5.3.1自定义别名
5.4mappers(映射器)
5.4.1
使用相对于类路径的资源如:
5.4.2
使用mapper接口类路径
如:
注意:此种方法要求 mapper 接口名称和 mapper 映射文件名称相同,且放在同一个目录中。
5.4.3
注册指定包下的所有 mapper 接口
注意:此种方法要求 mapper 接口名称和 mapper 映射文件名称相同,且放在同一个目录中。