mysql登录 password ‘root’
1.三层架构
表现层:
用于展示数据的
业务层
是处理业务需求的
持久层
是和数据库交互的
2.持久层技术解决方案
jdbc技术
Connection
PreparedStatement
ResultSet
Spring的JdbcTemplate
Spring中对jdbc的简单封装
Apache的DBUtils
也是对Jdbc的简单封装
JDBC是一个规范而不是一个框架;spring和apache的都只是一个工具类 不是框架
3. mabatis概述
是一个基于java的持久层框架,内部封装了jdbc
内部封装了jdbc操作的很多细节,开发者只需要关注sql语句本身,而不需要关注注册驱动,创建链接等过程
他实现了orm(object relational mapping对象关系映射)思想 实现了结果集的封装
4. mybatis hello world
-
配置mybatis核心配置文件 需要加上时区设置serverTimezone=UTC
-
编写mybatis工具类 下图中有一个错误
-
编写代码
实现类
属性和列表的属性相同,并且有相关的get,set方法和tostring方法
dao接口
接口实现类
- 测试:
可能遇到的问题:配置文件没有注册直接放在resources里面;绑定接口错误 命名空间出错,返回类型需要写全路径。
步骤
工具类 配置文件 实体类(接受对象) 接口 xml写获取的方法
5. 增删改查
注意 增删改需要提交事务 sqlsession.commit()
在实现接口的xml文件中,namspace就是对应的接口的全路径文件名
id是要实现的方法名,type写全路径 内容是具体的查询命令
查询特定:
传入参数使用parameterType 限定类型,然后在下方命令中用#{}写入参数;
增加
修改
删除
注意点:
resource中绑定mapper路径要用/;namespace中要用.
使用map进行查找,把参数type变成map,然后上面参数中的#{id},就可以变成#{map的键}
1. 模糊查询 方法一 在java中使用通配符
- 方法二在sql中拼接使用
6. 配置解析
环境配置
配置环境可以有多套,更改default就可以完成切换
事务管理器有两种 jdbc和managed
数据源 ( 连接数据库dbcp,c3p0 druid)
有三种内建的数据源类型,也就是UNPOOLED(查询一次连接一次),POOLED UNDI
属性
可以使用properties属性来引用配置文件 进行动态替换,可以在典型的java属性文件中配置,也可以通过properties元素的子元素来进行传递
编写一个配置文件
在核心配置文件中引入可以在内部加属性
类型别名
<typeAliases><typeAlias type="" alias=""> </typeAliases>单个设置
<typeAliases><package name=""> </typeAliases>
扫描实体类的包,别名就是小写的类型
在实体类前面用@Alias注释可以自定义
设置
cacheEnable
lazyloading
useGeneratekeys
mapUnderscoreToCamelCase 自动驼峰命名转换
日志选择
映射器
方式一 resource=
方式二 使用class类型绑定
接口和mapper配置文件需要同名并且在通过一个包下
方式三 使用扫描包进行注入
和上面的一个 也是需要同名的,接口类的名称和配置文件的名称
7 resultmap结果集映射
解决属性名和字段名不一致的问题
可以直接起别名
更好用的是使用resultMap
8 日志
8.1 日志工厂 在核心配置文件中进行配置
slf4j
log4j 需要掌握
什么是log4j
是一个apache的开源项目,可以控制日志信息输送的目的地是控制台,文件或者gui组件
可以空值每一条日志的输出格数
定义每一条日志信息的级别,能够更加细致的控制日志的生成过程
通过一个配置文件来灵活的进行配置,而不需要修改应用的代码
使用
-
导入包
-
log4j.properties
-
配置log4j为日志的实现 在mybatis配置中
-
log4j的实现
直接测试运行
简单使用
1 在要使用的地方导包 apache 的log4j
2 日志对象 static Logger logger=Logger.getLogger(test.class);
3 日志级别 info debug error
stdout_logging 掌握
标准日志输出
9 分页
9.1 limit 分页:
select * from user limit from,end 如果只给了一个参数 那么就是数量
9.2 RowBounds实现分页 性能较差 不建议使用
在代码中 sqlsession.celectList(“方法名(全限定)” )重载实现
分页插件 mybatis pagehelper 了解即可
10 使用注解开发
-
在接口中直接使用注解来完成
-
在核心配置文件中绑定接口
简单的可以这样做 最好还是要用xml文件来进行配置使用 底层使用的主要就是反射
10.2 mybatis执行流程
10.3使用注解完成增删改查
在sessionfactory中opensession设置参数为true就可以完成事务的自动提交
使用注解的时候参数的注入
接口的绑定不能忘记
#{}和${}的区别
#{}相当于占位符 会自动对传入的字符串数据加以对单引号,可以避免sql注入
#{}可以接受简单类型值或者pojo属性值
${}传入的数据直接显示在生成的sql中,就是一个简单的拼接 order by ${id},如果传入的值是id,则解析成的Sql为order by id。
11 lomlok
how to use
-
在idea中安装插件
-
导入架包在pom.xml中
-
注解在类之前
@data 包含有参无参构造函数,getset方法,hashcode,tostring,equals
显式写了有参的话,默认就没有无参,需要显示注明
12 多对一 、一对多
多表查询 多对一
根据查询嵌套处理
按照结果嵌套处理
一对多查询
方法二
javatype和oftype:
oftype用来指定映射到list或者集合中的pojo的类型,泛型中的约束类型
javatype用来指定实体类中属性的类型
13 动态sql
根据不同的条件生成sql
if
13.1 一些语法
- trim(where set)
where
set是在更新的时候使用的,用来动态包含需要更新的列,而舍弃其他的
trim
2. choose、when、otherwise
3.
- foreach
应用场景
对一个集合进行遍历,通常是在构建in条件语句的时候 一般不需要用取index下标
实际使用
测试
SQL片段
有的时候,会将一些公共的部分抽取出来方便复用
使用sql标签抽取公共的部分,在需要使用的地方用include标签引用
注意事项:最好基于单表来定义sql片段 不要使用where标签
14 缓存
14.1 一级缓存
也叫本地缓存 sqlsession 默认开启 在一个sqlsession期间有效,相当于一个map
在和数据库的同一次会话期间查询到的数据会放在本地缓存中
之后如果需要获取相同的数据,直接从缓存中取 而不是再去查询数据库
缓存失效的情况
更新完数据(增删改操作可能会改变原来的数据)
查询不同的mapper
手动清理缓存 sqlsession.clearCache()
14.2 二级缓存
二级缓存的开启只需要在xml中写一个
需要将实体类序列化,否则会报错
二级缓存在同一个mapper中有效
所有的数据都会先放在一级缓存中
只有当绘会话提交的时候或者关闭的时候才会被提交到二级缓存中
14.3 缓存原理
14.4 ehcache的使用
导包 mybatis-ehcache