mybatis第一阶段
什么是mybits
mybits是apache的一个持久层的框架,之前叫做ibatis,后来代码迁移到google code上,现在代码是在github上.
MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatement、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。
Mybits的入门
- 企业建包的时候实体类用
pojo而不用domain,原因是domain不规范,只能测试用,正式的是pojo
JDBC中存在的一些问题
- 频繁创建释放资源,比较浪费
- sql语句在代码中硬编码不利于维护
- 传入参数硬编码在代码中不利于维护
- 遍历结果硬编码不利于维护
- 复习JDBC
- 加载数据库驱动
- 创建并获取数据库链接
- 创建jdbc statement对象
- 设置sql语句
- 设置sql语句中的参数(使用preparedStatement)
- 通过statement执行sql并获取结果
- 对sql执行结果进行解析处理
- 释放资源(
resultSet、preparedstatement、connection)
Mybatis的架构
mybatis配置
SqlMapConfig.xml ,此文件作为mybatis的全局配置文件,配置了mybatis`的运行环境等信息。mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。
通过
mybatis环境等配置信息构造SqlSessionFactory即会话工厂- 由会话工厂创建
sqlSession即会话,操作数据库需要通过sqlSession进行。sqlSession线程是不安全的,所以把他最好放在局部方法中 mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。

Mybatis的使用
- 下载jar包在github上,核心包跟依赖包,还需要连接数据库的包
https://github.com/mybatis/mybatis-3/releases - 创建一个congif的文件夹,创建核心配置文件
- pooled:mybatis的连接池
- 创建映射文件
- namespace命名空间:
- 引入约束:
入门程序:
手动引入log4j跟以前的不一样:
123456# Global logging configurationlog4j.rootLogger=DEBUG, stdout# Console output...log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n需求:
- 根据用户id查询用户
- 根据用户名模糊查询用户信息列表
- 添加用户
- 修改用户
- 删除用户
核心配置文件约束:
|
|
- 映射配置文件约束:
|
|
根据用户id查询用户
- 外部资源文件
jdbc.properties
|
|
- 编写核心配置文件
|
|
- 编写映射配置文件
namespace:命名空间,用于隔离sql语句,后面会讲另一层非常重要的作用。id:sql语句的唯一标识parameterType: 指定传入参数类型resultType:指定返回值类型#{}占位符, 起到占位的作用, 如果传入的参数类型为简单类型(String, double, long, boolean,integer等), 那么#{}中的变量名称可以随便写
|
|
- mybatis框架需要加载映射文件,将Users.xml添加在SqlMapConfig.xml,如下:
|
|
- 测试:
|
|
根据用户名字模糊查询用户信息
如果查询结果返回集合, 那么可以调用selectList方法, selectList方法返回的结果就是一个集合, 那么mybatis不知道里面的泛型是什么,所以需要配置泛型的类型${}拼接符, 作用是字符串原样拼接, 如果传入的参数是简单类型(String, double, long, boolean,integer等),那么${}中的变量名称必须是value
-注意: 如果使用${}拼接符有可能造成sql注入的风险
映射配置文件
123<select id="findUserByUserName" parameterType="java.lang.String" resultType="cn.itcast.pojo.User">select * from user where username like '%${value}%'</select>测试
|
|
插入用户
- 配置文件
|
|
- 测试
|
|
自增主键返回
- 通过修改sql映射文件,可以将mysql自增主键返回:
|
|
Mysql使用 uuid实现主键
- 需要增加通过select uuid()得到uuid值
- 注意这里使用的order是“BEFORE”
|
|
修改
- 配置文件
|
|
- 测试
|
|
删除
- 配置文件
|
|
- 测试
|
|
核心配置文件加载映射文件的几种方式:
mappers里面配置:
mapper
- url:不推荐使用, 因为如果配置url就要写映射文件的绝对路径, 这样部署到linux系统的时候需要更改, 所以不方便
- resource:映射文件的相对路径
- class:接口的全路径名:一般动态代理开发的时候使用这种方式
- 1.要求接口文件和映射文件在同一个目录下
- 2.要求接口文件和映射文件除扩展名外名称必须完全一样
package:通过包扫描的方式批量引入mapper,name:指定包的路径名称
<package name="cn.itcast.mapper"/>
Dao的生成方式
原生dao开发
需要程序员编写dao接口跟实现类
编写接口DAO
123456public interface UserDao {public User findUserbyId(Integer id);public List<User> findUserByName(String userName);}实现类
|
|
- 测试:用单元测试的@Before注解,先把SessionFactory实例化
|
|
动态代理的开发方式
需要程序员编写dao接口,实现类由Mybaits生成
- 一般就不用dao作为包名了,用 mapper
接口
1234public interface UserMapper {public User findUserById(Integer id);public List<User> findUserByUserName(String name);}配置文件
1234567891011121314<mapper namespace="cn.itcast.mapper.UserMapper"><!--id:sql语句的唯一标识parameterType: 指定传入参数类型resultType:指定返回值类型--><select id="findUserById" parameterType="int" resultType="cn.itcast.pojo.User">select * from user where id=#{id}</select><select id="findUserByUserName" parameterType="java.lang.String" resultType="cn.itcast.pojo.User">select * from user where username like '%${value}%'</select></mapper>
动态代理dao开发方式规范:
- 映射文件中namespace必须等于接口的全路径名称
- 映射文件中的sql语句id必须等于接口中的方法名称
- 映射文件中传入参数类型parameterType指定类型, 必须等于接口中方法的传入参数类型
- 映射文件中的返回的结果集类型必须等于接口方法的返回值类型
- 引入映射文件的时候用
<package class="mapper"/>
生成的实现类在内存中找不到,
SqlMapConfig.xml文件说明
配置的时候各个配置是有顺序的,不匹配会报错
- properties :里面有resourse意思是引入配置文件例如JDBC的用户名跟密码
- typeAliases:给单个类起别名
- typeAlias
<typeAlias type="cn.itcast.pojo.User" alias="user"/>- type: 起别名的pojo的全路径名
- alias: 自定义的别名
- package:使用包扫描的方式批量给整个包下面的pojo起别名
<package name="cn.itcast.pojo"/>- name:包的全路径名称
- 别名就是类名, 不区分大小写, 推荐根据java命名规则来使用别名
- typeAlias
#{}和${}的区别
#{}表示一个占位符号- 通过
#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换 #{}可以有效防止sql注入。#{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。
- 通过
${}表示拼接sql串,例如模糊查询的时候使用- 通过
${}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换 ${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value。
- 通过
parameterType和resultType
parameterType:指定输入参数类型,mybatis通过ognl从输入对象中获取参数值拼接在sql中。resultType:指定输出结果类型,mybatis将sql查询结果的一行记录数据映射为resultType指定类型的对象。
测试类中的selectOne和selectList
selectOne查询一条记录,如果使用selectOne查询多条记录则抛出异常:
|
|
- selectList可以查询一条或多条记录。
hibernate和mybatis区别:
- hibernate:
- hibernate是一个orm框架,需要编写hql语句,自动化程度高,但是学习成本也高,使用复杂,但是写代码效率高,开发速度快.
- 使用场景:一般外包公司使用较多,因为开发速度快,一些传统项目也在用,oa,crm,erp
- mybatis:
- mybatis不是一个完全的orm框架,需要编写sql语句,学习成本低,比较简单。
- 使用场景:在互联网企业用的一般都是,电商,互联网金融等。