配置文件

贴出mybatis的配置文件,这里mybatis还未与spring做整合:

 <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration> <!-- 此文件中配置顺序需要注意 properties?,settings?,typeAliases?,typeHandlers?, objectFactory?,objectWrapperFactory?,plugins?,
environments?,databaseIdProvider?,mappers 
properties 属性 
settings 设置 
typeAliases 类型别名 
typeHandlers 类型处理器 
objectFactory 对象工厂 
plugins 插件 
environments 环境
environment 环境变量 
transactionManager 事务管理器 
dataSource 数据源 
mappers 映射器
顺序从上到下 --> <!-- 需要 引入外部文件的配置,当有spring配置文件时这的jdbc配置文件就可以在spring的文件中引入 -->
<properties resource="jdbc.properties"></properties> <!-- 实体类与数据库表中字段关系映射 -->
<settings>
<!-- 下划线字段名转换骆驼属性名 -->
<setting name="mapUnderscoreToCamelCase" value="true" />
</settings> <!--
    设置别名,对应的xml中实体就不用每次配置对象类的全路径了 这里可以在spring配置文件中配置
    扫描包会生成2个别名,一个大写一个小写(如实体类User,配置别名后悔生成User或者user);-->
     <typeAliases>
<package name="com.vincce.study.mybaits.entity" />
</typeAliases> <!-- 链接数据库 四大基本要素 这里可以配置在spring配置文件中 -->
<environments default="development">
<!-- 这里可以配置测试、生产、开发环境,但是这里一般都是在spring配置文件中进行配置 -->
<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> <environment id="test">
<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> <!-- 在mybatis主配置文件中声明xml文件 可以在spring配置文件中进行配置-->
<mappers>
<!-- 这种配置需要没写一个xml 都需要配置一个xml,值是路径相对于资源目录跟路径,这样配置麻烦 -->
<!-- <mapper resource="mapper/UserMapper.xml" /> -->
<!-- url值是xml的绝对路径 -->
<!-- <mapper url="E:/study/study_mybatis/workspace_mybatis/study_mybatis_common/study_mybatis_jdbcTest/src/main/resources/mapper/UserMapper.xml"/> -->
<!-- 这样配置 需要将xml文件放在与接口同一个包下,并且名字相同 这样可以找到xml文件 执行sql -->
<!-- <mapper class="com.vincce.study.mybaits.dao.UserMapper"/> -->
<!-- 这里直接配置接口的全路径,最方便 -->
<package name="com.vincce.study.mybaits.dao" />
</mappers> </configuration>

对于mybatis的主配置文件中,下面列出详细的配置说明:标红是我们最常用的;

setting标签:

这些是极其重要的调整, 它们会修改 MyBatis 在运行时的行为方式。 下面这个表格描述 了设置信息,它们的含义和默认值。

设置参数

描述

有效值

默认值

cacheEnabled

这个配置使全局的映射器启用或禁用 缓存。

true | false

true

lazyLoadingEnabled

全局启用或禁用延迟加载。当禁用时, 所有关联对象都会即时加载。 This value can be superseded for an specific relation by using the fetchTypeattribute on it.

true | false

false

aggressiveLazyLoading

当启用时, 有延迟加载属性的对象在被 调用时将会完全加载任意属性。否则, 每种属性将会按需要加载。

true | false

true

multipleResultSetsEnabled

允许或不允许多种结果集从一个单独 的语句中返回(需要适合的驱动)

true | false

true

useColumnLabel

使用列标签代替列名。 不同的驱动在这 方便表现不同。 参考驱动文档或充分测 试两种方法来决定所使用的驱动。

true | false

true

useGeneratedKeys

允许 JDBC 支持生成的键。 需要适合的 驱动。 如果设置为 true 则这个设置强制 生成的键被使用, 尽管一些驱动拒绝兼 容但仍然有效(比如 Derby)

true | false

False

autoMappingBehavior

指定 MyBatis 如何自动映射列到字段/ 属性。PARTIAL 只会自动映射简单, 没有嵌套的结果。FULL 会自动映射任 意复杂的结果(嵌套的或其他情况) 。

NONE, PARTIAL, FULL

PARTIAL

defaultExecutorType

配置默认的执行器。SIMPLE 执行器没 有什么特别之处。REUSE 执行器重用 预处理语句。BATCH 执行器重用语句 和批量更新

SIMPLE REUSE BATCH

SIMPLE

defaultStatementTimeout

设置超时时间, 它决定驱动等待一个数 据库响应的时间。

Any positive integer

Not Set (null)

safeRowBoundsEnabled

Allows using RowBounds on nested statements.

true | false

False

mapUnderscoreToCamelCase

Enables automatic mapping from classic database column names A_COLUMN to camel case classic Java property names aColumn.

true | false

False

localCacheScope

MyBatis uses local cache to prevent circular references and speed up repeated nested queries. By default (SESSION) all queries executed during a session are cached. If localCacheScope=STATEMENT local session will be used just for statement execution, no data will be shared between two different calls to the same SqlSession.

SESSION | STATEMENT

SESSION

jdbcTypeForNull

Specifies the JDBC type for null values when no specific JDBC type was provided for the parameter. Some drivers require specifying the column JDBC type but others work with generic values like NULL, VARCHAR or OTHER.

JdbcType enumeration. Most common are: NULL, VARCHAR and OTHER

OTHER

lazyLoadTriggerMethods

Specifies which Object's methods trigger a lazy load

A method name list separated by commas

equals,clone,hashCode,toString

defaultScriptingLanguage

Specifies the language used by default for dynamic SQL generation.

A type alias or fully qualified class name.

org.apache.ibatis.scripting.xmltags.XMLDynamicLanguageDriver

callSettersOnNulls

当结果集中含有Null值时是否执行映射对象的setter或者Map对象的put方法。此设置对于原始类型如int,boolean等无效。

true | false

false

logPrefix

Specifies the prefix string that MyBatis will add to the logger names.

Any String

Not set

logImpl

Specifies which logging implementation MyBatis should use. If this setting is not present logging implementation will be autodiscovered.

SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING

Not set

proxyFactory

Specifies the proxy tool that MyBatis will use for creating lazy loading capable objects.

CGLIB | JAVASSIST

CGLIB

对于Mapper xml文件

Mapper映射文件是在实际开发过程中使用最多的,也是我们学习的重点。

Mapper文件中包含的元素有:

  • cache – 配置给定命名空间的缓存。
  • cache-ref – 从其他命名空间引用缓存配置。
  • resultMap – 映射复杂的结果对象。
  • sql – 可以重用的 SQL 块,也可以被其他语句引用。
  • insert – 映射插入语句
  • update – 映射更新语句
  • delete – 映射删除语句
  • select – 映射查询语句

标签中的属性值,

  • parameterType的传入参数

    • 传入类型有三种:

      1、简单类型,string、long、integer等

      2、Pojo类型,User等

      3、HashMap类型。

      在使用#{}传参时,#{}只是做占位符,与参数名无关。

      在使用${}传参时,是通过参数名获取参数的,如果没有指定参数名则可以通过value获取,如果指定则需要按照名称获取。

      当DAO接口中需要传递多个参数时有三种方法传递:

      1. 将参数封装一个hashmap传递;
      2. 将参数封装成一个对象传递;
      3. 使用@Param注解表明参数传递;
  • parameterType的传入多个参数
    • 当DAO接口中需要传递多个参数时有两种方法传递:

      1. 使用默认规则获取参数;
        默认规则:
        a) 使用参数的下标,从0开始,#{0},#{1}
        b) 使用param1、param2、param。。。。 #{param1}、#{param2}
      2. 使用@Param注解表明参数传递;
        public User login(@Param("userName")String userName, @Param("password")String password);
        注意:注解最终会转化为map传入;

动态sql

1.1.1. where

需求:查询所有用户,如果输入了姓名,进行模糊查找。

where 标签的应用场景:

之前我们使用过的一种有条件的查询sql语句:

select * from tb_user where 1=1 and name like ‘%name%’;

这里的name这个条件是不确定的,为了防止这个参数是空报错,所以加上1=1这个条件,那么使用mybatis的where标签就可以不必这么写了;使用方式如下所示:

经过测试,当多条件参数指出现一个参数,这里是不需要and开头的,where标签在if判断里面也加上了and ,这里是可以自动隐去and;如果多条件参数值都不为空,我们在if标签里不加and,这里会报异常,所以建议写法是不管条件个数,都加上and。

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

SELECT * FROM tb_user

<where>

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

AND name LIKE #{name}

</if>

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

AND age = #{age}

</if>

</where>

</select>

1.1.2. foreach

需求:按照多个ID查询用户信息。用途:多个id查询、删除,批量插入数据;

传统的sql语句:select * from tb_user where id in(1,2,3);

这里使用mybatis在xml中可以这么使用,使用foreach标签, collections是要迭代的集合,item是集合中的每个元素,每个元素之间用逗号分隔,使用separator,前后括号使用open close 如下面所示:

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

SELECT * FROM tb_user WHERE id IN

<foreach collection="ids" item="id" separator="," open="(" close=")">

#{id}

</foreach>

</select>

这里foreach还有一个应用场景,使用的还是很多的,做批量插入

传统的sql:

insert into tb_user (id,user_name,name,age,sex)

values(null,’lisi’,’lisi’,20,1),(null,’wangwu’,’wangwu’,20,0);这种写法是可行的,那么在mybatis的xml中的实现方式是:

<insert id=”insertUsers” >

insert into tb_user (id,user_name,name,age,sex) values

<foreach collections=”users” item = “user” separator=”,” open=”(” close=”)”>

#{user}

</foreach>

</insert>

关于mybatis的学习笔记的更多相关文章

  1. MyBatis:学习笔记(4)——动态SQL

    MyBatis:学习笔记(4)——动态SQL 如果使用JDBC或者其他框架,很多时候需要你根据需求手动拼装SQL语句,这是一件非常麻烦的事情.MyBatis提供了对SQL语句动态的组装能力,而且他只有 ...

  2. mybatis的学习笔记

    前几天学习了mybatis,今天来复习一下它的内容. mybatis是一个基于Java的持久层框架,那就涉及到数据库的操作.首先来提出第一个问题:java有jdbc连接数据库,我们为什么还要使用框架呢 ...

  3. MyBatis 3学习笔记

    MyBatis 3 一.MyBatis简介 优秀的持久层框架,支持支持自定义 SQL.存储过程以及高级映射,专注于SQL的编写. ​ 为什么不使用工具类进行数据库操作: ​ 功能简单,sql语句编写在 ...

  4. mybatis缓存学习笔记

    mybatis有两级缓存机制,一级缓存默认开启,可以在手动关闭:二级缓存默认关闭,可以手动开启.一级缓存为线程内缓存,二级缓存为线程间缓存. 一提缓存,必是查询.缓存的作用就是查询快.写操作只能使得缓 ...

  5. 3、MyBatis.Net学习笔记之增删改

    增删改之前先说一下笔记1里提到的一个无法创建ISqlMapper对象的问题. <resultMaps> <resultMap id="FullResultMap" ...

  6. MyBatis基础学习笔记--摘录

    1.MyBatis是什么? MyBatis源自于IBatis,是一个持久层框架,封装了jdbc操作数据库的过程,使得开发者只用关心sql语句,无需关心驱动加载.连接,创建statement,手动设置参 ...

  7. MyBatis基础学习笔记--自总结

    一.MyBatis和jdbc的区别 jdbc的过程包括: 1.加载数据库驱动. 2.建立数据库连接. 3.编写sql语句. 4.获取Statement:(Statement.PrepareStatem ...

  8. Mybatis进阶学习笔记——动态代理方式开发Dao接口、Dao层(推荐第二种)

    1.原始方法开发Dao Dao接口 package cn.sm1234.dao; import java.util.List; import cn.sm1234.domain.Customer; pu ...

  9. MyBatis入门学习笔记(一)

    一.什么是MyBatis? Mybatis是一种“半自动化”的ORM实现,支持定制化 SQL.存储过程以及高级映射. 二.hibernate和mybatis对比 共同:采用ORM思想解决了实体和数据库 ...

随机推荐

  1. 洛谷——P2296 寻找道路

    P2296 寻找道路 题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点 ...

  2. bzoj 3328 : PYXFIB

    Discription Input 第一行一个正整数,表示数据组数据 ,接下来T行每行三个正整数N,K,P Output T行,每行输出一个整数,表示结果 Sample Input 1 1 2 3 S ...

  3. alibaba fastjson常见问题FAQ

    English | 中文 1. 怎么获得fastjson? 你可以通过如下地方下载fastjson: maven中央仓库: http://central.maven.org/maven2/com/al ...

  4. linux安装开源邮件服务器iredmail的方法:docker

    直接安装的方法,参考网文,我不介绍.本文介绍的是快速的方法:docker 使用镜像源:https://hub.docker.com/r/lejmr/iredmail/,因为pull的数量最多 直接 d ...

  5. linux的history命令设置

    history的历史记录,同一个用户的各个会话,读取到的内容也是不一样的,原因是它读取的是shell会话缓存里的内容.只有当用户退出当前会话的时候,会话里的缓存内容才会写入~/.bash_histor ...

  6. Shadow Map阴影贴图技术之探 【转】

    这两天勉勉强强把一个shadowmap的demo做出来了.参考资料多,苦头可不少.Shadow Map技术是目前与Shadow Volume技术并行的传统阴影渲染技术,而且在游戏领域可谓占很大优势.本 ...

  7. ItelliJ IDEA开发工具使用—创建一个web项目

    转   http://blog.csdn.net/wangyang1354/article/details/50452806 最近想用IDEA编辑器开发,但是平时都用MyEclipse和eclipse ...

  8. C#如何生成release版本的程序,生成debug版本的程序

    除了右击项目在生成中配置改成Release还要在顶部切换成Release                                  

  9. NYOJ 353 3D dungeon 【bfs】

    题意:给你一个高L长R宽C的图形.每个坐标都能够视为一个方格.你一次能够向上.下.左,右,前,后任一方向移动一个方格, 可是不能向有#标记的方格移动. 问:从S出发能不能到达E,假设能请输出最少的移动 ...

  10. 两种IO模式:Proactor与Reactor模式

    在高性能的I/O设计中,有两个比较著名的模式Reactor和Proactor模式,其中Reactor模式用于同步I/O,而Proactor运用于异步I/O操作. 在比较这两个模式之前,我们首先的搞明白 ...