优化:
1.可以将配置信息单独放入db.properties文件,然后再动态引入
driver=oracle.jdbc.OracleDriver url=jdbc:oracle:thin:@127.0.0.1:1521:mldn username=scott password=tiger
db.properties:
k=v;
<configuration>
<properties resource="db.properties"/>
引入之后,使用${key}
<property name="driver" value="${driver}"></property>
<property name="url" value="${url}"></property> <property name="username" value="${username}"></property> <property name="password" value="${password}"></property>
2.MyBaties全局参数
<!-- 一般不设置MyBaties全局参数
<settings>
<setting name="" value=""/>
</settings> -->
3.别名
a.设置单个别名
b.批量设置别名
<!--设置单个/多个别名 --> <typeAliases> <!--单个别名(别名忽略大小写) --> <!-- <typeAlias type="org.myy.entity.Student" alias="student"/> --> <!--批量定义别名(别名忽略大小写) 以下会自动将该包中的所有类批量定义别名 :别名就是类名(不带包名,忽略大小写) -->
<package name="org.myy.entity"/>
</typeAliases>
除了自定义别名外,MyBaties还内置了一些常见类的别名
类型处理器(类型转换器)
1.MyBatis自带一些常见的类型处理器
int-number
2.自定义MyBatis类型处理器
java-数据库(jdbc类型)
示例:
实体类Student:boolean stuSex
true:男
false:女
表student:number stuSex
1:男
0:女
自定义类型转换器(boolean-number)步骤
a.创建类型转换器:需要实现TypeHandler接口
通过阅读源码发现,此接口有一个实现类BaseTypeHandler,因此要实现转换器有2种选择:
i.实现接口TypeHandler
ii.继承BaseTypeHandler
/MyBatisProject3/src/org/myy/converter/BooleanAndIntConverter.java
package org.myy.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)->DB(number) /* * ps:PreparedStatement对象 * i:PreparedStatement对象操作参数的位置 * parameter:java值 * jdbcType:jdbc操作的数据库类型 * 2:true 1:false * */ @Override public void setNonNullParameter(PreparedStatement ps, int i, Boolean parameter, JdbcType jdbcType) throws SQLException { if(parameter) { //2 ps.setInt(i, 2); }else { //1 ps.setInt(i, 1); } } //DB(number)->java(boolean) @Override public Boolean getNullableResult(ResultSet rs, String columnName) throws SQLException { int sexNum=rs.getInt(columnName); // if(sexNum==1) return true; // else return false; return sexNum==2?true:false; } @Override public Boolean getNullableResult(ResultSet rs, int columnIndex) throws SQLException { int sexNum=rs.getInt(columnIndex); return sexNum==2?true:false; } @Override public Boolean getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { int sexNum=cs.getInt(columnIndex); return sexNum==2?true:false; } }
b.配置conf.xml
/MyBatisProject3/src/conf.xml
<typeHandlers> <typeHandler handler="org.myy.converter.BooleanAndIntConverter" javaType="Boolean" jdbcType="INTEGER"/> </typeHandlers>
/MyBatisProject3/src/org/myy/mapper/studentMapper.xml
<select id="queryStudentByStunoWithConverter" parameterType="int" resultMap="studentResult"> select * from student1 where stuno=#{stuno} </select> <resultMap type="student" id="studentResult"> <!-- 分为主键id和非主键result --> <id property="id" column="stuno"/> <result property="stuName" column="stuname"/> <result property="stuAge" column="stuage"/> <result property="graName" column="graname"/> <result property="stuSex" column="stusex" javaType="boolean" jdbcType="INTEGER"/> </resultMap> <insert id="addStudentWithConverter" parameterType="student"> insert into student1(stuno,stuname,stuage,graname,stusex) values(#{id},#{stuName},#{stuAge},#{graName},#{stuSex,javaType=boolean,jdbcType=INTEGER}) </insert>
需要的注意的问题:INTEGER
insert into student1(stuno,stuname,stuage,graname,stusex) values(#{stuNo},#{stuName},#{stuAge},#{graName},#{stuSex,javaType=boolean,jdbcType=INTEGER})
注意#{stuNo}中存放的是属性值,需要严格区分大小写
resultMap可以实现2个功能
1.类型转换
2.属性-字段的映射关系