MyBatis初识——1

首先认识My Batis是什么?
答:MyBatis是一个ORM的数据库持久化框架;

ORM是什么?
答:对象关系映射(Object Relational Mapping)简称ORM

什么是对象关系映射?

是随着面向对象的软件开发方法发展而产生的。
面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。
对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。

数据库持久化 指什么?
答:就是把内存中数据保存到数据库中.
数据持久化就是将内存中的数据模型转换为存储模型

什么是框架?
答:框架(Framework)是一个框子——指其约束性,也是一个架子——指其支撑性。 将原本复杂的各种配置封装起来,降低其操作难度。

所谓的框架就是提供的一些基础支撑结构,通过这些结构可以解决现实生活中具体点的问题,而在这个过程中必须遵循一定规范.

ORM框架映射方式有哪些?
答:常用的有两种,

  1. Sql操作方式(对jdbc进行封装):
    把SQL配置到配置文件中,通过不同SQL中完成对象实体和数据库关系 相互转换的操作。(mybatis的实现方式)
  2. 完整映射:
    直接映射的是对象实体和数据库关系映射。操作数据库关系,不用写SQL有框架自己生成。(JPA、Hibenate实现方式)

为什么要使用MyBatis?
MyBatis: 本是apache的一个开源项目iBatis, 提供的持久层框架包括SQL Maps(Mapper)和Dao,允许开发人员直接编写SQL(更好灵活)

使用MyBatis

  1. 创建一个java项目
  2. 导入jar包
    在这里插入图片描述在这里插入图片描述
  3. 配置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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值