Mybatis 概述及搭建
原是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation 迁移到了 Google Code,随着开发团队转投GoogleCode 旗下, iBatis3.x正式更名为MyBatis。
MyBatis 是一款优秀的持久层框架。
MyBatis 避免了几乎所有的 JDBC 代码手动设置参数以及手动获取结果集的操作。 Mybatis 将基本的 JDBC 常用接口封装,对外提供操作即可. MyBatis 可以使用 XML 或注解来配置和映射,将数据库中的记录映射成Java 的 POJO(Plain Old Java Objects,普通的 Java 对象),是一种ORM(ORMObject Relational Mapping 对象关系映射)实现. 它支持动态 SQL 以及数据缓存. Mybatis 中文官网 https://mybatis.org/mybatis-3/zh_CN/index.html
MyBatis 环境搭建
1.创建一张表和表对应的实体类
2.导入 MyBatis jar 包,mysql 数据库驱动包
<dependency>
<groupld>org.mybatis</groupld>
<artifactld>mybatis</artifactld>
<version>3.4.2</version>
</dependency>
3. 创建 MyBatis 全局配置文件
<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="" />
<property name="url" value="" />
<property name="username" value="" />
<property name="password" value=""/>
</dataSource>
</environment>
</environments>
</configuration>
4 定义接口
在接口中定义方法
public interface AdminDao{
Admin findAdminById(int id);
}
5 创建 sql 映射文件
<?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="接口的地址">
<select id="findAdminByld" parameterType="int" resultType="com.ffyc.mybatis.model.Admin">
select *from admin where id = #{id}
</select></mapper>
测试Mybatis
读取配置文件
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
根据官网
创建 SqlSessionFactory
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
创建 SqlSession
SqlSession sqlSession = sessionFactory.openSession();
获得接口代理对象
sqlSession.getMapper(接口.class);
sqlSession .close();关闭
API 接口说明
SqlSessionFactory 接口
使用 SqlSessionFactory 来创建 SqlSession,一旦创建SqlSessionFactory就会在整个应用过程中始终存在。由于创建开销较大,所以没有理由去销毁再创建它,一个应用运行中也不建议多次创建 SqlSessionFactory。
SqlSession 接口
Sqlsession 意味着创建与数据库链接会话,该接口中封装了对数据库操作的方法,与数据库会话完成后关闭会话。
Mybatis-Dao 层面向接口开发
面向接口开发方式只需要程序员编写接口,由 Mybatis 框架创建接口的动态代理对象,使用 sqlsession.getMapper(接口.class);获得代理对象. 面向接口开发需要遵循以下规范:
1、 Mapper.xml 文件中的 namespace 与 mapper 接口的类路径相同.
2、 Mapper 接口方法名和 Mapper.xml 中定义的每个statement 的id相同.
3、 Mapper 接口方法的输入参数类型和 mapper.xml 中定义的每个sql 的parameterType 的类型相同.
4、 Mapper 接口方法的输出参数类型和 mapper.xml 中定义的每个sql 的resultType 的类型相同.
Mybatis书写
单个参数传递时如上述规范3 ,单个参数传递时直接绑定
多个参数使用
@Param(“id”)绑定
数据访问层Dao:
Admin selectAdmins
(@Param(“account”)String account, @Param(“password”)String password);
关系映射层Mapper
<select id="selectAdmins" resultType="Admin">
select id, account, passwordfrom adminwhere account= #{account} and password=#{password}
</select>
例如上述如果没有Param Mybatis只知道传过来两个String类型 的参数.但是不知道那个是account那个是password 所以需要@Param进行参数绑定.
如果传入一个复杂的对象,就需要使用 parameterType 参数进行类型定义,
例如: void insertAdmin(Admin admin);
<insert id="insertAdmin" parameterType="Admin">
insert into admin(id, account, password)values (#{id}, #{account}, #{password})
</insert>
注意此时 Admin类中的属性要和#{} 内的方法属性名称相同
增删改查
<insert id="唯一标识"
useGeneratedKeys="把新增加的主键赋值到自己定义的keyProperty"keyProperty="接收主键的属性"
parameterType="参数类型">
insert into
admin(account,password)values(#{account},#{password})
</insert>
解释
useGeneratedKeys="true"
该属性告诉 MyBatis 启用自动生成的主键(通常是自增主键)。当插入记录时,数据库会自动生成主键,并将主键值返回给 MyBatis
keyProperty="接收主键的属性"
keyProperty
指定 Java 对象中用于接收数据库生成主键的属性。MyBatis 会将数据库生成的主键值赋给这个属性。假设你有一个 Admin
对象,主键字段可能是 id
,那么 keyProperty
就应为 "id"
。
场景适用于数据库主键是自增类型
假设你有一个 Admin
类,并且该类有 id
, account
, password
三个属性。你想插入 account
和 password
,并希望数据库自动生成 id
,然后把生成的 id
映射回 Admin
对象的 id
属性。
作用:
举个例子,插入管理员的账号密码获取id映射到admin对象中 就可以用刚刚获取到的id立即进行插入另一张管理员的权限关系表.
修改
<update id="唯一标识" parameterType=“参数类型">
update admin set account= #{account},password= #{password} whereid= #{id}
</update>
删除
<delete id="唯一标识" parameterType="参数类型">
delete from admin where id= #{id}
</delete>
查询
<select id="唯一标识" resultType="返回结果集类型">
select * from admin where id= #{id}
</select>
简单类型输出映射 返回简单基本类型
<select id="findAdminInfoCount" resultType="int">
select count(*) from admin
</select>
对象映射
如果表中的类名与类中的属性名完全相同,mybatis会自动将查询结果封装到POJO对象中. 如果java中使用标准驼峰命名,数据库中使用下划线连接命名,可以开始全局设置实现自动转换
<setting name="mapUnderscoreToCamelCase" value="true"/>
对象映射
<select id="findUserInfoById" parameterType="int"resultType="Admin">
select * from admin where id=#{id}
</select>
#{} 和${}区别
#{} 占位符,是经过预编译的,编译好 SQL 语句再取值,#方式能够防止sql 注入#{}:
delete from admin where id=#{id} 结果: delete from admin where id = ?
${}会将将值以字符串形式拼接到 sql 语句, ${ }方式无法防止Sql 注入${}:
delete from admin where id=’${id}’ 结果: delete from admin where id=’1’
一般是#{ } 向 sql 传值使用, 而使用${ }向 sql 传列名例如在 order by $ {column} 语句后面可以动态替换列名
特殊处理定义 resultMap
定义 resutlMap
<resultMap id="adminResultMap" type="Admin">
<id column="id" property="id"/>
<result property="account" column="account" />
<result property="password" column="password" />
</resultMap><select id="findAdminInfoResultMap" resultMap="adminResultMap">
SELECT id ,account,password FROM admin
</select>
(1)resutlMap 的 id 属性是 resutlMap 的唯一标识,本例中定义为“adminResultMap”
这些元素是结果映射的基础。id 和 result 元素都将一个列的值映射到一个简单数据类型(String, int, double, Date 等)的属性或字段。这两者之间的唯一不同是,id 元素对应的属性会被标记为对象的标识符,在比较对象实例时使用。 这样可以提高整体的性能,尤其是进行缓存和嵌套结果映射(也就是连接映射)的时候。
(2)resutlMap 的 type 属性是映射的 POJO 类型
(3)id 标签映射主键,result 标签映射非主键
(4)property 设置对象属性名称,column映射查询结果的列名称
本例的输出映射使用的是 resultMap,而非 resultType
resultMap 引用了 adminResultMap
总结:resultMap解决了java与sql 复杂的映射关系,非标准字段名称、嵌套对象的处理.
多表关联处理结果集
resultMap 元素中 association , collection 元素.
Collection 关联元素处理一对多关联。
• 部门与员工一对多关系
部门一方,配置多方集合
员工多方,在多方配置一方
使用 resultMap 组装查询结果(查询部门一方)
查询员工一方
注解:
在dao层直接使用sql语句
使用案例
动态sql
特殊符号转换
if 元素
if 标签可以对传入的条件进行判断
思考当没有type=1时,sql语句会是这样
select * from t_emp where;显然是会报错的
还可以通 过where标签解决
<where>元素会进行判断,如果它包含的标签中有返回值的话,它就插入一个‘where’。
此外,如果标签返回的内容是以 AND 或 OR 开头,它会剔除掉AND或OR。