MyBatis框架 简介、工作原理和基本应用

版权声明:西安钰泉私人知识产权,仅供学习交流使用! https://blog.csdn.net/YuQuanZhang/article/details/81543993

三种连接数据库的技术性能比较:

开源持久层框架,只管访问数据库

底层为jdbc

优点:性能最高,已掌握。

缺点:代码繁琐。

Hibernate 冬眠

不用写sql,代码简洁

性能不好  person.hbm.xml  cfg.xml两个配置文件,自动生成的dql效率低下,复杂业务

自动生成sql缺点很大。

MyBatis

优点:代码简洁,容易掌握

缺点:得写sql,性能一般。


工作原理:

sqlMapConfig.xml:用于加入数据库连接池,添加映射文件PersonMapper.xml,创建预编译的PerporedStatement方法。

sqlSessionFactory通过读取SqlMapFactory来创建Map,内容为键值对,其中为Statement,有了连接池就可以获得预编译。Map中键值对key为sql语句的id,值为sql语句。

java类中首先获得sqlsessionFactoryBuilder对象,新建数据流对配置文件进行读取,并获得sqlsessionFactory对象

sqlSessionFactory获得sqlsession对象,他会从map中依据sql id获取事先创建好的statement对象,然后执行。返回一个session对象。

session.insert方法中两个参数(test.save,e)

分别为namespace和sql id, e为实体类的实例化。

映射文件PersonMapper.xml用于书写sql语句。

#{pname}用于获得实体类对象中的get方法,加入sequence序列的类型。  parameterType为导入包的类型。

<mapper namespace="test">

<!--   id:要求唯一 parameterType:参数类型,填写实体类的完整名字 -->

    <insert id="save" parameterType="com.it.entity.Person">

    INSERT INTO PERSON VALUES(seq_newsId.nextval,#{pname},#{pwd})

    </insert>

</mapper>


编程步骤:四种数据库基本操作方法CRUD

1 导入jar包:myBatis

2 添加配置文件 sqlMapConfig.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>

    <properties resource="db.properties"/>

    <!-- 别名 包以其子包下所有类   头字母大小都行-->

    <typeAliases>

<!--       <typeAlias type="com.itheima.mybatis.pojo.User" alias="User"/> -->

       <package name="com.itheima.mybatis.pojo"/>

    </typeAliases>

    <!-- 和spring整合后 environments配置将废除    -->

    <environments default="environments">

       <environment id="environments">

           <!-- 使用jdbc事务管理 -->

           <transactionManager type="JDBC" />          <!-- 数据库连接池 -->

           <dataSource type="POOLED">

                <property name="driver" value="${database.driverClassName}"></property><!-- oracle.jdbc.driver.OracleDriver -->

                <property name="url" value="${database.url}"></property><!-- jdbc:oracle:thin:@localhost:1521:orcl -->

                <property name="username" value="${database.username}"></property>

                <property name="password" value="${database.password}"></property>

           </dataSource>

       </environment>

    </environments>

    <mappers>

    <mapper resource="PersonMapper.xml"/>

    </mappers>

</configuration>

3 编写实体类

getter setter  有参构造无参构造

4 编写映射文件  里面写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">

<!-- 写Sql语句   -->

<mapper namespace="test">

<!--   id:要求唯一

    parameterType:参数类型,填写实体类的完整名字 -->

    <insert id="save" parameterType="com.it.entity.Person">

    INSERT INTO PERSON VALUES(seq_newsId.nextval,#{pname},#{pwd})

    </insert>

</mapper>

5 调用SqlSession对象提供的方法来访问数据库。

public  static void test1() {

          String config = "sqlMapConfig.xml";

          // 创建SqlSessionFactoryBuilder对象

          SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();

          // 创建sqlSessionFactory对象 新建数据流对文件进行读取

          SqlSessionFactory ssf = ssfb.build(TestCase.class.getClassLoader().getResourceAsStream(config));

          SqlSession session = ssf.openSession();

          // 调用sqlSessionFactory提供的方法访问数据库

          Person a = new Person();

          a.setPname("Tony");

          a.setPwd("yuquan");

          session.insert("test.save", a);

          session.commit();

          session.close();

     }

public static void main(String[] args) {

          test1();

          System.out.println("插入成功");

     }

如果是查询,会先将记录中的数据放到一个Map对象中,字段名为key 字段值为value 

接下来将Map对象中的书库放在对应的实体对象里面。

所有创建SqlSession对象的方法都可以共同加入一个方法,方便调用:

public static SqlSession init() {

          String config = "sqlMapConfig.xml";

          // 创建SqlSessionFactoryBuilder对象

          SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();

          // 创建sqlSessionFactory对象 新建数据流对文件进行读取

          SqlSessionFactory ssf = ssfb.build(TestCase.class.getClassLoader().getResourceAsStream(config));

            SqlSession session = ssf.openSession();

          // 调用sqlSessionFactory提供的方法访问数据库

          return session;

     }


源代码:

PersonMapper.xml

<?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">

<!-- 写Sql语句 -->

<mapper namespace="test">

    <!-- id:要求唯一 parameterType:参数类型,填写实体类的完整名字 -->

    <insert id="save" parameterType="com.it.entity.Person">

       INSERT INTO PERSON VALUES(seq_newsId.nextval,#{pname},#{pwd})

    </insert>

    <select id="queryAll" resultType="com.it.entity.Person">

       SELECT * FROM PERSON

    </select>

    <select id="queryOne" parameterType="int" resultType="com.it.entity.Person">

       SELECT * FROM PERSON WHERE pid = #{rtttt}

    </select>

    <update id="update" parameterType="com.it.entity.Person">

       UPDATE PERSON SET pname=#{pname},pwd=#{pwd} WHERE pid = #{pid}

    </update>

    <delete id="delete" parameterType="int">

     DELETE  FROM  PERSON WHERE pid = #{asdasd}

    </delete>

</mapper>

TestCase.java

package Test;

import java.util.List;

import org.apache.ibatis.session.SqlSession;

import org.apache.ibatis.session.SqlSessionFactory;

import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import org.junit.jupiter.api.Test;

import com.it.entity.Person;

public class TestCase {

    private   SqlSession session;

    //创建session对象

    public static SqlSession init() {

        String config = "sqlMapConfig.xml";

        // 创建SqlSessionFactoryBuilder对象

        SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();

        // 创建sqlSessionFactory对象 新建数据流对文件进行读取

        SqlSessionFactory ssf = ssfb.build(TestCase.class.getClassLoader().getResourceAsStream(config));

          SqlSession session = ssf.openSession();

        // 调用sqlSessionFactory提供的方法访问数据库

        return session;
    }

//插入

    public static void test1() {

        Person a = new Person();

        a.setPname("Tonyzhang");

        a.setPwd("yuquan980730");

        SqlSession session=init();

        session.insert("test.save", a);

session.commit();

        System.out.println("插入");

        session.close();

    }

//查询所有

    public static void  test2() {

        /*String config = "sqlMapConfig.xml";

        // 创建SqlSessionFactoryBuilder对象

        SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();

        // 创建sqlSessionFactory对象 新建数据流对文件进行读取

        SqlSessionFactory ssf = ssfb.build(TestCase.class.getClassLoader().getResourceAsStream(config));

        SqlSession session = ssf.openSession();

        // 调用sqlSessionFactory提供的方法访问数据库

*/        SqlSession session=init();

        List<Person> list=session.selectList("test.queryAll");

         System.out.println("查询");

        System.out.println(list);

        for(Person a :list) {

            System.out.println(a);
        }
        session.close();
    }

//查询单个

    public static void test3() {

        SqlSession session=init();

        Person a=session.selectOne("test.queryOne",5);

        System.out.println(a);

        session.close();

    }

    //更新測試方法

    public static void test4() {


        SqlSession session=init();

        Person a=session.selectOne("test.queryOne", 5);

       System.out.println("查詢到的結果:"+a);

        a.setPname(a.getPname());

        a.setPwd("愛愛豆豆");

        session.update("test.update",a);

session.commit();

        System.out.println("修改完成");

        System.out.println("修改后的内容:"+a);

        session.close();

    }

    //删除

    public static void test5() {

        SqlSession session=init();

        Person a=session.selectOne("test.queryOne", 7);

        System.out.println("即将删除的结果:"+a);

        if(a!=null) {

        session.delete("test.delete",7);

        

        System.out.println("删除成功");

        }else {

            System.out.println("没有可以删除的内容");

        }

session.commit();

        session.close();
  
    }

    public static void main(String[] args) {

        test5();
    }
}

SQL语句在映射文件中写法较为特殊,需要记忆。

猜你喜欢

转载自blog.csdn.net/YuQuanZhang/article/details/81543993
今日推荐