一、parameterType (输入类型)
1、传递简单的类型
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)第一种(执行效率快,开发效率低)
- 类中的属性为 userId,username,userPassword
- 为了能让数据库查询出来的数据 封装到User对象中去,可以采用起别名的方式
在映射xml文件中这样写sql
<select id="findAll" resultType="com.yixuexi.entity.User" parameterType="String">
Select id as userId,name as username,password as userPassword from user;
</select>
2)第二种 (执行效率低,开发效率变快)
采用MyBatis提供的一个配置
直接在dao映射文件中配置
<!--id 就是起个名,在使用的时候用这个名就行 type 是哪个实体类-->
<resultMap id="userMap" type="com.yixuexi.entity.User">
<!--配置主键字段的对应 property 写类中的属性名 column写数据库中对应的字段名-->
<id property="userId" column="id"></id>
<!--非主键字段的对应-->
<result property="username" column="name"></result>
<result property="userPassword" column="password"></result>
</resultMap>
如果要使用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>
resultType
和parameterType
不能在用全限定名字了,要使用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
使用的是池的思想