首先认识My Batis是什么?
答:MyBatis是一个ORM的数据库持久化框架;
ORM是什么?
答:对象关系映射(Object Relational Mapping)简称ORM
什么是对象关系映射?
是随着面向对象的软件开发方法发展而产生的。
面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。
对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。
数据库持久化 指什么?
答:就是把内存中数据保存到数据库中.
数据持久化就是将内存中的数据模型转换为存储模型
什么是框架?
答:框架(Framework)是一个框子——指其约束性,也是一个架子——指其支撑性。 将原本复杂的各种配置封装起来,降低其操作难度。
所谓的框架就是提供的一些基础支撑结构,通过这些结构可以解决现实生活中具体点的问题,而在这个过程中必须遵循一定规范.
ORM框架映射方式有哪些?
答:常用的有两种,
- Sql操作方式(对jdbc进行封装):
把SQL配置到配置文件中,通过不同SQL中完成对象实体和数据库关系 相互转换的操作。(mybatis的实现方式) - 完整映射:
直接映射的是对象实体和数据库关系映射。操作数据库关系,不用写SQL有框架自己生成。(JPA、Hibenate实现方式)
为什么要使用MyBatis?
MyBatis: 本是apache的一个开源项目iBatis, 提供的持久层框架包括SQL Maps(Mapper)和Dao,允许开发人员直接编写SQL(更好灵活)
使用MyBatis
- 创建一个java项目
- 导入jar包


- 配置XML文件
<?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:配置(xml的一个根)-->
<configuration>
<!--引入jdbc.propeties文件-->
<properties resource="jdbc.properties" />
<!--
environments:环境(多个环境)
default="development":多个环境中默认使用的是哪一个环境
-->
<environments default="development">
<!--
environment:某一个环境 id:就是这个环境的名称
-->
<environment id="development">
<!--
transactionManager:事务管理(ACID)
type="JDBC|MANAGED" jdbc:简单jdbc事务 MANAGED:啥都不做
-->
<transactionManager type="JDBC"/>
<!-- 数据源(连接池) POOLED:mybatis内置的连接池 -->
<dataSource type="POOLED">
<!--四大金刚:驱动,地址,用户名,密码-->
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--引入(找到)写SQL的XML-->
<mapper resource="cn/itsource/dao/ProductMapper.xml"/>
</mappers>
</configuration>
映射文件
①我们的映射文件(就是我们的mapper文件)一般情况下是和它对应的domain实体类在同一个层级
② 这个映射文件的名称一般叫做 XxxMapper.xml (Xxx代表的是实体类名称)
cn.itsource.domain.Product / cn.itsource.domain.Student
cn/itsource/domain/ProductMapper.xml
③ namespace的名称为了确定唯一性,请大家根据我的要求取名
如我们有一个类:
cn.itsource.domain.Product / cn.itsource.domain.Student
那这里取名应该是:
cn.itsource.domain.ProductMapper /cn.itsource.domain.StudentMapper
④ 除了MyBatis支持的类型,其它的类型都通通使用全限定
<?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="cn.itsource.dao.pad">
<select id="getone" parameterType="long" resultType="cn.itsource.domain.Product">
select * from product where id=#{id}
</select>
<!-- resultType 返回的每一条结果的类型-->
<select id="getall" parameterType="long" resultType="cn.itsource.domain.Product">
select * from product
</select>
<!--新增-->
<insert id="save" parameterType="cn.itsource.domain.Product"
useGeneratedKeys="true" keyColumn="id" keyProperty="id">
insert into product (name,age) values (#{name},#{age})
</insert>
<!--修改功能-->
<update id="update" parameterType="cn.itsource.domain.Product">
update product set
age=#{age},
name=#{name}
where id=#{id}
</update>
<!-- 删除功能 -->
<delete id="delect" parameterType="long">
delete from product where id=#{id}
</delete>
</mapper>
实现
@Test
public void aa() throws Exception{
//拿到mybatis-config.xml 的核心配置文件
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
//为了获取SqlSession 对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder=new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory=sqlSessionFactoryBuilder.build(reader);
SqlSession sqlSession=sqlSessionFactory.openSession();
//调用ProductMapper.xml的SQL 语句
Product product=sqlSession.selectOne("cn.itsource.dao.pad.getone",1L);
//打印在控制台
System.out.println(product);
}
抽取实现
public class MyBaitsUtil {
private static SqlSessionFactory sqlSessionFactory=null;
static {
try {
sqlSessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
}catch (Exception e) {
e.printStackTrace();
}
}
public static SqlSession opensesion(){
return sqlSessionFactory.openSession() ;
}
批量添加
<!--
批量添加
insert into employee (name,age,sex) values
("小小良",45,false),("大二良",45,true)
foreach:循环
collection:遍历的集合
item:每次遍历拿到的对象
separator:分隔符(每个值都使用,隔开)
-->
<insert id="batchSave" parameterType="list">
insert into employee (name,age,sex) values
<foreach collection="list" item="e" separator=",">
(#{e.name},#{e.age},#{e.sex})
</foreach>
</insert>
批量删除
<!--
批量删除:DELETE FROM employee WHERE id in (?,?,?,...)
传 : List<Long> ids
foreach:循环
collection:遍历的集合
item:每次遍历拿到的对象
separator:分隔符(每个值都使用,隔开)
open:以什么开头
close:以什么结尾
index:遍历的索引
-->
<delete id="batchDelete" parameterType="list">
delete from employee where id in
<foreach collection="list" item="id" separator="," open="(" close=")">
#{id}
</foreach>
</delete>
动态修改
<!--
动态修改:只修改有值的数据
-->
<update id="dynamicUpdate" parameterType="employee">
update employee
<set>
<if test="name!=null">
name=#{name},
</if>
<if test="age!=null">
age=#{age},
</if>
<if test="sex!=null">
sex=#{sex},
</if>
</set>
where id=#{id}
</update>
Mybtis使用细节
自定义别名
自定义别名
<typeAliases>
<!-- 单个配置:练习 -->
<typeAlias type="cn.itsource.mybatis.a_crud.Dept" alias="Dept" />
<!-- 包的配置:项目,添加了包之后,类名就是别名 -->
<package name="cn.itsource.mybatis.a_crud" />
</typeAliases>
#与$区别
#{OGNL表达式}
MyBatis会把这个表达式使用?(占位符)替换,作为一个sql参数使用
比如name的值为: 定义SQL: select * from t_user where name = #{name}
最终SQL: select * from t_user where name = ?
${OGNL表达式} 的区别
MyBatis会把这个表达式的值替换到sql中,作为sql的组成部分; 把获取到值直接拼接SQL
该方式主要用于程序拼接SQL;
213

被折叠的 条评论
为什么被折叠?



