MyBatis學習筆記(一)mybatis介紹、環境搭建

首發於自己的博客 和尚的博客
本文主要講什麼是框架、如何學習框架、mybatis介紹、如何用idea搭建mybatis的環境(非maven)

1.什麼是框架?

你可以理解爲就是別人寫好的工具類,爲我們提供一種解決方案,最後爲了提高開發效率

2.爲什麼學習框架?

個人:對你底層開發無任何幫助意義,但是如果看源碼,可以學到如何設計的

公司:效益,提高了開發效率

3.怎麼去學習框架?

需要遵循框架規則:

  1. 找到jar包 class文件(java文件)
  2. 入口:核心配置文件
  3. 通過官方給定的幫助文檔,使用其提供API接口
  4. 測試

在這段時間裏,我將學習ssm框架:MyBatis + SpringMvc + Spring

把它在我學jsp,servlet那段時間學的mvc模式,和我將要學的ssm框架,做一個小小的改動:

4.MyBatis框架是一個什麼框架?

MyBatis是一個持久層框架

  • 什麼是持久化:
    • 狹義:把數據永久性的保存到數據庫或者存儲器都是持久化
    • 廣義:針對於數據庫所有的操作,都是持久化操作
    • Create:增加
    • Read:讀取查詢
    • Update:更新
    • Delete:刪除

MyBatis是一個ORM框架:

  • Object:對象 java對象
  • Relationship:關係(關係型數據庫)
  • Mapping:映射

5.什麼是MyBatis?

MyBatis 是支持定製化 SQL、存儲過程以及高級映射的優秀的持久層框架。

MyBatis避免了幾乎所有的JDBC代碼(1.加載驅動2.獲取連接3.執行語句對象4.處理結果集5.關閉資源)和手動設置參數以及獲取結果集(ResultSet).

  • 就是之前學習的時候,自己封裝的數據Dao,需要自己處理數據轉換成自己想要的對象

MyBatis可以對配置和原生Map使用簡單的XML或註解,將接口Java的POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄。

6.idea搭建MyBatis環境(非maven)

1).所需要的jar包:

  • mybatis-3.4.6.jar mybatis的包
    mysql-connector-java-5.1.45-bin.jar 數據庫訪問
    log4j-1.2.17.jar 日誌框架包(在控制檯顯示sql語句信息等)
    junit-4.12.jar 單元測試框架
    hamcrest-core-1.3.jar junit-4.12所依賴的包
  • 都可以在maven倉庫中搜索下載

2).創建一個javase project

3).在項目目錄下創建一個lib放jar包,然後導入jar包:教程

4).idea中項目結構如下:

  1. lib放jar包
  2. com.hs.dao放接口,和接口實現類(MyBatis又分爲傳統模式(需要寫接口和接口實現類)和接口代理模式(只需要寫接口))
  3. com.hs.model放持久化類(實體Bean、數據庫表對應的對象)、XML映射文件(含SQL語句)
  4. com.hs.test放測試類
  5. com.hs.util放封裝好的工具類
  6. jdbc.properties放連接數據庫的信息,在mybatis-config.xml中加載
  7. log4j.properties這是日誌框架配置
  8. mybatis-config.xml核心配置文件

5).代碼內容

1.創建數據庫(含後幾篇文章的數據表)

cy42_mss.sql

DROP TABLE IF EXISTS `oa_user`;
CREATE TABLE `oa_user` (
  `user_id` int(11) NOT NULL AUTO_INCREMENT,
  `user_name` varchar(255) DEFAULT NULL,
  `sex` varchar(255) DEFAULT NULL,
  `money` decimal(7,2) DEFAULT NULL,
  `birthday` date DEFAULT NULL,
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8mb4;

-- ----------------------------
-- Records of oa_user
-- ----------------------------
INSERT INTO `oa_user` VALUES ('1', '悟空', '男', '888.00', null);
INSERT INTO `oa_user` VALUES ('2', '八戒', '男', '999.00', null);
INSERT INTO `oa_user` VALUES ('3', '天蓬元帥', '女', '1000.00', null);
INSERT INTO `oa_user` VALUES ('4', '悟能', '男', '666.00', null);
INSERT INTO `oa_user` VALUES ('5', '法悟法', '女', '544.00', null);
INSERT INTO `oa_user` VALUES ('6', '悟', '女', '562.00', null);
INSERT INTO `oa_user` VALUES ('7', '悟', '女', '562.00', null);
INSERT INTO `oa_user` VALUES ('14', '嫦娥', '女', '1213.00', null);
INSERT INTO `oa_user` VALUES ('15', '月兔', '女', '2113.00', null);

-- ----------------------------
-- Table structure for skill
-- ----------------------------
DROP TABLE IF EXISTS `skill`;
CREATE TABLE `skill` (
  `skill_id` int(11) NOT NULL AUTO_INCREMENT,
  `skill_name` varchar(255) DEFAULT NULL,
  `num` int(11) DEFAULT NULL,
  `fk_teacher_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`skill_id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4;

-- ----------------------------
-- Records of skill
-- ----------------------------
INSERT INTO `skill` VALUES ('2', 'JS', '75', null);
INSERT INTO `skill` VALUES ('7', 'CSS', '66', null);
INSERT INTO `skill` VALUES ('8', 'java', '66', null);
INSERT INTO `skill` VALUES ('9', 'vue', '56', '9999');

-- ----------------------------
-- Table structure for sys_role
-- ----------------------------
DROP TABLE IF EXISTS `sys_role`;
CREATE TABLE `sys_role` (
  `role_id` int(11) NOT NULL AUTO_INCREMENT,
  `role_name` varchar(32) DEFAULT NULL,
  `role_key` varchar(32) DEFAULT NULL,
  `status` int(1) DEFAULT '1' COMMENT '1可用 -1禁用',
  PRIMARY KEY (`role_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ----------------------------
-- Records of sys_role
-- ----------------------------
INSERT INTO `sys_role` VALUES ('-100', '超級管理員', 'ADMIN', '1');

-- ----------------------------
-- Table structure for sys_user
-- ----------------------------
DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user` (
  `user_id` int(11) NOT NULL AUTO_INCREMENT,
  `account` varchar(32) NOT NULL,
  `password` varchar(128) NOT NULL,
  `user_name` varchar(32) DEFAULT '',
  `status` int(1) NOT NULL DEFAULT '1' COMMENT '1可用 -1刪除  2禁用',
  `login_time` datetime DEFAULT CURRENT_TIMESTAMP,
  `ip` varchar(128) DEFAULT NULL,
  `fk_role_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`user_id`),
  KEY `fk_role_id` (`fk_role_id`),
  CONSTRAINT `sys_user_ibfk_1` FOREIGN KEY (`fk_role_id`) REFERENCES `sys_role` (`role_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ----------------------------
-- Records of sys_user
-- ----------------------------
INSERT INTO `sys_user` VALUES ('-999', 'super', 'super', '唐僧', '1', '2018-07-28 18:47:39', null, '-100');
INSERT INTO `sys_user` VALUES ('-888', 'admin', 'admin', '悟空', '1', '2018-07-03 18:48:21', null, '-100');
2.數據庫屬性文件

爲了解決中文亂碼問題:

  1. 自己的mysql編碼要設置成utf-8或utf8mb4
  2. 如果mysql編碼沒有設置以上的,需要再url後面加?useUnicode=true&characterEncoding=UTF-8

jdbc.properties

jdbc.mysql.driver=com.mysql.jdbc.Driver
jdbc.mysql.url=jdbc:mysql://localhost:3306/cy42_mss?useUnicode=true&characterEncoding=UTF-8
jdbc.mysql.username=root
jdbc.mysql.password=root
3.核心配置文件

mybatis-config.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="jdbc.properties"/>
    <!--自定義設置類型的別名,也就是resultMap裏的type,避免包名已修改,在映射文件裏修改多處地方-->
    <typeAliases>
        <!-- 方式一、com.hs.model.Skill這個類設置了別名hs,之後要用這個的話,直接寫hs -->
        <!--<typeAlias type="com.hs.model.Skill" alias="hs"/> -->
        <!-- 方式二、com.hs.model這個包下的類,要用的時候直接寫類名,比如用com.hs.model.Skill,直接寫Skill -->
        <package name="com.hs.model"/>
    </typeAliases>
    <!--配置數據庫的環境-->
    <environments default="development">
        <environment id="development">
            <!--事務管理器:保證數據的完整性和一致性   關鍵信息  -->
            <!--框架:默認情況下CUD操作需要  手動提交事務
            (如同在Navicat中表中輸入了數據,沒有點那個小√,就是沒有提交事務,
            但是輸入insert語句,就自動提交事務了)  -->
            <transactionManager type="JDBC" />
            <!--使用的是連接池:百度java如何實行連接池的原理?  -->
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.mysql.driver}" />  <!--獲取值,${屬性文件裏的變量名},也可以直接寫值-->
                <property name="url" value="${jdbc.mysql.url}" />  <!--獲取值,${屬性文件裏的變量名},也可以直接寫值-->
                <property name="username" value="${jdbc.mysql.username}" /> <!--獲取值,${屬性文件裏的變量名},也可以直接寫值-->
                <property name="password" value="${jdbc.mysql.password}" /> <!--獲取值,${屬性文件裏的變量名},也可以直接寫值-->
            </dataSource>
        </environment>
    </environments>

    <!--加載映射文件 ,也就是含sql語句的文件-->
    <mappers>
         <!--告知映射文件方式1,一個一個的配置-->
        <mapper resource="com/hs/model/SkillMapper.xml"/>
        <!-- 告知映射文件方式2,自動掃描包內的Mapper接口與配置文件 -->
        <!--<package name="com.hs.model"/>-->
    </mappers>
</configuration>
4.dao層

SkillDao.java

具體代碼見第二篇

SkillDaoImpl.java

具體代碼見第二篇
5.model層

Skill.java(持久化類含對象的屬性,get、set方法、toSting方法)

具體代碼見第二篇

SkillMapper.xml(映射文件)

具體代碼見第二篇
6.test層

MyBatisTest.java(寫測試方法)

7.util層(封裝好的工具類、可以直接調用)

MyBatisUtils.java

package com.hs.util;
/**
 * 知識點:
 * final修飾類:不能被繼承
 * 修飾方法:不能被重寫
 * 修飾變量:常量不可用變,但如果是對象,對象裏的值可以變
 *
 */
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.IOException;
import java.io.InputStream;

public class MyBatisUtils {

    private MyBatisUtils() { }  //不允許實例化

    private static final String PATH = "mybatis-config.xml";
    private static InputStream inputStream;
    private static SqlSessionFactory sqlSessionFactory;

    static { //1.靜態代碼塊,只是加載一次
        try {
            //輸入流 讀文件
            //1.讀取核心配置文件
            inputStream = Resources.getResourceAsStream(PATH);
            //2.創建SqlSession工廠(SqlSessionFactory)相當於Connection
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("加載核心配置文件失敗");
        }
    }

    /**
     * 獲取sqlsession
     * @return
     */
    public static SqlSession getSqlsession() {
        //3.獲取SqlSession 相當於執行SQL語句對象PreparedStament預處理對象
        //***** SqlSession完成所有的持久化操作CRUD
        return sqlSessionFactory.openSession();
    }

    /**
     * 關閉資源
     * @param sqlSession
     */
    public static void closeSqlSession(SqlSession sqlSession) {
        if (sqlSession != null) {
            sqlSession.close();
        }
    }
}
8.日誌框架配置

log4j.properties

# 日誌配置文件Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
# 如果要顯示SQL語句,那麼這個位置需要配置爲命名空間log4j.logger.命名空間
log4j.logger.com.hs.model.Skill=TRACE
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章