Mybatis

Mybatis

1. 环境搭建

第一步:导入jar包

第二步:写主配置文件

 

2. 开发步骤

第一步:表

第二步:实体类

第三步:接口

第四步:mapper.xml映射文件(*)

第五步:注册映射文件

第六步:测试

 

3. JUnit单元测试

 

4. mybatis的基本要素

a) 核心对象

SqlSessionFactoryBuilder;//创建工厂,加载核心配置文件.

SqlSessionFactory;//SqlSession工厂,用来创建sqlSession

SqlSession;//SqlSessiond执行sql语句.创建dao接口的代理类.

b) mybatis-config.xml核心配置文件

      运行环境,注册映射.

c) mapper.xml  Sql映射文件

 

5. mybatis-config.xml

properties    可以配置在Java 属性配置文件中

settings    修改 MyBatis 在运行时的行为方式

typeAliases   为 Java 类型命名一个别名(简称)

typeHandlers   类型处理器

objectFactory   对象工厂

plugins   插件

environments   环境

environment   环境变量

transactionManager  事务管理器

dataSource   数据源

mappers    映射器

 

6. Setting设置

cacheEnabled :缓存.

lazyLoadingEnabled: 延迟加载/懒加载.

autoMappingBehavior: resultMap自动映射级别.

 

7. typeAliases 设置别名

<typeAliases>

<package name ="cn.smbms.pojo" />

</typeAliases>

  注意:设置package后,映射文件中的实体类配置都用类名.

    表示package包下的这个类.

    

8. environments

8.1 表示配置MyBatis的多运行环套境,将SQL映射到多个不同的数据库上.

8.2 子元素节点:

a.environment,但是必须指定其中一个为默认运行环境(

通过default指定)

b.transactionManager:事务管理器

<transactionManager type="[JDBC | MANAGED ]" />

c.dataSource:数据源

dataSource元素使用基本的JDBC数据源接口来配置JDBC连接对象的资源

<dataSource type="UNPOOLED|POOLED|JNDI ">

UNPOOLED 不使用连接池

POOLED 使用连接池

JNDI  由JNDI管理

例:

<dataSource type="POOLED">

<property name="driver" value="${driver}"/>

<property name="url" value="${url}"/>

<property name="username" value="${user}"/>

<property name="password" value="${password}"/>

</dataSource>

 

9. mappers 映射器

9.1 引用mapper映射文件

9.2 引用方式

方式一:使用类资源路径获取资源

例:

<!-- 将mapper映射文件加入到系统核心配置文件中 -->

<mappers>

<mapper  resource="cn/smbms/dao/user/UserMapper.xml"/>

</mappers>

方式二:使用URL获取资源

例:

<mappers>

<mapper url="file:///E:/sqlmappers/UserMapper.xml"/>

<mapper url="file:///E:/sqlmappers/ProviderMapper.xml"/>

</mappers>

 

10. SQL映射文件

10.1 SQL映射文件的几个顶级元素

mapper - namespace

cache - 配置给定命名空间的缓存

cache-ref – 从其他命名空间引用缓存配置

resultMap –用来描述数据库结果集和对象的对应关系

sql – 可以重用的SQL块,也可以被其他语句引用

insert – 映射插入语句

update – 映射更新语句

delete – 映射删除语句

select – 映射查询语句

注意:按照定义的顺序

10.2 mapper

namespace:命名空间.(dtd)

namespace和子元素的id联合保证唯一,区别不同的mapper

注意:

namespace的命名必须跟某个接口同名

接口中的方法与映射文件中SQL语句id一一对应

10.3 select

a.查询语句的标签

b.常用属性

id

命名空间中唯一的标识符

接口中的方法与映射文件中的SQL语句id一一对应

parameterType

传入SQL语句的参数类型

resultType

SQL语句返回值类型的完整类名或别名

c. parameterType

基础数据类型

int、String、Date等

只能传入一个,通过#{参数名}即可获取传入的值

复杂数据类型

Java实体类、Map等

通过#{属性名}或者#{map的keyName}即可获取传入值

注意:#{}和${}的区别

${}是原样输出.(可以导致sql注入)

#{}是会给值加入一对双引号.'value'.(建议适用这个)

d. resultMap

<resultMap type="数据类型" id="id">

<result property="d性名" column="数据库列名"/>

<result property="userCode" column="userCode"/>

</resultMap>

注意:resultType和resultMap的区别

resultType :直接表示返回类型

基本数据类型

复杂数据类型

resultMap :对外部resultMap的引用

应用场景:

数据库字段信息与对象属性不一致

复杂的联合查询,自由控制映射结果

e.resultMap的自动映射

前提:字段名与属性名一致

设置级别autoMappingBehavior:

NONE : 禁止映射

PARTIAL:自动匹配所有(没有嵌套association,collection)

FULL: 自动匹配所有.

例:<setting name="autoMappingBehavior" value="FULL"/>

f.属性

id 在命名空间中唯一的标识符,可以被用来引用这条语句

parameterType 将会传入这条语句的参数类的完全限定名或别名

resultType 从这条语句中返回的期望类型的类的完全限定名或别名。注意集合情形,那应该是集合可以包含的类型,而不能是集合本身。使用resultType或resultMap,但不能同时使用

resultMap  命名引用外部的resultMap

flushCache 将其设置为true,不论语句什么时候被调用,都会导致缓存被清空。默认值:false

useCache 将其设置为true,将会导致本条语句的结果被缓存。默认值:true 

timeout  这个设置驱动程序等待数据库返回请求结果,并抛出异常时间的最大等待值。默认不设置(驱动自行处理)

fetchSize 这是暗示驱动程序每次批量返回的结果行数

statementType STATEMENT,PREPARED或CALLABLE的一种。让MyBatis选择使用Statement,PreparedStatement或CallableStatement。默认值:PREPARED

resultSetType FORWARD_ONLY|SCROLL_SENSITIVE|SCROLL_INSENSITIVE中的一种。默认是不设置(驱动自行处理)

 

11. insert(增加)

id

parameterType

例:

<insert  id="add" parameterType="User" >

insert into  smbms_user (userCode,userName,userPassword) 

values ( #{userCode},#{userName},#{userPassword})

</insert>

注意:insert、update、delete元素均没有resultType属性

        默认返回int类型.

 

12. update

例:

<update id ="modify" parameterType="User">

update smbms_user 

set userCode = #{userCode},

         userName = #{userName},

              userPassword = #{userPassword}

                where id = #{id}

</update>

 

13. delete

例:

<delete id ="deleteUserById" parameterType="int">

delete from smbms_user where id = #{id}

</delete>

 

14. mybatis入参方式

@Param注解参数(注解)

封装成对象入参

public int updatePassword(@Param("id")int id,@Param("pwd")String newpwd);

注意:一般情况下:参数超过3个,就用对象.

 

15. resultMap

1)属性

id:resultMap的唯一标识

type:Java实体类

2)子元素

id

一般对应数据库中该行的主键id,设置此项可提高MyBatis性能

result

映射到JavaBean的某个“简单类型”属性

association

映射到JavaBean的某个“复杂类型”属性,比如JavaBean类

collection

映射到JavaBean的某个“复杂类型”属性,比如集合

 

3)association

a.复杂的类型关联,一对一

b.内部嵌套,映射一个嵌套JavaBean属性(对象里面放对象)

c.属性:

property:映射数据库列的实体对象的属性

javaType:完整Java类名或者别名

resultMap:引用外部resultMap

b.子元素

id

result

property:映射数据库列的实体对象的属性

column:数据库列名或者别名

4)collection

a.复杂类型集合,一对多

b.内部嵌套,映射一个嵌套结果集到一个列表(对象里面放list)

c.属性

property:映射数据库列的实体对象的属性

ofType:完整Java类名或者别名(集合所包括的类型)

resultMap:引用外部resultMap

d.子元素

id

result

property:映射数据库列的实体对象的属性

column:数据库列名或者别名

16. MyBatis缓存

1).分类

一级缓存:SqlSession级别的缓存.(在同一个SqlSession中,缓存有效,默认打开)

二级缓存:应用级别缓存(全局缓存,随便在哪里都能取得到.默认是关闭的)

2)打开全局缓存

第一步:配置mybatis核心配置文件

<setting name="cacheEnabled" value="true"/>

第二步:单独开启映射文件的缓存

<cache eviction="FIFO" flushInterval="60000" 

        size="512" readOnly="true"/>

        evication:表示溢出处理机制.

独立设置某一条sql的缓存

<select id="selectAll" resultType="Emp" 

        useCache="true">

17. 动态SQL

17.1 基于OGNL表达式(类似jstl表达式)

17.2 完成多条件查询等逻辑实现

17.3 实现动态SQL的元素

<if>

<where>

<set>

<trim>

<foreach>

<choose>

<when>

<otherwise>

17.4 if

语法:

<if test="条件"></if>

注意:如果判断变量的类型是字符串时,要注意是否需要判断空串.

    例:<if test="userName!=null and userName !=''"></if>

17.5 where

智能处理and或者or.(会去掉where后面的第一个and或者or)

例:

select * from smbms_user

<where>

<if test="uName!=null and uName !=''">

and username  like CONCAT('%',#{uName},'%')

</if>

<if test="uRole != null">

and userRole = #{uRole}

</if>

</where>

17.6 set

智能处理update时的逗号.(会去掉set后面最后个set值的逗号)

例:

update smbms_user 

<set>

<if test="userCode!=null">

userCode = #{userCode},

</if>

<if test="userName!=null">

  userName = #{userName},

</if>

<if test="userPassword!=null">

userPassword = #{userPassword} 

</if>

             </set>

             where id = #{id}

17.7 trim

a.更灵活地去除多余关键字

b.属性:

prefix(前缀)

suffix(后缀)

prefixOverrides(前缀覆盖)

suffixOverrides(后缀覆盖)

c.替换where

<trim prefix="where" prefixOverrides="or|and">

<if test="uName!=null and uName !=''">

and username  like CONCAT('%',#{uName},'%')

</if>

<if test="uRole != null">

and userRole = #{uRole}

</if>

</trim>

d.替换set

update smbms_user 

        <trim prefix="set" suffixOverrides=","  

        suffix="where id = #{id}">

        <if test="userCode!=null">

userCode = #{userCode},

</if>

<if test="userName!=null">

  userName = #{userName},

</if>

<if test="userPassword!=null">

userPassword = #{userPassword} 

</if>

        </trim>

17.8 foreach

a)迭代一个集合,通常用于in条件

b)属性

item  :集合参数

index :下标

collection:必须指定

list  (集合)

array (数组)

map-key(map)

open  :开始"("

separator: 分割符:,

close: 结尾:")"

例:

<select id="getUserByRoles" resultType="User">

select * from smbms_user  

where  gender= #{gender} and userRole in

<foreach collection="uRole" item="roles" 

open="(" close=")" separator=",">

#{roles}

</foreach>

</select>

17.9 choose

a.相当于Java中switch语句

b.当when有条件满足的时候,就跳出choose

<choose>

<when test ="条件1"> …</when>

<when test ="条件2"> …</when>

<when test ="条件3"> …</when>

<otherwise>…</otherwise>

</choose>

 

18. Mysql的分页

a.使用limit进行分页

b.语法

select * from smbms_user LIMIT 开始位置,每页条目数;

例:select * from smbms_user LIMIT #{from},#{pageSize};

 

 

 

 

        

                

 

 

        

        

 

 

 

 

 

 

 

        

 

 

 

 

 

 

 

 

 

 

  

 

    

 

 

 

 

 

 

     

 

操作
 
添加随笔
标题 
内容(TinyMCE编辑器,支持拖放/粘贴上传图片) 本地自动保存于上午9:41:13,查看
 
   
   
                                                       
                  上传图片     插入代码(推荐) 插入代码        
段落  
字体  
字体大小  
       
                                 
元素路径p » span
常用选项
个人分类
     
发布选项
发布至首页候选区 
发布至博客园首页(原创、精品、知识分享)
【发文说明】
博客园是面向开发者的知识分享社区,不允许发布任何推广、广告、政治方面的内容。
博客园首页(即网站首页)只能发布原创的、高质量的、能让读者从中学到东西的内容。
如果博文质量不符合首页要求,会被工作人员移出首页,望理解。如有疑问,请联系contact@cnblogs.com。
网站分类
高级选项
  •  
  •  
  •  
  •  
  •  
  •  
 
EntryName(友好地址名,只能使用字母、数字、-连字符、_下划线,不超过150个字符)

Tag标签:  插入已有标签 (多个关键字之间用“,”分隔,最多不超过10个)
密码保护: 
 
 
posted @ 2017-11-22 09:43  锦绣河山锦  阅读(480)  评论(0编辑  收藏  举报