mybatis的git地址:GitHub - mybatis/mybatis-3: MyBatis SQL mapper framework for JavaMyBatis SQL mapper framework for Java. Contribute to mybatis/mybatis-3 development by creating an account on GitHub.https://github.com/mybatis/mybatis-3官方文档url:mybatis – MyBatis 3 | IntroductionGitHub - mybatis/mybatis-3: MyBatis SQL mapper framework for JavaMyBatis SQL mapper framework for Java. Contribute to mybatis/mybatis-3 development by creating an account on GitHub.https://github.com/mybatis/mybatis-3
mybatis框架是什么?有什么优点?
mybaties==》也叫Ibaties 它是一个开源,持久化,轻量级的框架
JDBC – SQL夹在Java代码块里,耦合度高导致硬编码内伤 – 维护不易且实际开发需求中sql是有变化,频繁修改的情况多见
Hibernate和JPA – 长难复杂SQL,对于Hibernate而言处理也 不容易 – 内部自动生产的SQL,不容易做特殊优化。 – 基于全映 射的全自动框架,大量字段的POJO进行部分映射时比较困难。 导致数据库性能下降。
对开发人员而言,核心sql还是需要自己优化
sql和java编码分开,功能边界清晰,一个专注业务、 一个专注数据。
全局配置文件详解:configuration(配置)
编写前准备:
导入mybaties所需要的jar包:mybatis-3.4.1.jar
导入访问数据库所需要的jar包:mysql-connector-java-5.1.37-bin.jar
编写全局配置文件,导入dtd
举例说明导入dtd文件,具有提示功能
eclipse或者myeclipse,找到window-->Preferences-->搜索xml-->xml Catalog后,如下图操作:
标签详解
properties(属性):
mybatis可以使用properties来引入外部properties配置文件的内容;
resource:引入类路径下的资源,类路径就是源码包下的文件,如src根目录下
url:引入网络路径或者磁盘路径下的资源
举例说明
<properties resource="dbconfig.properties"></properties>
settings包含很多重要的设置项
setting:用来设置每一个设置项
name:设置项名
value:设置项取值
举例说明
开启驼峰命名,如数据库列表是dept_name==>javabean中就可以写成,deptId,由于mybatis中有自定义高级映射【基于了解程度】
<settings>
<!--开启驼峰命名法-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!--开启懒加载,延迟加载,分步查询或者按需查询sql语句-->
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings> -->
typeAliases:别名处理器:可以为我们的java类型起别名,别名不区分大小写
举例说明
<typeAliases>
<!-- 1、typeAlias:为某个java类型起别名
type:指定要起别名的类型全类名;默认别名就是类名小写;employee
alias:指定新的别名
-->
<!-- <typeAlias type="com.oracle.mybatis.bean.Employee" alias="emp"/> -->
<!-- 2、package:为某个包下的所有类批量起别名
name:指定包名(为当前包以及下面所有的后代包的每一个类都起一个默认别名(类名小写),)
-->
<package name="com.oracle.mybatis.bean"/>
<!-- 3、批量起别名的情况下,使用@Alias注解为某个类型指定新的别名
注意:注解配置别名,需要与package连用
-->
</typeAliases>
environments:环境们,mybatis可以配置多种环境 ,default指定使用某种环境。可以达到快速切换环境。
environment:配置一个具体的环境信息;必须有两个标签;id代表当前环境的唯一标识
transactionManager:事务管理器;
type:事务管理器的类型;JDBC(JdbcTransactionFactory)|MANAGED(ManagedTransactionFactory), 自定义事务管理器:实现TransactionFactory接口.type指定为全类名
dataSource:数据源,
type:数据源类型;UNPOOLED(UnpooledDataSourceFactory)
|POOLED(PooledDataSourceFactory)
|JNDI(JndiDataSourceFactory)
自定义数据源:实现DataSourceFactory接口,type是全类名
举例说明
<environments default="mysql">
<!--
default="development":默认环境,可以切换
id:唯一标识
transactionManager:JDBC|MANAGED
自定义
dataSource:UNPOOLED|POOLED|JNDI
自定义
-->
<!-- <environment id="oracle">
<transactionManager type=""></transactionManager>
<dataSource type=""></dataSource>
</environment> -->
<environment id="mysql">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
databaseIdProvider:支持多数据库厂商的;
type="DB_VENDOR":VendorDatabaseIdProvider
作用就是得到数据库厂商的标识(驱动getDatabaseProductName()),mybatis就能根据数据库厂商标识来执行不同的sql;
MySQL,Oracle,SQL Server,xxxx
举例说明
<databaseIdProvider type="DB_VENDOR">
<!--在映射文件中,可以用value的值进行调用,实现了动态切换数据库厂商的实现-->
<property name="Mysql" value="mysql"/>
<property name="SQL Server" value="sqlserver"/>
<property name="Oracle" value="oracle" />
</databaseIdProvider>
mappers:将sql映射注册到全局配置中 -->
<mappers>
<!--
mapper:注册一个sql映射
注册配置文件
resource:引用类路径下的sql映射文件
mybatis/mapper/EmployeeMapper.xml
url:引用网路路径或者磁盘路径下的sql映射文件
file:///var/mappers/AuthorMapper.xml
注册接口
class:引用(注册)接口,
有sql映射文件,映射文件名必须和接口同名,并且放在与接口同一目录下;
没有sql映射文件,所有的sql都是利用注解写在接口上;
推荐:
比较重要的,复杂的Dao接口我们来写sql映射文件
不重要,简单的Dao接口为了开发快速可以使用注解;
</mappers>
举例说明
<mappers>
<!--当前例子是放在根目录下,即是src或者其他的源码包,如果想放在特定的包下,导入要加入包名,
如:
com/test/customerMapper.xml
-->
<mapper resource="customerMapper.xml"/>
</mappers>
数据库映射文件,即:开发过程中,带有命名xxxMapper.xml的文件配置详解
在这个文件中,我们以前可以用数据库直接映射javaBean属性,只要数据库列表与javaBean的属性名字相同或者驼峰命名法,我们就能够查到数据,在开发过程中,注意:我们经常是映射数据库接口,即dao层,下面我举例说明,映射dao层
简单的举例说明文件配置
<?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">
<!--
namespace:命名空间,绑定当前数据库接口,即dao层
-->
<mapper namespace="dao.CustomerDao">
<!--
Customer select(int id); ==>dao层方法
select:查询语句
id:唯一标识,绑定dao层中方法名,第二处绑定
resultType:查询结果,返回值类型,一般写全类名,如果开启了别名处理,就可以写上别名
select * from customer where id = #{id} and customer_name=#{customerName};==> 查询语句
#{id}==>获取从方法中传过来的参数,这个是通过原生jdbc的preparedStatement设置值,所以可以有效的防止sql注入
-->
<select id="select" resultType="po.Customer">
select * from customer where id = #{id} and customer_name=#{customerName};
</select>
</mapper>
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 id="getCustomer" resultType="po.Customer">
select * from customer where id = #{id} and customer_name=#{cus.customerName}
</select>
返回list集合:
//通过id查询多条记录,dao层
public List<Customer> getCustomers(String customer_name);
对应的mapper文件
<!-- resultType:集合里面的元素类型 -->
<select id="getCustomers" resultType="po.Customer">
SELECT * FROM customer WHERE customer_name LIKE #{customer_name};
</select>
返回map集合,没有指定封装规则
//传值map,dao层
public Map<String,Object> getMap(int id);
//对应的mapper文件
<!--
传值map
resultType:返回map类型
-->
<select id="getMap" resultType="map">
SELECT * FROM customer WHERE id=#{id};
</select>
返回map集合,指定封装规则,主键为map的key,当前javaBean为value
//查询customer,键值对改变,对应的dao层
//指定你需要的键,设置注解@MapKey("键名"),这个可以自己指定其他列作为key
@MapKey("id")
public Map<Integer, Customer> getMaps(int id);
//对应的mapper文件
<!-- key:主键,或者自己需要的key,
value:实体类对象
resultType:返回map中javaBean类型
-->
<select id="getMaps" resultType="po.Customer">
SELECT * FROM customer WHERE id=#{id};
</select>
参数获取
#{}:可以获取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
<setting name="jdbcTypeForNull" value="NULL"/>
mybatis高级映射,resultMap映射【开发重点】
级联属性:数据库1对1关系,数据库的关系如下图所示:
举例如下操作:association关键字查询
Emploee类中,有一个属性
//vo层,级联属性
private Deptartment dept;
//查询员工所对应的的部门,dao层
public Customer getCusDept(int id);
//对应的mapper文件
<!--
resultMap:高级映射,自定义映射
type:返回类型
id:标识符,对应,resultMap="getCusDept",相对应
column:对应的是数据库的列名
property:对应的是java属性名字
-->
<resultMap type="po.Customer" id="getCusDept">
<id column="id" property="id"/>
<result column="customer_name" property="customerName"/>
<result column="customer_password" property="customerPassword"/>
<!-- 方式一:级联方式查询 -->
<!-- <result column="id" property="dept.id"/>
<result column="dept_name" property="dept.dept_name"/> -->
<!-- 方式二:使用关键字association:联合
property:写的是java对象
javaType:必须要有,不可省略,java类型
对应的是一对一
开发中,多用这种方式
-->
<association property="dept" javaType="po.Deptartment">
<id column="id" property="id"/>
<result column="dept_name" property="dept_name"/>
</association>
</resultMap>
<select id="getCusDept" resultMap="getCusDept">
select *
from
customer c, dept d
where
c.fk_dept_cus_id=d.id and c.id=#{id};
</select>
数据库1对n,在javaBean,Deptartment类中,有一个属性
//多个员工
private List<Emploee> emploee;
举例如下操作:collection关键字查询
//查询当前部门中所有的员工信息,dao层
public Deptartment getDept(int id);
//对应的mapper文件
<resultMap type="po.Deptartment" id="getDept">
<id column="did" property="dept_id"/>
<result column="dept_name" property="dept_name"/>
<!--
collection:集合
property:java对象
ofType:指定集合元素的类型,不可省略
-->
<collection property="customers" ofType="po.Customer">
<id column="customer_id" property="customer_id"/>
<result column="customer_name" property="customerName"/>
<result column="customer_password" property="customerPassword"/>
<result column="fk_dept_cus_id" property="fk_dept_cus_id"/>
</collection>
</resultMap>
<select id="getDept" resultMap="getDept">
select
d.dept_id did,d.dept_name, c.customer_id,c.customer_name,c.customer_password
from
dept d
left join customer c
on
c.fk_dept_cus_id=d.dept_id
where
d.dept_id=#{dept_id};
</select>
大家有什么问题,欢迎在下方留言喔