**
mybatis
**
mybatis是一个数据持久层的框架;
框架:就是一个软件的半成品;一个框架中包含了多个组件;
表现层->控制层->业务层->持久化层->db
jsp struts2 spring hibernate
easyUI sprintMVC mybatis
extjs
mybatis
mybatis是一个持久层的框架,它支持动态sql,存储过程以及高级映射;它几乎消除了所有的jdbc代码;
第一个mybatis程序;
导包;(框架包及依赖包)
写配置文件;(核心配置文件 及映射文件)
在src下的某个包中编写Configuration.xml
在src下的包中编写DutyMapper.xml
编写测试代码;
SqlSession:会话(我们的程序和mybatis之间的会话)
项目的分层
jsp:表示层;
servlet:控制层;
service:业务层(包含多个数据操作,在此层控制事务);
dao:数据访问层(对数据库的原子操作;CURD)
dao的实现方式;
dao类 + 映射文件
dao接口+ annotation配置;
1.在接口的每个方法上加入对应的注解(sql语句)
2.在核心配置文件中,通过package标记注册接口所在的包;
dao接口+xml配置;
xml映射文件中的每个sql的id与接口中的方法一致,参数及返回值一致;
xml映射文件的namespace应与接口名相同(包含包名)
在核心配置文件中,注册该xml映射文件
PS:2和3都可以生成dao 对象;
2和3方式中可以通过 SqlSession.getMapper(接口类型)方法来获得生成的dao;
Mybatis的配置文件 ;
核心配置文件 :只有一个
映射文件 :多个,通常每个表对应一个
核心配置文件
一个mybatis工程只需要一个核心配置文件 ,这个配置文件中包含
mybatis的一些通过配置;例如:
数据库连接;*
加载的映射文件;*
通用选项配置;
类的别名等;
核心配置文件中的配置项
properties;
setting:设置(功能开关)
typeAliases:类型的别名
environments:环境配置:
数据库连接信息;数据库连接池;
事务处理
数据库处理的步骤
1.打开连接;
2.操作数据库
3.断开连接;
log4j
这是一个使用最广泛的日志处理组件;
目前,基本所有的框架都支持log4j
使用方法:只需要将定义好的log4j.properties文件放置到src的根目录即可;
映射文件的编写;
select 标记:用来定义查询语句;
属性:id:语句的唯一标识;
resultType:返回值的类型,如果是一个集合,这个值代表集合中的类型;map
parameterType:参数类型,最多有一个(如有多个,可封装到vo或map)
StatementType:执行sql语句的接口类型,有三个可选值 STATEMENT,PREPARED,CALLABLE,默认是PREPARED
insert标记
作用:用于插入;
获得生成的主键的方式:
如果数据库本身支持自动增长,则可以使用insert标记的useGeneratedKeys和keyProperty属性;
如果数据库本身不支持,可以使用selectKey子标记来获得主键值;
select max(accountid)+3 from account
update和delete (没有特殊的属性)
sql标记
用于包含一些重复使用的sql片断;通过include标记可以引入它;
select accountid,name,remain from account
<include refid="select"/>
空值的处理
#{property,javaType=int,jdbcType=NUMERIC}
#{name,javaType=string,jdbcType=VARCHAR}
与数据库及驱动有关;如果数据库不允许,则可以使用此方式插入空值;
字符串替换
属性名;注意,这种写法应该通过vo或map来传值;高级映射可以通过自定义映射类型来实现高级映射;实现步骤;定义一个resultMap标记;有两个属性id,type一定要有;此标记中可以使用id,result,collection(一对多),association(多对一)等子标记;可以能过select标记来使用resultMap,(通过resultMap属性指定映射类型id)和 #有什么区别?
:是用于字符串的替换;通常在orderby{name}时使用;但它会引发sql注入的风险;因此这个值最好避免由用户直接输入;
#{}:用来给ps赋值;
多个参数;
可以在dao接口中为每个参数增加一个@Param注解,这样,在映射文件中就可以通过注解上的名称来获得多个参数;例如;
public void insert(@Param(“name”) String name,@Param(“a”) int remain);
多对一映射;
可用于一对一,和多对一;
作业要求;
一对多表的CURD;
Jquery(ajax)->JSP->JSTL/EL->Servlet>service->dao->mybatis->(mysql/oracle)
动态Sql
sql语句不是固定的,有时需要根据用户的请求,动态生成不同的sql语句,通过mybatis的一些标记可以有效的解决这类问题;
if,where,trim,choose,foreach
if:用来判断某个表达式是否成立
choose:也是用也判断,只是增加一个 else项;
where:条件标记,用它可以动态的删除多余的and ,or,where
set:用来执行update语句的动态标记,用它可以删除后缀,号;
trim:可以删除任何前缀及后缀
四个属性:
prefix:增加前缀
suffix:增加后缀
prefixOverrides:去掉第一个符号
suffixOverrides:去掉最后一个符号;
foreach:用于循环
collection:需要迭代的集合,List类型使用list,数组类型使用array,
item:遍历到的当前元素;
open:前缀
close:后缀
seperator:分隔符
index:索引