一、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

    1. <select id="find" resultMap="userMap">
    2. select * from user;
    3. </select>

三、Properties

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

  1. <configuration>
  2. <!-- 定义变量 -->
  3. <properties>
  4. <property name="driver" value="com.mysql.jdbc.Driver"/>
  5. <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
  6. <property name="username" value="root"/>
  7. <property name="password" value="0000"/>
  8. </properties>
  9. <environments default="development">
  10. <environment id="development">
  11. <transactionManager type="JDBC"/>
  12. <dataSource type="POOLED">
  13. <!-- 使用变量 -->
  14. <property name="driver" value="${driver}"/>
  15. <property name="url" value="${url}"/>
  16. <property name="username" value="${username}"/>
  17. <property name="password" value="${password}"/>
  18. </dataSource>
  19. </environment>
  20. </environments>
  21. <mappers>
  22. <mapper resource="com/yixuexi/dao/UserDaoMapper.xml"></mapper>
  23. </mappers>
  24. </configuration>

2、引用外部文件配置

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

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

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

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

四、typeAliases

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

    1、typeAlias

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

    2、Package常用

    ```xml
  1. `mapers`标签下的`package`子标签(映射配置文件中的)
  2. ```xml
  3. <mappers>
  4. <!--
  5. 1. 使用package的要求
  6. - mapper文件必须和dao接口名必须完全相同,包括大小写
  7. - mapper文件和dao文件必须在同一目录【mapper文件在resources目录下也行 前提是也有 com.xxx.xxx】
  8. 2. package标签用于指定dao接口所在的包,当指定了之后就不需要在写mapper了 resouces和class也不用了-->
  9. <package name="com.yixuexi.dao"/>
  10. </mappers>
  11. <!--不用插件也行,要符合上面的要求-->
  12. <-- pom文件插件 -->
  13. <!--配置资源插件,在java目录下的xml文件也会被编译到,放到最后那里就行-->
  14. <resources>
  15. <resource>
  16. <directory>src/main/java</directory>
  17. <includes>
  18. <include>**/*.properties</include>
  19. <include>**/*.xml</include>
  20. </includes>
  21. <filtering>false</filtering>
  22. </resource>
  23. </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

使用的是池的思想