- Mybatis 特点
- 开源的优秀的持久层框架
- SQL 语句与代码分离
- 面向配置的编程
- 良好支持复杂数据的映射
- 动态SQL
- Mybatis 环境搭建
- 下载
- 导入mybatis.jar
- 配置Log4j 可以打印出SQL,必须把Log4j的日志级别改为 DEBUG 才能打印出SQL,如:
- log4j.rootLogger = DEBUG,Console
- #Console
- log4j.appender.Console = org.apache.log4j.ConsoleAppender
- log4j.appender.Console.Layout = org.apache.log4j.PatternLayout
- log4j.appender.Console.Layout.ConversionPattern = %d [%t] %-5p [%c] - %m%n
- log4j.logger.java.sql.ResultSet = INFO
- log4j.logger.org.apache = INFO
- log4j.logger.java.sql.Connection = DEBUG
- log4j.logger.java.sql.Statement = DEBUG
- log4j.logger.java.sql.PreparedStatement = DEBUG
- Mybatis 的工作流程
- 概述
- 读取基本配置文件(包含连数据库的相关信息)
- 生成SqlSessionFactory
- 建立Session
- 调用 Mybatis 的 API
- 查询Map配置
- 返回结果
- 关闭 SqlSession
- 配置文件(基本配置文件与Mapper配置文件)
- 增删改操作相关配置
- Insert
- Delete
- Update
- 简单查询
- id :在命名空间中唯一的标识符,可以用来引用这条语句
- parameterType:将会传入这条SQL语句的参数类的完全限定名或别名
- parameterMap:这是引用外部parameterMap的已经废弃的方法,使用内联参数映射和ParameterType属性。
- resultType:从这条语句返回的期望类型的类的完整限定名或别名,注意集合情形,那应该是返回集合的泛型类,而不是集合类,resultType和resultMap不能同时使用
- resultMap:命名引用外部的resultMap,返回Map是Mybatis最具有力量的特征,能够解决许多复杂映射的情形,如多表联查
- flushCache:刷新缓存,设置为true的话,不论是什么语句都会清空缓存,默认为false
- useCache:设置为true,会导致本条语句的结果被缓存,默认为true
- timeout:设置查询等待数据库返回结果超时的时间,超时会抛出异常,默认不设置,交给驱动器去处理
- fetchSize:设置每次批量查询返回结果的行数,默认不设置
- statementType :是否预处理,默认预处理
- STATEMENT 非预编译
- PREPARED 预编译
- CALLABLE 存储过程
- 增删改操作相关配置
- 通过配置文件建立 SqlSession,SqlSessionFactory
- SqlSessionFactory 的生命周期是应用级的,随着应用的开启和关闭而开启和关闭
- SqlSession的生命周期是过程级别的
- 概述
- Mybatis 高级查询
- 关联查询
- 联合查询
- 构造查询
- 子查询
- 集合查询
- 鉴别器
- 关联查询
- 动态SQL
- if标记
- 如:
- <if test=“money!=null">
- and money = #{money}
- </if>
- <if test=“money!=null">
- 如:
- choose标记(类似于Switch)
- 如:
- select * from user where 1=1
- <choose>
- <when test=“userName!=null">
- and userName = #{userName}
- </when>
- ...
- <otherwise>
- and password is not null
- </otherwise>
- <when test=“userName!=null">
- </choose>
- <choose>
- select * from user where 1=1
- 如:
- where标记
- 智能条件,相比之下,他不需要where 1 = 1,如:
- select * from user
- <where>
- <if test=“money!=null">
- money = #{money}
- </if>
- <if test=“userName!=null">
- userName = #{userName}
- </if>
- <if test=“money!=null">
- </where>
- 智能条件,相比之下,他不需要where 1 = 1,如:
- set标记
- 用于update操作,智能去除逗号,如:
- update user
- <set>
- <if test = “userName!=null”> userName = #{userName},</if>
- <if test = “userPass!=null”> userPass = #{userPass},</if>
- </set>
- 用于update操作,智能去除逗号,如:
- trim标记,格式化标记,可以与其他标记混合使用完成where与set的功能
- prefix:前缀增加
- suffix:后缀增加
- prefixOverrides : 自动判断前缀
- suffixOverrides :自动判断后缀
- 代替set,如:
- <trim prefix=“set” suffix=“where id = #{id}” suffixOverrides=“,">
- <if test=“userName!=null">
- userName = #{userName}
- </if>
- ……
- <if test=“userName!=null">
- </trim>
- <trim prefix=“set” suffix=“where id = #{id}” suffixOverrides=“,">
- 代替set,如:
- foreach
- 属性描述
- item : 每一次迭代结果
- collection :循环集合或者指定类型
- separator :元素之间的分隔符,可选
- open :开始符号,可选
- close :关闭符号,可选
- index :list和数组的序号,可选
- 循环查询,如:
- <foreach item=“item” index=“index” collection=“list” open+”(“ close=“)” separator=“,">
- #{item}
- </foreach>
- <foreach item=“item” index=“index” collection=“list” open+”(“ close=“)” separator=“,">
- 循环赋值
- insert 中的foreach,使用集合一次增加多个用户,如:
- insert into user (userName,userPass) values
- <foreach item=“item” index=“key” open=“” close=“” separator=“,">
- (#{userName},#{userPass}),
- </foreach>
- insert 中的foreach,使用集合一次增加多个用户,如:
- 属性描述
- if标记