-
setting:用来设置每一个设置项
-
name:设置项名
-
value:设置项取值
举例说明
开启驼峰命名,如数据库列表是dept_name==>javabean中就可以写成,deptId,由于mybatis中有自定义高级映射【基于了解程度】
-->
typeAliases:别名处理器:可以为我们的java类型起别名,别名不区分大小写
举例说明
environments:环境们,mybatis可以配置多种环境 ,default指定使用某种环境。可以达到快速切换环境。
-
environment:配置一个具体的环境信息;必须有两个标签;id代表当前环境的唯一标识
-
transactionManager:事务管理器;
-
type:事务管理器的类型;JDBC(JdbcTransactionFactory)|MANAGED(ManagedTransactionFactory), 自定义事务管理器:实现TransactionFactory接口.type指定为全类名
-
dataSource:数据源,
type:数据源类型;UNPOOLED(UnpooledDataSourceFactory)
|POOLED(PooledDataSourceFactory)
|JNDI(JndiDataSourceFactory)
自定义数据源:实现DataSourceFactory接口,type是全类名
举例说明
databaseIdProvider:支持多数据库厂商的;
type=“DB_VENDOR”:VendorDatabaseIdProvider
作用就是得到数据库厂商的标识(驱动getDatabaseProductName()),mybatis就能根据数据库厂商标识来执行不同的sql;
MySQL,Oracle,SQL Server,xxxx
举例说明
mappers:将sql映射注册到全局配置中 -->
数据库映射文件,即:开发过程中,带有命名xxxMapper.xml的文件配置详解
在这个文件中,我们以前可以用数据库直接映射javaBean属性,只要数据库列表与javaBean的属性名字相同或者驼峰命名法,我们就能够查到数据,在开发过程中,注意:我们经常是映射数据库接口,即dao层,下面我举例说明,映射dao层
简单的举例说明文件配置
<?xml version="1.0" encoding="UTF-8" ?>select * from customer where id = #{id} and customer_name=#{customerName};
dao层传参说明:
- 单个参数:mybatis不会做特殊处理,
#{参数名/任意名}:取出参数值。
- 多个参数:mybatis会做特殊处理。
多个参数会被封装成 一个map,
key:param1…paramN,或者参数的索引也可以
value:传入的参数值
#{}就是从map中获取指定的key的值;
注意:抛出异常
org.apache.ibatis.binding.BindingException:
Parameter ‘id’ not found.
Available parameters are [1, 0, param1, param2]
操作:
方法:public Employee getEmpByIdAndLastName(Integer id,String lastName);
取值:#{id},#{lastName}==>正确如下
【命名参数】:明确指定封装参数时map的key;@Param(“id”)
多个参数会被封装成 一个map,
key:使用@Param注解指定的值
value:参数值
#{指定的key}取出对应的参数值
举例说明
//多参数取值,传值,dao层
public Customer getCustomer(@Param(“id”)int id,@Param(“cus”)Customer customer);
对应的mapper文件
select * from customer where id = #{id} and customer_name=#{cus.customerName}
- 返回list集合:
//通过id查询多条记录,dao层
public List getCustomers(String customer_name);
对应的mapper文件
SELECT * FROM customer WHERE customer_name LIKE #{customer_name};
- 返回map集合,没有指定封装规则
//传值map,dao层
public Map<String,Object> getMap(int id);
//对应的mapper文件
SELECT * FROM customer WHERE id=#{id};
- 返回map集合,指定封装规则,主键为map的key,当前javaBean为value
//查询customer,键值对改变,对应的dao层
//指定你需要的键,设置注解@MapKey(“键名”),这个可以自己指定其他列作为key
@MapKey(“id”)
public Map<Integer, Customer> getMaps(int id);
//对应的mapper文件
SELECT * FROM customer WHERE id=#{id};
- 参数获取
#{}:可以获取map中的值或者pojo对象属性的值;
${}:可以获取map中的值或者pojo对象属性的值;
select * from tbl_employee where id=${id} and last_name=#{lastName}
Preparing: select * from tbl_employee where id=2 and last_name=?
区别:
#{}:是以预编译的形式,将参数设置到sql语句中;PreparedStatement;防止sql注入
${}:取出的值直接拼装在sql语句中;会有安全问题;
大多情况下,我们去参数的值都应该去使用#{};
原生jdbc不支持占位符的地方我们就可以使用${}进行取值
比如分表、排序。。。;按照年份分表拆分
select * from ${year}_salary where xxx;
select * from tbl_employee order by ${f_name} ${order}
#{}:更丰富的用法:
规定参数的一些规则:
javaType、 jdbcType、 mode(存储过程)、 numericScale、
resultMap、 typeHandler、 jdbcTypeName、 expression(未来准备支持的功能);
jdbcType通常需要在某种特定的条件下被设置:
在我们数据为null的时候,有些数据库可能不能识别mybatis对null的默认处理。比如Oracle(报错);
JdbcType OTHER:无效的类型;因为mybatis对所有的null都映射的是原生Jdbc的OTHER类型,oracle不能正确处理;
由于全局配置中:jdbcTypeForNull=OTHER;oracle不支持;两种办法
1、#{email,jdbcType=OTHER};
2、jdbcTypeForNull=NULL
mybatis高级映射,resultMap映射【开发重点】
- 级联属性:数据库1对1关系,数据库的关系如下图所示:
举例如下操作:association关键字查询
Emploee类中,有一个属性
//vo层,级联属性
private Deptartment dept;
//查询员工所对应的的部门,dao层
public Customer getCusDept(int id);
//对应的mapper文件
select *
from
customer c, dept d
where
c.fk_dept_cus_id=d.id and c.id=#{id};
数据库1对n,在javaBean,Deptartment类中,有一个属性
//多个员工
private List emploee;