mybatis的git地址:https://github.com/mybatis/mybatis-3
官方文档url:https://mybatis.org/mybatis-3/
mybaties==》也叫Ibaties 它是一个开源,持久化,轻量级的框架
JDBC – SQL夹在Java代码块里,耦合度高导致硬编码内伤 – 维护不易且实际开发需求中sql是有变化,频繁修改的情况多见
Hibernate和JPA – 长难复杂SQL,对于Hibernate而言处理也 不容易 – 内部自动生产的SQL,不容易做特殊优化。 – 基于全映 射的全自动框架,大量字段的POJO进行部分映射时比较困难。 导致数据库性能下降。
对开发人员而言,核心sql还是需要自己优化
sql和java编码分开,功能边界清晰,一个专注业务、 一个专注数据。
eclipse或者myeclipse,找到window-->Preferences-->搜索xml-->xml Catalog后,如下图操作:
mybatis可以使用properties来引入外部properties配置文件的内容;
举例说明
举例说明
开启驼峰命名,如数据库列表是dept_name==>javabean中就可以写成,deptId,由于mybatis中有自定义高级映射【基于了解程度】
-->
举例说明
type:数据源类型;UNPOOLED(UnpooledDataSourceFactory)
|POOLED(PooledDataSourceFactory)
|JNDI(JndiDataSourceFactory)
自定义数据源:实现DataSourceFactory接口,type是全类名
举例说明
type="DB_VENDOR":VendorDatabaseIdProvider
作用就是得到数据库厂商的标识(驱动getDatabaseProductName()),mybatis就能根据数据库厂商标识来执行不同的sql;
MySQL,Oracle,SQL Server,xxxx
举例说明
在这个文件中,我们以前可以用数据库直接映射javaBean属性,只要数据库列表与javaBean的属性名字相同或者驼峰命名法,我们就能够查到数据,在开发过程中,注意:我们经常是映射数据库接口,即dao层,下面我举例说明,映射dao层
简单的举例说明文件配置
dao层传参说明:
#{参数名/任意名}:取出参数值。
多个参数会被封装成 一个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文件
//通过id查询多条记录,dao层
public List getCustomers(String customer_name);
对应的mapper文件
//传值map,dao层
public Map getMap(int id);
//对应的mapper文件
//查询customer,键值对改变,对应的dao层
//指定你需要的键,设置注解@MapKey("键名"),这个可以自己指定其他列作为key
@MapKey("id")
public Map getMaps(int id);
//对应的mapper文件
- 参数获取
#{}:可以获取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
举例如下操作:association关键字查询
Emploee类中,有一个属性
//vo层,级联属性
private Deptartment dept;
//查询员工所对应的的部门,dao层
public Customer getCusDept(int id);
//对应的mapper文件
数据库1对n,在javaBean,Deptartment类中,有一个属性
//多个员工
private List
举例如下操作:collection关键字查询
//查询当前部门中所有的员工信息,dao层
public Deptartment getDept(int id);
//对应的mapper文件
大家有什么问题,欢迎在下方留言喔