Mybatis总结

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 三个属性。你想插入 accountpassword,并希望数据库自动生成 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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

登陆成功200

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值