RabbitMQ 实现了高级消息队列协议(AMQP)的开源消息代理软件
MongoDB 一个基于分布式文件存储的数据库。介于关系型和非关系型之间
Shiro Java安全框架
FastDFS 分布式文件系统
Memcached 分布式高速缓存系统
Swagger 一个规范和完整的框架,用于生成、描述、调用和可视化RESTful风格的Web服务
CRUD 增加(Create)、检索(Retrieve)、更新(Update)和删除(Delete)
EhCache java分布式缓存
JSP 标准标签库(JSTL)
EL表达式详解
EL的11个内置对象,除了pageContext以外,其他10个内置对象的类型都是java.util.Map类型
未使用El内置对象,查找数据顺序是依次按照由小到大范围 pageContext < request < session < application
EL的内置对象,属性相关 pageScope、requestScope、sessionScope、appliactionScope
EL的其他重要的内置对象:
- pageContext
- param(底层调用request.getParameter()获取请求中的指定参数)
- paramValues(底层调用request.getParameterValues()获取请求中的指定参数的所以值)
- initParm(底层调用ServletContext.getInitParameter()获取初始化参数)
EL访问Bean属性:$ {key.属性}
EL访问数组中的数据:$ {name[5]}、$ {stus[1].sname}
EL获取list中的数据:$ {names[1]} //List底层是数组
EL访问Map:$ {mapObject.name}
狂神说 SSM+SpringBoot
mybatis 3技术文档
MyBatis01
1.创建数据库
2.导mybatis、mysql包
3.编写Mybatis核心配置文件(查看官方帮助文档)
4.编写Mybatis工具类(查看官方帮助文档)
5.创建实体类
6.编写Mapper接口类
7.编写Mapper.xml配置文件
8.编写测试类
MyBatis02
parameterType="map"
<select id="selectUserByNP" parameterType="map" resultType="User">
select * from user where name = #{username} and pwd = #{pwd}
</select>
如果参数过多,我们可以考虑直接使用Map实现,如果参数比较少,直接传递参数即可
除了参数类型为map这种方式,在model类bean对象上添加@Param("代称"),同样可以在sql语句中获取
增、删、改操作需要提交事务
模糊查询
1.在Java代码中添加sql通配符 string wildcardname = “%smi%”;
2.sql语句中拼接通配符(会引起sql注入)select * from foo where bar like "%"#{value}"%"
从MyBatis 3开始,支持接口映射器,允许以Java代码的方式注解定义SQL语句,非常简洁
Mybatis的执行过程
SqlSessionFactoryBuilder 的作用在于创建 SqlSessionFactory,创建成功后,SqlSessionFactoryBuilder 就失去了作用,所以它只能存在于创建 SqlSessionFactory 的方法中,而不要让其长期存在。因此** SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域**(也就是局部方法变量)。
SqlSessionFactory 可以被认为是一个数据库连接池,它的作用是创建 SqlSession 接口对象。生命周期存在于整个 MyBatis 的应用之中,所以可以认为 SqlSessionFactory 的生命周期就等同于 MyBatis 的应用周期。因此在一般的应用中我们往往希望 SqlSessionFactory 作为一个单例,让它在应用中被共享。所以说 SqlSessionFactory 的最佳作用域是应用作用域。
SqlSession 就相当于一个数据库连接(Connection 对象),你可以在一个事务里面执行多条 SQL,然后通过它的 commit、rollback 等方法,提交或者回滚事务。所以它应该存活在一个业务请求中,处理完整个请求后,应该关闭这条连接,让它归还给 SqlSessionFactory,否则数据库资源就很快被耗费精光,系统就会瘫痪,所以用 try…catch…finally… 语句来保证其正确关闭。所以 SqlSession 的最佳的作用域是请求或方法作用域。
MyBatis03:ResultMap及分页
ResultMap
使用结果集映射->ResultMap
<resultMap id="UserMap" type="User">
<!-- id为主键 -->
<id column="id" property="id"/>
<!-- column是数据库表的列名 , property是对应实体类的属性名 -->
<result column="name" property="name"/>
<result column="pwd" property="password"/>
</resultMap>
<select id="selectUserById" resultMap="UserMap">
select id , name , pwd from user where id = #{id}
</select>
标准日志实现
1. 导入log4j的包
2. 配置文件的编写
3. setting设置日志实现
4. 在程序中使用log4j进行输出
5. 测试,看控制太输出
分页
使用Limit实现分页
RowBounds分页(不推荐)
分页插件:pagehelper [github官网](https://pagehelper.github.io/)
MyBatis04 使用注解开发
#与$的区别:
#{} 的作用主要是替换预编译语句(PrepareStatement)中的占位符? 【推荐使用】
${} 的作用是直接进行字符串替换
MyBatis05 一对多和多对一处理
按照查询进行嵌套处理就像SQL中的子查询
<select id="getTeacher" resultType="teacher">
select * from teacher where id = #{id}
</select>
<resultMap id="StudentTeacher" type="Student">
<!--association关联属性 property属性名 javaType属性类型 column在多的一方的表中的列名-->
<association property="teacher" column="{id=tid,name=tid}" javaType="Teacher" select="getTeacher"/>
</resultMap>
按照结果进行嵌套处理就像SQL中的联表查询
<select id="getStudents2" resultMap="StudentTeacher2" >
select s.id sid, s.name sname , t.name tname
from student s,teacher t
where s.tid = t.id
</select>
<resultMap id="StudentTeacher2" type="Student">
<id property="id" column="sid"/>
<result property="name" column="sname"/>
<!--关联对象property 关联对象在Student实体类中的属性-->
<association property="teacher" javaType="Teacher">
<result property="name" column="tname"/>
</association>
</resultMap>
MyBatis06 动态sql
环境搭建、if语句、where、Set、choose、sql片段、foreach。。。
MyBatis07 缓存
MyBatis系统中默认定义了两级缓存:一级缓存和二级缓存
默认情况下,只有一级缓存开启。(SqlSession级别的缓存,也称为本地缓存)
二级缓存需要手动开启和配置,他是基于namespace级别的缓存。
每个sqlSession中的缓存相互独立或者sqlSession相同,查询条件不同,两条SQL语句
只要开启了二级缓存,我们在同一个Mapper中的查询,可以在二级缓存中拿到数据
查出的数据都会被默认先放在一级缓存中,只有会话提交或者关闭以后,一级缓存中的数据才会转到二级缓存中