properties标签
作用:可以引入外部的资源文件
有两个属性:
-
resource
:引入类路径下的资源文件 -
url
:引入网络或者磁盘路径下的资源
对昨天的案例我们进行修改,首先我们先创建一个properties资源文件:dbconfig.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=root
然后我们在全局配置文件中使用<properties>
标签将其引入:
<properties resource="dbconfig.properties"></properties>
然后我们对于全局配置文件中的数据源的配置可以使用${name}
来修改,其中name
是资源文件中配置的名字:
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
修改后全局的配置文件如下:
<?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>
<!--
mybatis可以使用properties来引入外部properties配置文件的内容
属性:
resource:引入类路径下的资源
url:引入网络或者磁盘路径下的资源
-->
<properties resource="dbconfig.properties"></properties>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- 将我们写好的sql映射文件一定要注册到全局配置文件中 -->
<mappers>
<mapper resource="EmployeeMapper.xml"/>
</mappers>
</configuration>
运行昨天的测试代码:
package com.cerr.mybatis;
import com.cerr.mybatis.dao.EmployeeMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import static org.junit.Assert.*;
public class MyBatisTest {
//获取SQLSessionFactory
public SqlSessionFactory getSqlSessionFactory() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
return new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void test1() throws IOException {
//获取SqlSessionFactory
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
//获取SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
//获取接口的实现类对象:会为接口自动的创建一个代理对象,代理对象去执行增删改查
EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
//调用方法
Employee employee = employeeMapper.getEmpById(1);
//打印
System.out.println(employee);
}finally {
//关闭
sqlSession.close();
}
}
}
能够正常查询,即配置成功。
settings标签
这是MyBatis中极为重要的调整设置,他们会改变MyBatis的运行时行为。
我们的tb1_employee数据表中,有一个字段名是last_name,这个字段名在对应的bean中的属性名是lastName,如果在查询时select * from tb1_employee ;
是无法给这个lastName属性赋值的,而我们现在想使其能赋值,所以我们可以使用settings
标签中的一个参数mapUnderscoreToCamelCase
来实现,这个参数表示是否开启自动驼峰命名规则映射,即从数据库列名的A_COLUMN到Java属性名aColumn的类似映射。
我们现在设置其参数为true
,表示开启自动驼峰命名规则映射。
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
完整的配置信息如下:
<?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="dbconfig.properties"></properties>
<!--
包含有很多重要的设置项
setting:用来设置每一个设置项目
name:设置项名
value:设置项值
-->
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- 将我们写好的sql映射文件一定要注册到全局配置文件中 -->
<mappers>
<mapper resource="EmployeeMapper.xml"/>
</mappers>
</configuration>
而EmployeeMapper.xml文件中的配置如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cerr.mybatis.dao.EmployeeMapper">
<select id="getEmpById" resultType="com.cerr.mybatis.Employee">
select * from tb1_employee where id = #{id}
</select>
</mapper>
运行后能够成功得为lastName
属性赋值。
具体剩下的参数可以参考官方文档。
typeAliases标签
别名处理器,可以为我们的Java类型取别名。对于起别名的方式,有三种:
- 为某个类型起别名
- 为某个包下的所有类批量起别名
- 在批量处理的情况下为某个类起新的别名
使用typeAlias为某个类型起别名
为某个类型起别名,该标签有两个属性:
-
type
:指定要起别名的类型全类名 -
alias
:指定新的别名,如果没有写就起默认别名,默认别名就是类型小写(但是大写也行,因为不区分大小写)。
<typeAliases>
<typeAlias type="com.cerr.mybatis.Employee" alias="emp"/>
</typeAliases>
上述示例为我们的com.cerr.mybatis.Employee起别名为emp,接下来需要用到该类的时候我们就不需要再写全类名了,而是直接使用emp即可。
使用package为某个包下的所有类批量起别名
有一个属性:name属性
:指定包名(为当前包以及下面的所有后代包的每一个类都其一个默认别名,默认是类名小写(但是大写也行,因为不区分大小写)
<typeAliases>
<package name="com.cerr.mybatis"/>
</typeAliases>
上述示例为我们的com.cerr.mybatis
包下的所有类和后代包起了别名,别名为类名小写,例如com.cerr.mybatis
。
但是这样的话对我们来说也不是很方便,如果该包下面有一个子包里面有一个类和该包的类名一样,就会起冲突,因此我们在使用package
时可以配合第三种来使用。
使用@Alias
注解来起别名
这个一定要在配置文件中有使用package
的情况下才能使用。
在批量起别名的情况下,可以使用@Alias
注解为某个类型指定新的别名。
package com.cerr.mybatis;
import org.apache.ibatis.type.Alias;
@Alias("emp")
public class Employee {
private Integer id;
private String lastName;
private String email;
private String gender;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
@Override
public String toString() {
return "Employee{" +
"id=" + id +
", lastName='" + lastName + '\'' +
", email='" + email + '\'' +
", gender='" + gender + '\'' +
'}';
}
}
上述代码中就使用了@Alias
为该类取名为emp
。
environments标签
mybatis可以配置多种环境,可以通过deafult
属性来指定使用某种环境,可以达到快速切换环境。
<environments>
里面的子标签<environment>
可配置一个具体的环境信息,id表示当前环境的唯一标识。<environment>
必须有<transactionManager>
和<dataSource>
标签。
<transactionManager>
标签
<transactionManager>
标签是事务管理器,有一个type
属性,指定的是事务管理器的类型。有两个参数值可以指定:
-
JDBC
:使用JdbcTransactionFactory
-
MANAGED
:使用ManagedTransactionFactory
也可以使用自定义事务管理器:只要实现TransactionFactory接口就行,type指定为实现类的全类名。
<dataSource>
标签
<dataSource>
是数据源。有一个type
属性,有三个参数值可以指定:
-
UNPOOLED
:不使用连接池,即使用UnpooledDataSourceFactory
-
POOLED
:使用连接池,即使用PooledDataSourceFactory
-
JNDI
:使用JNDI技术,即使用JndiDataSourceFactory
也可以使用自定义的数据源:实现DataSourceFactory
接口,type
是实现接口的类的全类名。
示例:配置数据库信息
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
databaseIdProvider标签
支持多数据库厂商。
<databaseIdProvider type="DB_VENDOR"></databaseIdProvider>
上述代码中的type="DB_VENDOR"
中的DB_VENDOR
指的是VendorDatabaseIdProvider
,作用就是得到数据库厂商的标识(驱动自带),myBatis就能够根据不同的数据库来执行不同的sql语句。
里面还有一个<property>
的子标签,作用是给数据库厂商的标识起别名。
例如:
<databaseIdProvider type="DB_VENDOR">
<!-- 为不同的数据库厂商起别名 -->
<property name="MySQL" value="mysql"/>
<property name="Oracle" value="oracle"/>
<property name="SQL Server" value="sqlserver"/>
</databaseIdProvider>
然后还需在局部配置文件中配置数据库语句。
在局部配置文件中给其配置
上述代码是可以得到数据库厂商的标识并给数据库厂商的标识起别名的,然后我们需要在局部的配置文件中的标签中标识是哪一个语句对应哪一个数据库。
在局部配置文件中的语句标签中有一个databaseId
属性,就可以指明使用的哪种数据库。
例如我们可以对一条查询语句进行多种定义,使其支持不同的数据库。
在EmployeeMapper.xml
文件中配置:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cerr.mybatis.dao.EmployeeMapper">
<select id="getEmpById" resultType="com.cerr.mybatis.Employee">
select * from tb1_employee where id = #{id}
</select>
<select id="getEmpById" resultType="com.cerr.mybatis.Employee" databaseId="mysql">
select * from tb1_employee where id = #{id}
</select>
<select id="getEmpById" resultMap="com.cerr.mybatis.Employee" databaseId="oracle">
select * from employees where id = #{id}
</select>
</mapper>
这样配置之后,MyBatis会根据你使用的数据库环境来自动地执行不同的sql语句。
mappers标签
将sql映射注册到全局配置中,每一个mapper
就是注册一个sql映射。
对于<mapper>
标签,有三个属性:
-
resource
:引用类路径下的sql映射文件,如果是在包下面的,要将包名写进去,包级之间使用/
而不是.
,例如com.mapper
包应该写为com/mapper
-
url
:引用网络或磁盘路径下的sql映射文件 -
class
:引用接口。
将xml配置文件放在resource
<mappers>
<mapper resource="EmployeeMapper.xml"/>
</mappers>
基于class来引用注册接口
-
要有sql映射文件,且映射文件名必须和接口同名,并且与接口放在同一目录下。
- 没有sql映射文件,所有的sql都是利用注解写在接口上。
package com.cerr.mybatis.dao;
import com.cerr.mybatis.Employee;
import org.apache.ibatis.annotations.Select;
public interface EmployeeMapperAnnotation {
@Select("select * from tb1_employee where id = #{id}")
public Employee getEmpById(Integer id);
}
<mappers>
<mapper class="com.cerr.mybatis.dao.EmployeeMapperAnnotation"/>
</mappers>
对于一些比较重要的,复杂的dao接口我们使用sql映射文件;而对于一些简单的dao接口我们可以直接使用注解来快速开发。
使用<package>
批量注册
我们可以使用<package>
来批量注册某一个包下的sql映射文件。既适用于基于注解的接口,也适用于非注解的接口,但是非注解的接口要和对应的xml文件放在同一个包下,与基于class来引用注册接口的第一种情况一样。
<mappers>
<!-- 批量注册 -->
<package name="com.cerr.mybatis.dao"/>
</mappers>