MyBatis入门

MyBatis的相关的概念

​ 1、MyBatis是什么?

​ MyBatis 是一款一流的支持自定义 SQL、存储过程和高级映射的持久化框架。MyBatis 几乎消

除了所有的 JDBC 代码,也基本不需要手工去设置参数和获取检索结果。MyBatis 能够使用简单的

XML 格式或者注解进行来配置,能够映射基本数据元素、Map 接口和 POJOs(普通 java 对象)到

数据库中的记录。

​ 2、持久化框架是什么?

​ 传统的jdbc进行操作,它代码都是套路代码,很多时候有重复的代码,虽然我们可以写工具类简化编码,但是毕竟不方便。所以就开始流行框架。

​ 框架是什么?实际上框架就是一个编码的半成品,它自动的搭建好了我们要进行操作的大部分设置。对于用户来讲,只是去填充必要的设置或者编码。

​ 3、什么是持久化?

​ 就是把对象转成表中的记录;反正把表中的记录转成对象。这样下次的时候我们可以到表中找到记录,反正可以把记录加载到内存的对象中。我们做这样的操作的框架就是所谓的持久化框架。

​ 对象和表有如何的关系?

​ 1)对象 vs 记录

​ 2)属性 vs 字段

​ 3)数据类型 vs 数据库的字段的类型

​ 4、常见的持久化框架有哪些,它们的区别是什么?

​ 1)Hibernate:全自动的对象关系映射(ORM)的框架,操作的时候操作对象,框架自动映射程表中的记录。操作简单,但是配置很有技巧,它表现在性能优化的时候需要深入了解,很不容易掌握。它是一个重量级的ORM框架,非常耗费资源。它不需要写SQL语句,语句由框架自动的生成,你自己看不到语句。非常方便移植,只要改它的方言即可(方言就是指定#数据库的类型的)

​ 2)MyBatis:半自动的ORM框架,通过操作SQL语句来映射表中的记录。它方便时候,但是写SQL需要有基础知识。不方便移植,比如针对mysql数据库和oracle数据库的时候,可能语句需要修改。

3、MyBatis进行操作需要做什么准备工作?

​ 1)核心配置文件:SqlMapConfig.xml

​ 2) 每个表写一个映射配置文件 BookDao.xml和BookTypeDao.xml

​ 3) 核心API进行操作

​ a、构建工程,导入jar,我们采用Maven工程,所以不必须到jar

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.sina.supermark</groupId>
  <artifactId>user</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>user</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
    <mybatis.version>3.2.8</mybatis.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>${mybatis.version}</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
        <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
        <plugin>
          <artifactId>maven-site-plugin</artifactId>
          <version>3.7.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-project-info-reports-plugin</artifactId>
          <version>3.0.0</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

4、核心配置文件

<?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"></properties>
   <!-- <properties>
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/exam?characterEncoding=utf-8"/>
        <property name="username" value="root"/>
        <property name="password" value="1234"/>
    </properties>-->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="{driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/sina/supermark/mapper/BookMapper.xml"/>
        <mapper resource="com/sina/supermark/mapper/BookTypeMapper.xml"></mapper>
    </mappers>
</configuration>

5、映射配置文件

<?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="com.sina.supermark.mapper.BookMapper">
    <select id="getBookById" resultType="Book">
        SELECT *
        FROM book
        WHERE bookid=#{bookid}
    </select>
</mapper>

6、核心API

​ 1)SqlSessionFactoryBuilder:创建SqlSessionFactory的工场。它是用过就丢失,它最好是写在方法体里面,作为局部变量使用。

//1、创建SqlSessionFactoryBuilder对象
String configFile="mybatis-config.xml";
Reader reader=Resources.getResourceAsReader(configFile);
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();

​ 2)SqlSessionFactory:是创建SqlSession的工场。改对象一旦创建,会在整个项目运行的时候始终存在。所以我们建议大家只创建1次,单例模式。它是重量级的对象,销毁内存大。

SqlSessionFactory sessionFactory = builder.build(reader);

​ 3)SqlSession:进行crud用改对象进行操作

SqlSession sqlSession = sessionFactory.openSession();

​ 任务:查询bookid为3的Book

package com.sina.supermark;

import com.sina.supermark.entity.Book;
import com.sina.supermark.mapper.BookMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.Reader;

/**
 * 问题:为什么我们使用SqlSession去调用方法的时候能够完成功能?
 *   1)创建SqlSessionFactory的时候读取了mybatis的核心配置文件
 *   2)核心配置文件中由mapper节点,它和映射配置文件关联
 *   3)映射配置文件的mapper的namespace属性它和接口又进行了关联
 *   4)调用的方法和select、update等节点的id属性进行了关联
 *   这样我们在使用的时候可以通过反射去构建相关的对象
 */
public class BookTest {
    @Test
    public void getBookByIdTest() throws Exception{
        //1、创建SqlSessionFactoryBuilder对象
        String configFile="mybatis-config.xml";
        Reader reader=Resources.getResourceAsReader(configFile);
        SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
        //2、创建SqlSessionFactory
        SqlSessionFactory sessionFactory = builder.build(reader);
        //3、创建SqlSession
        SqlSession sqlSession = sessionFactory.openSession();
        //4、获得BookMapper的实现类,它实际上是BookMapper的代理对象
        BookMapper mapper = sqlSession.getMapper(BookMapper.class);
        System.out.println("代理对象:"+mapper);
        Book book = mapper.getBookById(3);
        System.out.println(book.getBookid()+"  "+book.getBookname());

        //5、关闭对象
        sqlSession.close();
    }
}

7、工具的编写,解决重复代码的问题

package com.sina.supermark.utils;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.Reader;

public class MyBatisUtil {
    private static SqlSessionFactory sqlSessionFactory;
    static {
        try{
            String configFile="mybatis-config.xml";
            Reader reader= Resources.getResourceAsReader(configFile);
            SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
            //2、创建SqlSessionFactory
            sqlSessionFactory = builder.build(reader);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    public static SqlSession getSqlSession(){
        //true:自动提交事务   false:手工提交事务
        return sqlSessionFactory.openSession(false);
    }
    public static void closeSqlSession(SqlSession sqlSession){
        if(null!=sqlSession){
            sqlSession.close();
        }
    }
}

8、添加操作

1、添加数据后,如果要获得添加记录的主键值(前提是自动增长)useGeneratedKeys=“true”,keyProperty=“bookid”

<insert id="addBook" parameterType="Book" keyProperty="bookid" useGeneratedKeys="true">
    INSERT
    INTO book(bookid, bookname, price, pubtime, author, typeid)
    VALUES (null,#{bookname},#{price},now(),#{author},#{typeid})
</insert>

2、编码

@Test
public void addBookTest(){
    SqlSession sqlSession = MyBatisUtil.getSqlSession();
    Book book=new Book();
    book.setAuthor("老王");
    book.setBookname("MyBatis实战");
    book.setPrice(23d);
    book.setTypeid(1);
    int result = sqlSession.getMapper(BookMapper.class).addBook(book);
    System.out.println(result);
    sqlSession.commit();
    MyBatisUtil.closeSqlSession(sqlSession);
}

9、传统方式进行操作

@Test
public void addBookTest1(){
    SqlSession sqlSession = MyBatisUtil.getSqlSession();
    Book book=new Book();
    book.setAuthor("老王他爹");
    book.setBookname("MyBatis实战-1");
    book.setPrice(23d);
    book.setTypeid(1);
    //第1个参数是:执行的方法全名,第2个参数是:对象
    int result = sqlSession.insert("com.sina.supermark.mapper.BookMapper.addBook", book);
    System.out.println(result);
    sqlSession.commit();
    MyBatisUtil.closeSqlSession(sqlSession);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值