主要内容
Mybatis的其他设置(示例conf.xml)
conf.xml中
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="db.properties"/>
<!-- 设置Mybatis全局参数
<settings>
<setting name="cacheEnabled" value="false" />
<setting name="lazyLoadingEnabled" value="false" />
</settings>
-->
<!-- 设置单个/多个别名 -->
<typeAliases>
<!-- 单个别名(别名可以忽略大小写)
<typeAlias type="org.koma.entity.Student" alias="student"/> -->
<!-- 批量定义别名 (别名可以忽略大小写),以下会自动将该包中的所有类 批量定义别名: 别名就是类名(不带包名,忽略大小写)-->
<package name="org.koma.entity"/>
</typeAliases>
<!--配置自定义Mybatis类型处理器 -->
<typeHandlers>
<typeHandler handler="org.koma.converter.BooleanAndIntConverter" javaType="Boolean" jdbcType="INTEGER" />
</typeHandlers>
<!-- 通过environments的default值 和 environment的 id 来指定 MyBatis运行时的数据库环境-->
<environments default="development">
<!-- 开发环境(自己的计算机) -->
<environment id="development">
<!-- 事务提交方式:
JDBC:利用JDBC方式处理事务(commit rollback close)
MANAGED:将事务交由 其他组件去托管(spring ,jobss),默认 会关闭连接。
<transactionManager type="MANAGED"/>
<property name="closeConnection" value="false"/>
-->
<transactionManager type="JDBC" />
<!-- 数据源类型:
UNPOOLED:传统的JDBC模式(每次访问数据库,均需要 打开、关闭等数据库操作,但是 打开、关闭数据库是比较消耗性能的)
POOLED:使用数据库连接池
JNDI:从tomcat中获取一个内置的数据库连接池 (数据库连接池-数据源 )
-->
<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="org/koma/mapper/studentMapper.xml"/>
</mappers>
</configuration>
Mybatis内置的类型处理器
自定义Mybatis类型处理器
例如:(boolean -> number )
实体类Student | 数据库表student |
---|---|
字段 boolean stuSex | 字段 number stuSex |
true:男,false:女 | 1:男,0:女 |
分俩步:
一、创建转换器:需要实现TypeHandler接口,TypeHandler接口有一个实现类 BaseTypeHandler ,实现转换器有2种选择:
- 实现接口TypeHandler接口
- 继承BaseTypeHandler
二、配置conf.xml
package org.koma.converter;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
//BaseTypeHandler<java类型>
public class BooleanAndIntConverter extends BaseTypeHandler<Boolean>{
//java中(boolean)->数据库中(number)
/*
* ps:PreparedStatement对象
* i:PreparedStatement对象操作参数的位置
* parameter:java值
* jdbcType:jdbc操作的数据库类型
*/
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Boolean parameter, JdbcType jdbcType)
throws SQLException {
if(parameter) {
//true变1
ps.setInt(i, 1);
}else {
//false变0
ps.setInt(i, 0);
}
}
//数据库中(number)->java中(boolean)
@Override
public Boolean getNullableResult(ResultSet rs, String columnName) throws SQLException {
int sexNum = rs.getInt(columnName) ;//rs.getInt("stuno") ;
return sexNum == 1?true:false ;
}
@Override
public Boolean getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
int sexNum = rs.getInt(columnIndex) ;//rs.getInt(1)
return sexNum == 1?true:false ;
}
@Override
public Boolean getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
int sexNum = cs.getInt(columnIndex) ;//rs.getInt(1)
return sexNum == 1?true:false ;
}
}
studengtMapper.xml 需要稍加修改:
...
<!-- 查询:使用了类型转换器
1、如果 类中属性 和表中的字段 类型能够合理识别 (String-varchar2),则可以使用resultType;否则(boolean-number) 使用resultMap
2、如果 类中属性名 和表中的字段名能够合理识别 (stuNo -stuno)则可以使用resultType;否则(id-stuno) 使用resultMap
-->
<select id="queryStudentByStunoWithConverter" parameterType="int" resultMap="studentResult" >
select * from student where stuno = #{stuno}
</select>
<!--resultMap可以实现2个功能:1.类型转换。 2.属性-字段的映射关系 -->
<resultMap type="student" id="studentResult">
<!-- 分为主键id 和 非主键 result-->
<id property="stuNo" column="stuno" />
<result property="stuName" column="stuname" />
<result property="stuAge" column="stuage" />
<!-- stuSex使用类型转换-->
<result property="stuSex" column="stusex" javaType="boolean" jdbcType="INTEGER"/>
</resultMap>
...
<!-- 带转换器的增加 -->
<insert id="addStudentWithConverter" parameterType="student" >
insert into student(stuno,stuname,stuage,graname,stusex) values(#{stuNo},#{stuName},#{stuAge},#{graName} ,#{stuSex ,javaType=boolean ,jdbcType=INTEGER } )
</insert>
...
Mybatis内置别名
Mybatis输入参数说明
parameterType
类型为 简单类型(8个基本类型+String):#{任意值}
或者
${value}
,其中的标识符只能是value。
<select id="queryStudentByStuno" parameterType="int" resultMap="studentMapping" >
select * from student where stuno = ${value}或者写#{任意值}
</select>
parameterType
类型为 对象类型,#{属性值}
,${属性值}
,其中的标识符只能是属性值。
<select id="queryStudentBystuageOrstuName" parameterType="student" resultType="student" >
select stuno,stuname,stuage from student where stuage= #{stuAge} or stuname like '%${stuName}%'
</select>
注:#{ } 会自动给String类型加上’’ "(自动类型转换), ${ } 原样输出,但是适合于动态排序(动态字段)。
注:#{ } 可以防止SQL注入,${ }不防止SQL注入。
适合于动态排序例子:
<select id="queryStudentOrderBy" parameterType="string" resultType="student" >
select stuno,stuname,stuage from student order by ${value} asc
</select>
模糊查询写法:
<select id="queryStudentBystuAgeOrstuName" parameterType="student" resultType="student" >
select stuno,stuname,stuage from student where stuage= #{stuAge} or stuname like '%${stuName}%'
</select>
输入参数为级联属性(例子):
@Data
public class Address {
private String homeAddress;
private String schoolAddress;
}
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Student {
private int stuNo ;
private String stuName ;
private int stuAge ;
private String graName ;
private boolean stuSex ;
private Address address;//家庭、学校(嵌套属性)
<!-- 输入参数为 级联属性(根据地址查学生) -->
<select id="queryStudentByaddress" parameterType="student" resultType="student" >
select stuno,stuname,stuage from student where homeaddress = #{address.homeAddress} or schooladdress = '${address.schoolAddress}'
</select>
输入参数为HashMap(例子):
<select id="queryStudentBystuageOrstuNameWithHashMap" parameterType="HashMap" resultType="student" >
select stuno,stuname,stuage from student where stuage= #{stuAge} or stuname like '%${stuName}%'
</select>
<!--用map中key的值 匹配 占位符#{stuAge},如果匹配成功 就用map的value替换占位符-->