(1) mybatis数据源的源码解析 xml(environment) > java Environmenthtml
>org.apache.ibatis.session.SqlSessionFactoryBuilder.build(java.io.InputStream)
>org.apache.ibatis.builder.xml.XmlConfigBuilder
>org.apache.ibatis.builder.xml.XmlConfigBuilder.parseConfiguration
>org.apache.ibatis.builder.xml.XmlConfigBuilder.environmentsElement
>org.apache.ibatis.builder.xml.XmlConfigBuilder.dataSourceElement
>org.apache.ibatis.datasource.DataSourceFactory.getDataSource
复制代码
(2) mybatis sql源码解析 sql > MappedStatementjava
>org.apache.ibatis.builder.xml.XmlConfigBuilder.mapperElement
>org.apache.ibatis.builder.xml.XmlMapperBuilder
>org.apache.ibatis.builder.xml.XmlMapperBuilder.parse
>org.apache.ibatis.builder.xml.XmlMapperBuilder.buildStatementFoemContext
>org.apache.ibatis.builder.xml.XmlStatementBuilder
>org.apache.ibatis.builder.xml.XmlStatementBuilder.parseStatementNode
复制代码
(3) mybatis 如何操做数据库 SimpleExecutor 执行器mysql
>org.apache.ibatis.session.defaults.DefaultSqlSessionFactory.openSession
>org.apache.ibatis.session.defaults.DefaultSqlSessionFactory.openSessionFormDataSource
>org.apache.ibatis.session.Configuration.newExcetor
>org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne
>org.apache.ibatis.session.Configuration.getMappedStatement
>org.apache.ibatis.executor.BaseExecutor.queryFormDatabase
>org.apache.ibatis.executor.SimpleExecutor.doQuery
复制代码
① SimpleExecutor是Mybatis执行Mapper语句时默认使用的Executor。它提供最基本的Mapper语句执行功能,没有过多的封装的sql
② ReuseExecutor,顾名思义,是能够重用的Executor。它重用的是Statement对象,它会在内部利用一个Map把建立的Statement都缓存起来,每次在执行一条SQL语句时,它都会去判断以前是否存在基于该SQL缓存的Statement对象,存在并且以前缓存的Statement对象对应的Connection尚未关闭的时候就继续用以前的Statement对象,不然将建立一个新的Statement对象,并将其缓存起来。由于每个新的SqlSession都有一个新的Executor对象,因此咱们缓存在ReuseExecutor上的Statement的做用域是同一个SqlSession。数据库
③ BatchExecutor的设计主要是用于作批量更新操做的。其底层会调用Statement的executeBatch()方法实现批量操做。apache
(1) 属性配置缓存
<properties resource="app.properties">
<property name="jdbc.driver" value="com.mysql.jdbc.Driver"/>
</properties>
复制代码
三种设置方式:bash
①构建sessionFactory 时传递 (优先级:高)session
②基于resource 属性加载 或 url 加载 (优先级:中)mybatis
③基于 属性设置 (优先级:低)
(2) 全局参数设置
<settings>
<setting name="mapUnderscoreToCamelCase" value="true" />
</settings>
复制代码
具体参考:www.mybatis.org/mybatis-3/z…
(3) 环境配置
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED" >
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
复制代码
事物管理器:JDBC|MANAGED
(4) 数据源
unpooled 普通链接,每次获取时都会从新创建一个新的链接.属性下以下:
• driver :数据库驱动类
• url: URL地址
• username:用户名
• password :登陆数据库的密码
pooled: 链接池模式,全部链接从链接池当中获取,由链接池来来进行链接的创建与回收关于等操做,除支持unpooled属性外还支持属性以下:
• poolMaximumActiveConnections : 最大活跃数,默认值:10
• poolMaximumIdleConnections :最大空闲链接数
• poolMaximumCheckoutTime :获取链接超时等待最大(checked out)时间,默认值:20000 毫秒
• poolTimeToWait : 单次获取链接 最大等待时间 默认:20000 毫秒(即 20 秒)。
• poolMaximumLocalBadConnectionTolerance 获取链接重试次数 默认:3
• poolPingQuery 用于检测链接是否断开的测试 语句
• poolPingEnabled 是否经过执行poolPingQuery 语句作检测,默认值:false。
• poolPingConnectionsNotUsedFor 链接检测间隔时间 ,默认60000。
(5) typeAliases 别名配置
<typeAliases>
<typeAlias type="com.niuh.dao"/>
<typeAlias type="com.niuh.dao.UserInfo" alias="UserInfo"/>
</typeAliases>
复制代码
(6) mappers 文件引入
<mappers>
<mapper resource="userInfo.xml" />
<package name="com.niuh.dao"/>
</mappers>
复制代码
基于 mapper 引入指定资源文件: resource| url |class 基于package 引入:扫描指定包路径当下的url
(1) mapper 经常使用元素
select – 映射查询语
insert – 映射插入语句
update – 映射更新语句
sql – 可被其余语句引用的可重用语句块
delete – 映射删除语句
resultMap 用来描述如何从数据库结果集中来加载对象
cache – 给定命名空间的缓存配置
cache-ref – 其余命名空间缓存配置的引用
复制代码
(2) <select>
查询标签 其表示一个查询语句映谢,其简单示例以下: 示例
<select id="selectUser" resultType="com.niuh.mybatis.test.UserInfo">
select * from user_info where id = #{id}
</select>
复制代码
其支持属性以下:
<select
id="selectUser" // statement id
parameterType="int" // 参数类型
resultType="hashmap"// 返回结果类别
resultMap="personResultMap" // 返回结果映射
flushCache="false" //
useCache="true"
timeout="10000"
fetchSize="256"
statementType="PREPARED">
复制代码
参数的引用的办法
#{id, mode=in, jdbcType=INT, jdbcTypeName=MY_TYPE}
复制代码
(3) 示例 标签
<insert id="addUser"
parameterType="com.niuh.mybatis.test.UuserInfo">
INSERT INTO user_info (user_name,nick_name,password) VALUES
(#{userName},#{nickName},#{password})
</insert>
复制代码
<update id="updateUser"
parameterType="com.niuh.mybatis.test.UuserInfo" >
update user_info set user_name=#{userName} where id=#{id}
</update>
复制代码
<delete id="deleteUser" parameterType="int">
DELETE from user_info where id=#{id}
</delete>
复制代码
属性说明:
<insert
id="insertUuser"
parameterType="com.niuh.mybatis.test.UuserInfo"
flushCache="true"
statementType="PREPARED"
keyProperty=""
keyColumn=""
useGeneratedKeys=""
timeout="20">
复制代码
<update
id="updateUuser"
parameterType="com.niuh.mybatis.test.UuserInfo"
flushCache="true"
statementType="PREPARED"
timeout="20">
复制代码
<delete
id="deleteUuser"
parameterType="com.niuh.mybatis.test.UuserInfo"
flushCache="true"
statementType="PREPARED"
timeout="20">
复制代码
(4) 标签 将重复的sql 语句定文为一个字段
<sql id="base_colume"> id,user_name,nick_name</sql>
复制代码
可经过 进行引入 如:
<include refid="base_colume"/>
复制代码
(5) 标签 resultMap 是myBatis 对象的映射
标签 trim (where, set) 标签 foreach 标签
myBatis 专一于sql 自己,其为sql 映谢而非完整的ORM,须要本身编写sql 语句,这是其优势也是缺点。优势是:优化方便,可更好利用sql编写经验。缺点是当数据修改以后调整麻烦耗费时间长.
试用场景:适用于对性能要求较高,有大批量的查询修改,而且业务实现没有过多依懒数据关系模型,好比:电商、O2O等互联网项目。
互联网项目对DAO层的要求:
一、对数据库的访问更新纯粹
二、尽量不要使用数据库作运算
三、SQL语句能够针对性的优化(减小查询字段、查条件排序例 、查询条件尽量命中索引)