1.properties
数据库的property属性都是可外部配置且可动态替换的,在 Mybatis学习笔记(一)中了解到可通过直接在mybatis-config.xml进行如下配置
<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="mysql"/>
下面介绍一种外部配置的方式,通过properties元素的子元素来传递。
step1:在项目根路径下,新建一个jdbc.properties文件,通过键值对的方式写入数据库相关配置信息
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis
username=root
password=mysql
step2:将properties文件引入配置文件
<properties resource="jdbc.properties"></properties>
step3:替换数据库相关配置信息
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
这个例子中数据库driver、url、username、password都会由properties 文件中设置的相应值来替换,这样就为配置提供了诸多灵活选择。
如果属性在不只一个地方进行了配置,那么 MyBatis 将按照下面的顺序来加载:
- 在 properties 元素体内指定的属性首先被读取。
- 然后根据 properties 元素中的 resource 属性读取类路径下属性文件或根据 url 属性指定的路径读取属性文件,并覆盖已读取的同名属性。
- 最后读取作为方法参数传递的属性,并覆盖已读取的同名属性。
因此,通过方法参数传递的属性具有最高优先级,resource/url 属性中指定的配置文件次之,最低优先级的是 properties 属性中指定的属性。
2.typeAliases 别名
如果我们遇到的类的权限定名过长,我们需要用一个简短的名称去指代它,这样就可以在mybatis上下文使用。分为系统定义别名和自定义别名。
自定义别名:
<typeAliases>
<typeAlias alias="ss" type="com.pojo.Students"/>
</typeAliases>
通过包名的方式定义别名,在没有注解的情况下,会使用 类名 的首字母小写的非限定类名来作为它的别名。 比如 domain.blog.Author 的别名为 author;若有注解,则别名为其注解值。
<typeAliases>
<!-- <typeAlias alias="ss" type="com.pojo.Students"/> -->
<package name="com.pojo"/>
</typeAliases>
@Alias("author")
public class Author {
...
}
常见的java类型别名:
3.mybatis日志的使用
以log4j为例:
step1:在mybatis-config.xml配置文件里指定 MyBatis 所用日志的具体实现
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
step2:导入log4j-1.2.17.jar包和log4j.properties配置文件
### set log levels ###
log4j.rootLogger = INFO , console , debug , error
### console ###
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern = %-d{yyyy-MM-dd HH\:mm\:ss} [%p]-[%c] %m%n
### log file ###
log4j.appender.debug = org.apache.log4j.DailyRollingFileAppender
log4j.appender.debug.File = mybatis.log
log4j.appender.debug.Append = true
log4j.appender.debug.Threshold = INFO
log4j.appender.debug.layout = org.apache.log4j.PatternLayout
log4j.appender.debug.layout.ConversionPattern = %-d{yyyy-MM-dd HH\:mm\:ss} [%p]-[%c] %m%n
### exception ###
log4j.appender.error = org.apache.log4j.DailyRollingFileAppender
log4j.appender.error.File = mybatis_error.log
log4j.appender.error.Append = true
log4j.appender.error.Threshold = ERROR
log4j.appender.error.layout = org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern = %-d{yyyy-MM-dd HH\:mm\:ss} [%p]-[%c] %m%n
Log4j由三个重要的组件构成:日志信息的优先级,日志信息的输出目的地,日志信息的输出格式。日志信息的优先级从低到高有DEBUG、INFO、WARN、ERROR、FATAL分别用来指定这条日志信息的重要程度(这里设置的是INFO ,可根据需要进行修改);日志信息的输出目的地指定了日志将打印到控制台还是文件中;而输出格式则控制了日志信息的显示内容。
step3:在测试程序进行测试
在测试类中定义
private static Logger logger=Logger.getLogger(Main.class);
将原先要打印在控制台的内容,换成日志信息打印在控制台。
结果输出:
如果要改用SLF4J日志,只需在现在基础上添加slf4j-api-1.7.25.jar和slf4j-log4j12-1.7.25.jar两个jar包,再将配置文件里的日志指定为SLF4J即可。
<setting name="logImpl" value="SLF4J"/>
4.自定义 TypeHandler
你可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。
具体做 法 为 : 实 现 org.apache.ibatis.type.TypeHandler 接 口 , 或 继 承 一 个 很 便 利 的类org.apache.ibatis.type.BaseTypeHandler然后可以选择性地将它映射到一个 JDBC 类型。
假设表 STUDENTS 有一个 PHONE 字段,类型为 VARCHAR(15),而 JavaBean Student 有一个 PhoneNumber 类定义类型的 phoneNumber 属性
package com.pojo;
public class PhoneNumber
{
private String countryCode;
private String stateCode;
private String number;
public PhoneNumber()
{
}
public PhoneNumber(String countryCode, String stateCode, String
number)
{
this.countryCode = countryCode;
this.stateCode = stateCode;
this.number = number;
}
public PhoneNumber(String string)
{
if(string != null)
{
String[] parts = string.split("-");
if(parts.length > 0) this.countryCode = parts[0];
if(parts.length > 1) this.stateCode = parts[1];
if(parts.length > 2) this.number = parts[2];
}
}
public String getAsString()
{
return countryCode + "-" + stateCode + "-" + number;
}
public String getCountryCode() {
return countryCode;
}
public void setCountryCode(String countryCode) {
this.countryCode = countryCode;
}
public String getStateCode() {
return stateCode;
}
public void setStateCode(String stateCode) {
this.stateCode = stateCode;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
}
public class Students {
private int stu_id;
private String name;
private String email;
private Date dob;
private int age;
private PhoneNumber phone;
StudentsMapper.xml做如下配置
<insert id="addStudents">
insert into students(name,email,dob,phone)values(#{name},#{email},#{dob},#{phone})
</insert>
这里,phone 参数需要传递给#{phone};而 phone 对象是 PhoneNumber 类型。然而,MyBatis 并不知道该怎样来处理这个类型的对象。
为了让 MyBatis 明白怎样处理这个自定义的 Java 对象类型,如 PhoneNumber,我们可以创建一个自定义的类型处理器,如下所示:
Step1:
1. MyBatis 提供了抽象类 BaseTypeHandler<T> ,我们可以继承此类创建自定义类型处理器。
package com.typeHandeler;
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;
import org.apache.ibatis.type.MappedJdbcTypes;
import com.pojo.PhoneNumber;
public class PhoneTypeHandler extends BaseTypeHandler<PhoneNumber> {
//字符串到对象的转换
@Override
public PhoneNumber getNullableResult(ResultSet rs, int arg1) throws SQLException {
// TODO Auto-generated method stub
return new PhoneNumber(arg0.getString(arg1));//拿数据库里的这个查询结果集,构建一个PhoneNumber对象
}
@Override
public PhoneNumber getNullableResult(CallableStatement arg0, int arg1) throws SQLException {
// TODO Auto-generated method stub
return new PhoneNumber(arg0.getString(arg1));
}
//对象到字符串的转换
@Override
public void setNonNullParameter(PreparedStatement ps, int i, PhoneNumber phone, JdbcType arg3)
throws SQLException {
// TODO Auto-generated method stub
ps.setString(i, phone.getAsString());//预处理语句的第i个问号,设置为phone的getAsString形式值
}
@Override
public PhoneNumber getNullableResult(ResultSet arg0, String arg1) throws SQLException {
// TODO Auto-generated method stub
return new PhoneNumber(arg0.getString(arg1));
}
}
step2: 在 mybatis-config.xml 中注册自定义的 TypeHandler
<typeHandlers>
<typeHandler handler="com.typeHandeler.PhoneTypeHandler"/>
</typeHandlers>
step3:测试添加一个对象
Students s=new Students("王五","66666@qq.com",new Date(),new PhoneNumber("152","456","789"));
sm.addStudents(s);
logger.info("增加一个学生");
sqlSession.commit();
在数据库查询增加结果
Mybatis学习笔记(三)之主键回填、一对一映射:https://blog.csdn.net/qq_42922647/article/details/91458626