- Mybatis概述
- 开源轻量级orm持久层框架
- 支持普通sql查询,存储过程和高级映射的优秀持久层框架,内部封装了jdbc,在开发时只需要关注sql语句即可
- 可以使用注解或者xml来配置和映射原生信息,并通过注解或者xml的方式将各种要执行的statement配置起来
- Mybatis的优缺点:
优点:基于sql语句编程,减少了代码量,并且可以和各种数据库兼容,能够和spring很好的集成
缺点:sql语句编写量大,sql语句依赖于数据库 - #{ }和KaTeX parse error: Expected 'EOF', got '#' at position 8: { }区别:
#̲{ }是预编译处理 ,{ }是字符串替换(用于传入数据库对象):两者都可以接受简单数据类型和pojo属性值,能用#{}的就别用KaTeX parse error: Expected 'EOF', got '#' at position 14: {}
Mybatis在处理#̲{ }时会将#{}变成?,而在…{}时就是把${}替换成变量的值
#{}可以有效地防止sql注入(对传入的字符串加一对单引号)
比如 select * from user where username = #{username} ,传入的username为小张,那么最后打印出来的就是
select * from user where username = ‘小张’
如果parameterType传输单个简单类型值,#{}括号中可以是任意名称。
将传入的数据直接显示生成在sql中,只是进行了简单的拼接如果parameterType传输单个简单类型值,{ }将传入的数据直接显示生成在sql中,只是进行了简单的拼接 如果parameterType传输单个简单类型值,将传入的数据直接显示生成在sql中,只是进行了简单的拼接如果parameterType传输单个简单类型值,{}括号中只能是“value”这个字符串 - 模糊查询like语句怎么写:在java代码中添加sql通配符
- 在mapper中如何传递多个参数:
① 使用@param注解,#{}里面的名称对应的是注解@param括号里面修饰的是名称 (适用于参数不多的情况下)
② Map传参法#{}里面对应的是map里面的key名称(该方法适用于多个参数,参数易变且灵活传递的情况)
③ Javabean方法:#{}里面对应的是username里面的成员属性(这个方法很直观,但是需要创建一个实体类,并且扩展不容易,且需要添加属性) - 根据数据库,进行单表查询
① 实现用户id查询一个用户:Select * from user where id = 1
② 功能需求:根据性别和名字查询用户
SELECT id, username, birthday, sex, address FROMuser
WHERE sex = 1 AND username LIKE ‘%张%’
③
④ 根据用户名模糊查询用户列表:select * from user where username like %王%
⑤ 功能需求:查询用户表数据条数
Sql语句:SELECT count(*) FROM user
⑥ 如果查询返回的结果又多个,mybatis会自动把返回的结果放在list容器中
⑦ 如果传入的是简单数据类型,${}里面必须写value字符串 - mybatis多表查询
一对多
-
Parametertype和resultype
parameterType:指定输入参数类型
resultType:指定输出结果类型, -
Selectone和selectlist
selectOne查询一条记录
selectList可以查询一条或多条记录 -
实现向数据库中添加用户
使用的Sql:
INSERT INTO USER (username,birthday,sex,address) VALUES
(‘黄忠’,‘2016-07-26’,‘1’,‘三国’) -
Mysql自增主键返回
查询Mysql自增id的Sql:SELECT LAST_INSERT_ID() -
修改用户
根据用户id修改用户名
使用的Sql:UPDATE USER SET USERNAME = ‘赵云’ WHERE ID= 1 -
删除用户
根据用户id删除用户
使用的Sql:DELETE FROM USER WHERE ID = 1 -
Mybatis解决原生jdbc编程的问题
-
频繁创建、释放数据库连接造成系统资源浪费,影响系统性能。使用数据库连接池技术可以解决此问题。
解决:在SqlMapConfig.xml中配置数据连接池,使用连接池管理数据库连接。 -
Sql语句写在代码中造成代码不易维护,实际应用中Sql变化的可能较大,Sql变动需要改变java代码。
解决:将Sql语句配置在XXXXmapper.xml文件中与Java代码分离。 -
向Sql语句传参数麻烦,因为Sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应(硬编码)。
解决:Mybatis自动将Java对象映射至Sql语句,通过statement中的parameterType定义输入参数的类型。 -
对结果集解析麻烦(查询列硬编码),Sql变化会导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成Pojo对象解析比较方便。
解决:Mybatis自动将Sql执行结果映射至Java对象,通过statement中的resultType定义输出结果的类型。 -
Mybatis的两种dao的开发方式
原始dao开发方法:需要程序员编写dao的接口和dao的实现类
Mapper动态代理开发方法:只需要编写一个mapper接口,mybatis会根据接口定义创建接口的动态代理对象,代理对象的方法同dao接口实现类中的方法 -
Mapper动态代理方式实现dao源码分析
-
Mybatis输入类型和结果类型:
Parametertype输入类型
Resutype输出结果类型 -
延迟加载(使用Assocation或者Collection实现 )
在需要数据的时候进行加载,不需要的时候就不加载,也称之为懒加载
好处:先从单表查询,需要时再从关联表进行关联查询,提高数据库性能
坏处:因为是在需要时加载,在大批量查询时会造成用户等待时间过程变长降低用户的体检 -
Mybatis缓存
通过缓存策略来减少数据库的查询次数,从而提高性能
Mybatis中分为一级缓存:sqlsession范围级别的缓存,只要sqlsession没有flush或者close,他就存在
二级缓存:mapper映射级别的缓存,多个sqlsession操作同一个mapper映射的sql语句多个sqlsession可以共用二级缓存,二级缓存是夸sqlsession的 -
Mybatis的注解
@select, @delete, @update, @insert