mybatis分享 Mybatis入门 mapper映射文件配置之insert、update、delete mapper映射文件配置之select、resultMap 强大的动态SQL

Mybatis入门html

1、Mybatis环境搭建及简单实例java

pom.xmlmysql

mybatis-config.xmlsql

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE configuration
 3   PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 4   "http://mybatis.org/dtd/mybatis-3-config.dtd">
 5 <configuration>
 6 
 7   <!-- 指定properties配置文件, 我这里面配置的是数据库相关 -->
 8   <properties resource="dbConfig.properties"></properties>
 9       
10   <environments default="development">
11     <environment id="development">
12       <transactionManager type="JDBC"/>
13       <dataSource type="POOLED">
14           <!--
15           若是上面没有指定数据库配置的properties文件,那么此处能够这样直接配置 
16         <property name="driver" value="com.mysql.jdbc.Driver"/>
17         <property name="url" value="jdbc:mysql://localhost:3306/test1"/>
18         <property name="username" value="root"/>
19         <property name="password" value="root"/>
20          -->
21          
22          <!-- 上面指定了数据库配置文件, 配置文件里面也是对应的这四个属性 -->
23          <property name="driver" value="${driver}"/>
24          <property name="url" value="${url}"/>
25          <property name="username" value="${username}"/>
26          <property name="password" value="${password}"/>
27          
28       </dataSource>
29     </environment>
30   </environments>
31   
32   <!-- 映射文件,mybatis精髓, 后面才会细讲 -->
33   <mappers>
34     <mapper resource="com/dy/dao/userDao-mapping.xml"/>
35   </mappers>
36   
37 </configuration>

1. configuration节点为根节点。数据库

2. 在configuration节点之下,咱们能够配置10个子节点, 分别为:properties、typeAliases、plugins、objectFactory、objectWrapperFactory、settings、environments、databaseIdProvider、typeHandlers、mappers。apache

实体类——User缓存

properties的使用方法session

envirements元素节点的使用方法mybatis

environments元素节点能够配置多个environment子节点, 怎么理解呢? oracle

  假如咱们系统的开发环境和正式环境所用的数据库不同(这是确定的), 那么能够设置两个environment, 两个id分别对应开发环境(dev)和正式环境(final),那么经过配置environments的default属性就能选择对应的environment了, 例如,我将environments的deault属性的值配置为dev, 那么就会选择dev的environment。

typeAliases

typeHandler

Mybatis中的TypeHandler是什么?

  不管是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,仍是从结果集中取出一个值时,都会用类型处理器将获取的值以合适的方式转换成 Java 类型。Mybatis默认为咱们实现了许多TypeHandler, 当咱们没有配置指定TypeHandler时,Mybatis会根据参数或者返回结果的不一样,默认为咱们选择合适的TypeHandler处理。

配置typeHandler

 1 <configuration>
 2     <typeHandlers>
 3       <!-- 
 4           当配置package的时候,mybatis会去配置的package扫描TypeHandler
 5           <package name="com.dy.demo"/>
 6        -->
 7       
 8       <!-- handler属性直接配置咱们要指定的TypeHandler -->
 9       <typeHandler handler=""/>
10       
11       <!-- javaType 配置java类型,例如String, 若是配上javaType, 那么指定的typeHandler就只做用于指定的类型 -->
12       <typeHandler javaType="" handler=""/>
13       
14       <!-- jdbcType 配置数据库基本数据类型,例如varchar, 若是配上jdbcType, 那么指定的typeHandler就只做用于指定的类型  -->
15       <typeHandler jdbcType="" handler=""/>
16       
17       <!-- 也可二者都配置 -->
18       <typeHandler javaType="" jdbcType="" handler=""/>
19       
20   </typeHandlers>
21   
22   ......
23   
24 </configuration>

 

objectFactory是干什么的? 须要配置吗?

  MyBatis 每次建立结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成。默认的对象工厂须要作的仅仅是实例化目标类,要么经过默认构造方法,要么在参数映射存在的时候经过参数构造方法来实例化。默认状况下,咱们不须要配置,mybatis会调用默认实现的objectFactory。 除非咱们要自定义ObjectFactory的实现, 那么咱们才须要去手动配置。

plugin有何做用? 须要配置吗?

  plugins 是一个可选配置。mybatis中的plugin其实就是个interceptor, 它能够拦截Executor 、ParameterHandler 、ResultSetHandler 、StatementHandler 的部分方法,处理咱们本身的逻辑。Executor就是真正执行sql语句的东西, ParameterHandler 是处理咱们传入参数的,还记得前面讲TypeHandler的时候提到过,mybatis默认帮咱们实现了很多的typeHandler, 当咱们不显示配置typeHandler的时候,mybatis会根据参数类型自动选择合适的typeHandler执行,其实就是ParameterHandler 在选择。ResultSetHandler 就是处理返回结果的。

mappers做用 ? 须要配置吗?

  mappers 节点下,配置咱们的mapper映射文件, 所谓的mapper映射文件,就是让mybatis 用来创建数据表和javabean映射的一个桥梁。在咱们实际开发中,一般一个mapper文件对应一个dao接口, 这个mapper能够看作是dao的实现。因此,mappers必须配置。

mapper映射文件配置之insert、update、delete

 1 <?xml version="1.0" encoding="UTF-8" ?>   
 2 <!DOCTYPE mapper   
 3 PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"  
 4 "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd"> 
 5 
 6 <!-- mapper 为根元素节点, 一个namespace对应一个dao -->
 7 <mapper namespace="com.dy.dao.UserDao">
 8 
 9     <insert
10       <!-- 1. id (必须配置)
11         id是命名空间中的惟一标识符,可被用来表明这条语句。 
12         一个命名空间(namespace) 对应一个dao接口, 
13         这个id也应该对应dao里面的某个方法(至关于方法的实现),所以id 应该与方法名一致 -->
14       
15       id="insertUser"
16       
17       <!-- 2. parameterType (可选配置, 默认为mybatis自动选择处理)
18         将要传入语句的参数的彻底限定类名或别名, 若是不配置,mybatis会经过ParameterHandler 根据参数类型默认选择合适的typeHandler进行处理
19         parameterType 主要指定参数类型,能够是int, short, long, string等类型,也能够是复杂类型(如对象) -->
20       
21       parameterType="com.demo.User"
22       
23       <!-- 3. flushCache (可选配置,默认配置为true)
24         将其设置为 true,任什么时候候只要语句被调用,都会致使本地缓存和二级缓存都会被清空,默认值:true(对应插入、更新和删除语句) -->
25       
26       flushCache="true"
27       
28       <!-- 4. statementType (可选配置,默认配置为PREPARED)
29         STATEMENT,PREPARED 或 CALLABLE 的一个。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED。 -->
30       
31       statementType="PREPARED"
32       
33       <!-- 5. keyProperty (可选配置, 默认为unset)
34         (仅对 insert 和 update 有用)惟一标记一个属性,MyBatis 会经过 getGeneratedKeys 的返回值或者经过 insert 语句的 selectKey 子元素设置它的键值,默认:unset。若是但愿获得多个生成的列,也能够是逗号分隔的属性名称列表。 -->
35       
36       keyProperty=""
37       
38       <!-- 6. keyColumn     (可选配置)
39         (仅对 insert 和 update 有用)经过生成的键值设置表中的列名,这个设置仅在某些数据库(像 PostgreSQL)是必须的,当主键列不是表中的第一列的时候须要设置。若是但愿获得多个生成的列,也能够是逗号分隔的属性名称列表。 -->
40       
41       keyColumn=""
42       
43       <!-- 7. useGeneratedKeys (可选配置, 默认为false)
44         (仅对 insert 和 update 有用)这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(好比:像 MySQL 和 SQL Server 这样的关系数据库管理系统的自动递增字段),默认值:false。  -->
45       
46       useGeneratedKeys="false"
47       
48       <!-- 8. timeout  (可选配置, 默认为unset, 依赖驱动)
49         这个设置是在抛出异常以前,驱动程序等待数据库返回请求结果的秒数。默认值为 unset(依赖驱动)。 -->
50       timeout="20">
51 
52     <update
53       id="updateUser"
54       parameterType="com.demo.User"
55       flushCache="true"
56       statementType="PREPARED"
57       timeout="20">
58 
59     <delete
60       id="deleteUser"
61       parameterType="com.demo.User"
62       flushCache="true"
63       statementType="PREPARED"
64       timeout="20">
65 </mapper>

 

若是咱们在使用mysql的时候,想在数据插入后返回插入的id, 咱们也可使用 selectKey 这个元素:

 1 <!-- 对应userDao中的insertUser方法,  -->
 2    <insert id="insertUser" parameterType="com.dy.entity.User">
 3            <!-- oracle等不支持id自增加的,可根据其id生成策略,先获取id 
 4            
 5         <selectKey resultType="int" order="BEFORE" keyProperty="id">
 6               select seq_user_id.nextval as id from dual
 7         </selectKey>
 8         
 9         --> 
10         
11         <!-- mysql插入数据后,获取id -->
12         <selectKey keyProperty="id" resultType="int" order="AFTER" >
13                SELECT LAST_INSERT_ID() as id
14            </selectKey>
15           
16            insert into user(id, name, password, age, deleteFlag) 
17                values(#{id}, #{name}, #{password}, #{age}, #{deleteFlag})
18    </insert>

 

mapper映射文件配置之select、resultMap

select配置

 1 <select
 2         <!--  1. id (必须配置)
 3         id是命名空间中的惟一标识符,可被用来表明这条语句。 
 4         一个命名空间(namespace) 对应一个dao接口, 
 5         这个id也应该对应dao里面的某个方法(至关于方法的实现),所以id 应该与方法名一致  -->
 6      
 7      id="selectPerson"
 8      
 9      <!-- 2. parameterType (可选配置, 默认为mybatis自动选择处理)
10         将要传入语句的参数的彻底限定类名或别名, 若是不配置,mybatis会经过ParameterHandler 根据参数类型默认选择合适的typeHandler进行处理
11         parameterType 主要指定参数类型,能够是int, short, long, string等类型,也能够是复杂类型(如对象) -->
12      parameterType="int"
13      
14      <!-- 3. resultType (resultType 与 resultMap 二选一配置)
15          resultType用以指定返回类型,指定的类型能够是基本类型,能够是java容器,也能够是javabean -->
16      resultType="hashmap"
17      
18      <!-- 4. resultMap (resultType 与 resultMap 二选一配置)
19          resultMap用于引用咱们经过 resultMap标签订义的映射类型,这也是mybatis组件高级复杂映射的关键 -->
20      resultMap="personResultMap"
21      
22      <!-- 5. flushCache (可选配置)
23          将其设置为 true,任什么时候候只要语句被调用,都会致使本地缓存和二级缓存都会被清空,默认值:false -->
24      flushCache="false"
25      
26      <!-- 6. useCache (可选配置)
27          将其设置为 true,将会致使本条语句的结果被二级缓存,默认值:对 select 元素为 true -->
28      useCache="true"
29      
30      <!-- 7. timeout (可选配置) 
31          这个设置是在抛出异常以前,驱动程序等待数据库返回请求结果的秒数。默认值为 unset(依赖驱动)-->
32      timeout="10000"
33      
34      <!-- 8. fetchSize (可选配置) 
35          这是尝试影响驱动程序每次批量返回的结果行数和这个设置值相等。默认值为 unset(依赖驱动)-->
36      fetchSize="256"
37      
38      <!-- 9. statementType (可选配置) 
39          STATEMENT,PREPARED 或 CALLABLE 的一个。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED-->
40      statementType="PREPARED"
41      
42      <!-- 10. resultSetType (可选配置) 
43          FORWARD_ONLY,SCROLL_SENSITIVE 或 SCROLL_INSENSITIVE 中的一个,默认值为 unset (依赖驱动)-->
44      resultSetType="FORWARD_ONLY">

resultMap配置

 1 <!-- 
 2         1.type 对应类型,能够是javabean, 也能够是其它
 3         2.id 必须惟一, 用于标示这个resultMap的惟一性,在使用resultMap的时候,就是经过id指定
 4      -->
 5     <resultMap type="" id="">
 6     
 7         <!-- id, 惟一性,注意啦,这个id用于标示这个javabean对象的惟一性, 不必定会是数据库的主键(不要把它理解为数据库对应表的主键) 
 8             property属性对应javabean的属性名,column对应数据库表的列名
 9             (这样,当javabean的属性与数据库对应表的列名不一致的时候,就能经过指定这个保持正常映射了)
10         -->
11         <id property="" column=""/>
12         
13         <!-- result与id相比, 对应普通属性 -->    
14         <result property="" column=""/>
15         
16         <!-- 
17             constructor对应javabean中的构造方法
18          -->
19         <constructor>
20             <!-- idArg 对应构造方法中的id参数 -->
21             <idArg column=""/>
22             <!-- arg 对应构造方法中的普通参数 -->
23             <arg column=""/>
24         </constructor>
25         
26         <!-- 
27             collection,对应javabean中容器类型, 是实现一对多的关键 
28             property 为javabean中容器对应字段名
29             column 为体如今数据库中列名
30             ofType 就是指定javabean中容器指定的类型
31         -->
32         <collection property="" column="" ofType=""></collection>
33         
34         <!-- 
35             association 为关联关系,是实现N对一的关键。
36             property 为javabean中容器对应字段名
37             column 为体如今数据库中列名
38             javaType 指定关联的类型
39          -->
40         <association property="" column="" javaType=""></association>
41     </resultMap>

 

强大的动态SQL

那么,问题来了: 什么是动态SQL? 动态SQL有什么做用?

  传统的使用JDBC的方法,相信你们在组合复杂的的SQL语句的时候,须要去拼接,稍不注意哪怕少了个空格,都会致使错误。Mybatis的动态SQL功能正是为了解决这种问题, 其经过 if, choose, when, otherwise, trim, where, set, foreach标签,可组合成很是灵活的SQL语句,从而提升开发人员的效率。

if

1 <select id="findUserById" resultType="user">
2            select * from user where 
3            <if test="id != null">
4                id=#{id}
5            </if>
6             and deleteFlag=0;
7 </select>

 

有问题?

where

1 <select id="findUserById" resultType="user">
2            select * from user 
3            <where>
4                <if test="id != null">
5                    id=#{id}
6                </if>
7                and deleteFlag=0;
8            </where>
9  </select>

从表面上来看,就是多了个where标签而已, 不过实质上, mybatis是对它作了处理,当它遇到AND或者OR这些,它知道怎么处理。其实咱们能够经过 trim 标签去自定义这种处理规则。

trim

上面的where标签,其实能够用trim表示:

<trim prefix="WHERE" prefixOverrides="AND |OR ">
  ... 
</trim>

 

set

 1 <update id="updateUser" parameterType="com.dy.entity.User">
 2            update user set 
 3            <if test="name != null">
 4                name = #{name},
 5            </if> 
 6            <if test="password != null">
 7                password = #{password},
 8            </if> 
 9            <if test="age != null">
10                age = #{age}
11            </if> 
12            <where>
13                <if test="id != null">
14                    id = #{id}
15                </if>
16                and deleteFlag = 0;
17            </where>
18 </update>

 

 1 <update id="updateUser" parameterType="com.dy.entity.User">
 2            update user
 3         <set>
 4           <if test="name != null">name = #{name},</if> 
 5              <if test="password != null">password = #{password},</if> 
 6              <if test="age != null">age = #{age},</if> 
 7         </set>
 8            <where>
 9                <if test="id != null">
10                    id = #{id}
11                </if>
12                and deleteFlag = 0;
13            </where>
14 </update>

 

这个用trim 可表示为:

<trim prefix="SET" suffixOverrides=",">
  ...
</trim>

foreach

1 <select id="selectPostIn" resultType="domain.blog.Post">
2   SELECT *
3   FROM POST P
4   WHERE ID in
5   <foreach item="item" index="index" collection="list"
6       open="(" separator="," close=")">
7         #{item}
8   </foreach>
9 </select>

 

choose

<select id="findActiveBlogLike"
     resultType="Blog">
  SELECT * FROM BLOG WHERE state = ‘ACTIVE’
  <choose>
    <when test="title != null">
      AND title like #{title}
    </when>
    <when test="author != null and author.name != null">
      AND author_name like #{author.name}
    </when>
    <otherwise>
      AND featured = 1
    </otherwise>
  </choose>
</select>

 

SqlSessionFactory与sqlsession

从表面上来看,我们都是经过SqlSession去执行sql语句。那么我们就先看看是怎么获取SqlSession的吧:

 1 SqlSessionFactory sessionFactory = null;  
 2 String resource = "mybatis-conf.xml";  
 3 try {
 4      //SqlSessionFactoryBuilder读取配置文件
 5     sessionFactory = new SqlSessionFactoryBuilder().build(Resources  
 6               .getResourceAsReader(resource));
 7 } catch (IOException e) {  
 8     e.printStackTrace();  
 9 }    
10 //经过SqlSessionFactory获取SqlSession
11 SqlSession sqlSession = sessionFactory.openSession();

 

SqlSession我们也拿到了,我们能够调用SqlSession中一系列的select...,  insert..., update..., delete...方法轻松自如的进行CRUD操做了。 就这样? 那咱配置的映射文件去哪儿了?  别急, 我们接着往下看:

2. 利器之MapperProxy:

 

在mybatis中,经过MapperProxy动态代理我们的dao, 也就是说, 当我们执行本身写的dao里面的方法的时候,实际上是对应的mapperProxy在代理。

相关文章
相关标签/搜索