在MyBatis的配置文件中有挺多属性的,在这里就慢慢说明补全,包括主配置文件和映射配置文件
占位符
在Mybatis的sql语句中,有两种占位符,分别是${}
和#{}
,通常情况下,较多使用#{}
。
- #### #{} ####
通过#{}
可以实现 preparedStatement 向占位符中设置值,自动进行 java 类型和 jdbc 类型转换, #{}
可以有效防止 sql 注入。#{}
可以接收简单类型值或 pojo 属性值。 如果 parameterType 传输单个简单类 型值,#{}
括号中可以是 value 或其它名称。
- #### ${} ####
通过${}
可以将 parameterType 传入的内容拼接在 sql 中且不进行 jdbc 类型转换, ${}
可以接收简 单类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值,${}
括号中只能是 value。
返回主键
在入门案例哪里我们实现了在插入语句之后,取得刚刚插入数据库的数据主键是多少,我们是通过以下方式解决的
select LAST_INSERT_ID()
语句可以为我们获取刚刚插入记录的自增主键
<insert id="saveUser" parameterType="cn.junko.domain.User">
<selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
select last_insert_id();
</selectKey>
insert into user(username,address,sex,birthday) values (#{username},#{address},#{sex},#{birthday});
</insert>
parameterType 配置参数
我们已经知道SQL语句的传参是使用标签的parameterType
属性来设定,该属性的取值可以是基本类型,引用类型,或是实体类,当然也可以用实体类的包装类。
parameterType="cn.junko.domain.User"
parameterType="INTEGER"
parameterType="java.lang.String"
目前在实体类取值只能使用全限定类名,还有一种方法则需要对应的主配置文件进行更改
resultMap结果类型
resultMap标签可以建立查询的列名和实体类的属性名称不一致时建立对应关系,实现封装。 在select标签中使用resultMap属性指定引用即可。
resultMap 可以实现将查询结果映射为复杂类型的 pojo,比如在查询结果映射对象中包括 pojo 和 list 实现一对一查询和一对多查询。
<resultMap type="com.junko.domain.User" id="userMap">
<id column="id" property="userId"/>
<result column="username" property="userName"/>
<result column="sex" property="userSex"/>
</resultMap>
<!--
id:要映射结果集的唯一标识 ,称为主键
column:结果集的列名,数据库列名
property:用于指定实体类属性名称
-->
映射配置的操作
<select id="findAll" resultMap="userMap">
select * from user
</select>
resultMap和resultType的使用场合
- resultType:
作用:将查询结果按照sql列名pojo属性名一致性映射到pojo中。
场合:常见一些明细记录的展示,将关联查询信息全部展示在页面时,此时可直接使用resultType将每一条记录映射到pojo中,在前端页面遍历list(list中是pojo)即可。
- resultMap:
使用association和collection完成一对一和一对多高级映射。一般搭配association和collection使用
properties(属性)
在主配置文件使用properties属性时,我们可以采用两种方法来配置
- 第一种
<properties>
<property name="jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="jdbc.url" value="jdbc:mysql://localhost:3306/eesy"/>
<property name="jdbc.username" value="root"/>
<property name="jdbc.password" value="12345678"/>
</properties>
之后在dataSource标签内引用
<dataSource type="POOLED">
<!--连接数据库的四个基本信息-->
<property name="driver" value="${jdbc.driver}"/>
<!--下面同理-->
</dataSource>
- 第二种
引入properties文件配置
定义一个config.properties文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/eesy
jdbc.username=root
jdbc.password=12345678
之后在properties标签配置引入该文件使用resource
,url
,uri
<properties resource="config.properties">
</properties>
然后在dataSource的引入同理,value要与properties文件里的名字对应
- resource属性:用于指定 properties 配置文件的位置,要求配置文件必须在类路径下
resource="jdbcConfig.properties"
- url属性: URL: Uniform Resource Locator 统一资源定位符
http://localhost:8080/mystroe/CategoryServlet URL
协议 主机 端口 URI
- URI:Uniform Resource Identifier 统一资源标识符
/mystroe/CategoryServlet
它是可以在 web 应用中唯一定位一个资源的路径
typeAliases、package(类型别名)
typeAliases配置别名,只能配置domain中类的别名,当配置完成后,映射文件类的引用就可以不写全限定类名
<typeAliases>
<!-- 单个别名定义 -->
<typeAlias alias="user" type="cn.junko.domain.User"/>
</typeAliases>
<typeAliases>
<!--用于指定配置别名的包,指定之后,该包下的所有实体类都会注册别名,类名即别名,不区分大小写-->
<package name="cn.junko.domain"></package>
</typeAliases>
同理在mappers里面也可以使用package指定dao接口所在的包,当指定完成之后就不需再写mapper以及resouce或class
<mappers>
<package name="cn.junko.dao">
</mappers>