框架
框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种定义认为,框架是可被应用开发者定制的应用骨架。前者是从应用方面而后者是从目的方面给出的定义。
可以说,一个框架是一个可复用的设计构件,它规定了应用的体系结构,阐明了整个设计、协作构件之间的依赖关系、责任分配和控制流程,表现为一组抽象类以及其实例之间协作的方法,它为构件复用提供了上下文(Context)关系。因此构件库的大规模重用也需要框架。
一个框架就是解决特定问题
MyBatis:数据持久层框架(Hibernate,Spring Data),替换JDBC和DbUtils
SpringMVC:MVC框架(Struts2),替换Servlet
分布式框架:Spring Cloud ,Dubbo
权限管理框架: Shiro ,Spring Security
对程序员来说,一个框架就是:jar 源码 帮助文档 实例代码
使用一个框架的流程:获取jar包 导入jar包 查看帮助文档 实例代码。
2.MyBatis:
数据持久层框架(Hibernate,Spring Data),替换JDBC和DbUtils
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。

MyBatis01-基础用法。
3.入门程序
jar包(桌面上有)
mybatis核心jar包和依赖jar包,mysql数据库驱动包(底层还是使用原始JDBC)
这个connector来自于数据库连接包,在其他项目中拷贝的。
创建数据库
id:自动增长
实体类
DAO接口
配置文件
映射文件
约束文件
这张图上的内容,在Mybatis里面的说明文件里面有,规定了约束文件的格式。
主配置文件
同样的,这张图也来自说明文件,直接复制头即可
DAO实现类
测试类
注意,这里的测试文件不需要再此导入junit包,@te直接可以获取mybatis提供的测试包。
添加日志配置文件
MyBatis中可以通过指定命名空间的名字:只输出当前命名空间的代码在执行过程中相关的日志输出信息
若配置文件没有提示的解决方法
namespace的作用:
关联配置日志输出
不同的映射文件namespace必须唯一
不同namespace中有同名的方法,必须使用全限定名
类权限定名可以使用别名配置
#和$的区别
JDBC Statement和PreparedStatement的区别
MyBatis02-使用工具类来优化实现类。
创建工具类 核心是SqlSession,注意都是静态Static 方法。
以 后所有的SqlSession 都由工厂创建 调用这个方法即可。
有了这个工具类,再写实现类的时候就可以直接调用了
插入一个id自增长的学生,如何查询他的id是多少?
@@identity:MySql 定义的一个系统变量。获取上一次添加语句的自动增长的主键值。
这样的话主键就出来了。
以后在执行增删改查的时候,
添加一个接口,多一个实现类,然后配置文件里面再多配置一句sql语句
接口:
实现类:
配置文件:
在配置文件里,直接 ‘<’ 就可以选择标签,插入就用insert 删除就delete。
实现类的。update .insert .delete根据需要改变
查询
查询用这个
如果是查询,返回值的类型一定要写。增删改写不写看自己需求。使用别名配置
查询所有
查询也可以使用Map
查询的时候,当遇到数据库表的列名 和实体类的属性不一致 怎么办?
使用别名。别名和属性一致即可。
如下图,实体类student 的属性为id name age等,但是表的列名为sid sname之类。
直接查查不出来。所以写别名
另一种方法:使用映射转换器。指定属性和列的对应关系的映射转换器。
MyBatis03-使用Mapper的动态代理:
不再需要接口的实现类了。
1.修改主配置文件。(之前是在dao的impl里面,现在直接在dao里面了)
2.修改mapper的头文件
测试类里面:
插入测试,需要提交(之前写在DAO里)
注意:动态代理不能查询返回值为Map的方法。
因为底层只会调用selectOne 或者selectlist。所以如果是map的话返回值不对。
(底层会自动判断,若不是list就用selectOne了)
按照姓名进行模糊查询
若按照我们的写法
发现不能查询,因为这个MyBatis框架不认这个写法。
做模糊查询应该使用下面的方法:
前后两个百分号
这样就成功了。
另外一种方法:使用 sql 的拼接语句concat:
多参数查询
多参数查询之参数为map
动态代理虽然不支持返回值是map,但是支持参数是map
若查询的参数是map,
图为mapper配置文件的内容
测试类的写法:
传入值为map的第二种写法:
测试类:
传入值为int 和String的查询
查询:
显然行不通
应该改成 0 和 1(位置占位符)
成功:
传入值为一个string 和一个对象
mapper:
多参数的时候,若用0 1 2 不方便—添加注解
dao:
mapper:
同样的,也可以给一个对象加注解。、
那么。什么情况下会用到上面这种?
比如 分页。 等传入多个参数的情况。
多条件查询之动态参数
如上图,之前用到的多条件查询,查询的参数也不一样,在框架里面如何使用?
查询name为%""%,age=11的
查询name为%""% 即查询所有
where 1=1的效率问题:当查询条件没有的时候,还是会执行where 1=1 影响效率
解决方法:使用框架的where标签
若没有条件,就什么条件也没有,没有where 1=1了。
若有条件,会自动帮你补
上面的if也可以使用 choose when表现实现。
choose:when: 多选一:选中一个就结束了。不再执行其他的判断
类似c:foreach的循环功能的实现
传入值为一个数组
类似于下面的sql语句:如何实现?
Dao:
mapper:
传入值为一个集合
传入值为一个对象 ,不再是integer
sql重用:在前面sql查询的基础上 重用前一句sql查询的内容。
统计一张表的总条数
select count(*) from student