一、parameterType (输入类型)

1、传递简单的类型

int Integer String 都可以

2、pojo对象(实体类对象)

MyBatis使用ognl表达式解析对象字段的值,
Ognl:对象导航图语言
通过对象的取值方法来获取数据,在写法上把get省略了
例如:

  • 类中的写法:user.getUsername();
  • ognl表达式:user.username;

MyBatis为什么能直接写username,而不用user呢
因为在parameterType中已经提供了属性所属的类,此时不需要写对象名
传递pojo包装对象

  • 有一个QueryVo类 里面有一个属性是 private User user 【提供了get set方法】
  • 当查询时,在parameter=”com.yixuexi.entity.QueryVo” 那么下面的sql语句如何调用到 user对象的username

Select * ``from`` user where name = #{user.username}
直接点即可 因为ognl表达式,parameter已经提供了QueryVo
有多个对象组合在一起 完成查询

二、resultMap(结果类型)

(映射文件中的配置)

1、解决实体类属性和列名不一致的两种解决方案

1)第一种(执行效率快,开发效率低)

  1. 类中的属性为 userId,username,userPassword
  2. 为了能让数据库查询出来的数据 封装到User对象中去,可以采用起别名的方式
  3. 在映射xml文件中这样写sql

    1. <select id="findAll" resultType="com.yixuexi.entity.User" parameterType="String">
    2. Select id as userId,name as username,password as userPassword from user;
    3. </select>

    2)第二种 (执行效率低,开发效率变快)

  4. 采用MyBatis提供的一个配置

  5. 直接在dao映射文件中配置

    1. <!--id 就是起个名,在使用的时候用这个名就行 type 是哪个实体类-->
    2. <resultMap id="userMap" type="com.yixuexi.entity.User">
    3. <!--配置主键字段的对应 property 写类中的属性名 column写数据库中对应的字段名-->
    4. <id property="userId" column="id"></id>
    5. <!--非主键字段的对应-->
    6. <result property="username" column="name"></result>
    7. <result property="userPassword" column="password"></result>
    8. </resultMap>
  6. 如果要使用resultMap对应的话,那么resultType则需要换成resultMap 值就是id

    <select id="find" resultMap="userMap">
     select * from user;
    </select>
    

三、Properties

1、在主配置文件中 mybatis-config.xml中配置

<configuration>
  <!-- 定义变量 -->
  <properties>
    <property name="driver" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
    <property name="username" value="root"/>
    <property name="password" value="0000"/>
  </properties>
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <!-- 使用变量 -->
        <property name="driver" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
    <mapper resource="com/yixuexi/dao/UserDaoMapper.xml"></mapper>
  </mappers>
</configuration>

2、引用外部文件配置

  • (可以在标签内部配置连接数据库的信息,也可以通过属性引用外部配置文件配置信息)
  • resources属性: 常用于指定配置文件的位置,是按照类路径的写法,并且必须存储在类路径下
  • 要用到properties标签中的resources属性 [在类的根路径下 src下]

    <properties resource="mybatis.properties">
    </properties>
    
  • Mybatis.properties中这样写

    driver=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/mybatis
    username=root
    password=0000
    
  • 注意事项:

properties中的信息key必须和 dataSource里面的的value中的${一致}

四、typeAliases

  • (主配置文件中的标签)
  • 使用typeAliases配置别名,他只能配置 实体类 中类得别名,

    1、typeAlias

    <typeAliases>
      <!--type:实体类的具体全限定类名 alias:别名-->
      <typeAlias type="com.yixuexi.domain.User" alias="user"></typeAlias>
    </typeAliases>
    
    用了此标签后,resultTypeparameterType不能在用全限定名字了,要使用alias别名

    2、Package常用

    ```xml
`mapers`标签下的`package`子标签(映射配置文件中的)
```xml
    <mappers>
         <!--
            1. 使用package的要求
                - mapper文件必须和dao接口名必须完全相同,包括大小写
                - mapper文件和dao文件必须在同一目录【mapper文件在resources目录下也行 前提是也有 com.xxx.xxx】
            2. package标签用于指定dao接口所在的包,当指定了之后就不需要在写mapper了 resouces和class也不用了-->
            <package name="com.yixuexi.dao"/>
    </mappers>
<!--不用插件也行,要符合上面的要求-->

<-- pom文件插件 -->

    <!--配置资源插件,在java目录下的xml文件也会被编译到,放到最后那里就行-->
    <resources>
      <resource>
        <directory>src/main/java</directory>
        <includes>
          <include>**/*.properties</include>
          <include>**/*.xml</include>
        </includes>
        <filtering>false</filtering>
      </resource>
    </resources>

五、MyBatis连接池

我们在实际开发中都会使用连接池
减少获取连接时所消耗的时间
mybatis提供了3中方式的配置
配置的位置
主配置文件 mybatis-config.xml中的dataSource标签的type属性

Type属性的取值:

  • POOLED(默认) :采用传统的javax.sql.DataSource规范中的连接池 mybatis中有针对它的实现、
  • UNPOOLED:传统的获取连接的方式,虽然也实现了javax.sql.DataSource接口,但是名没有使用池的思想
  • JNDI:采用服务器提供的JNDI技术实现,来获取DataSource对象,不同的服务器之间不同

注意:如果是不web获取maven的war功能,是不能使用的

1、UNPOOLED和POOLED差别

1)UNPOOLED

通过源码可以看到 UNPOOLED是每次使用的执行sql的时候都会在底层进行一套JDBC操作
注册驱动,获取连接……

2)POOLED

使用的是池的思想