首發於自己的博客 和尚的博客
本文主要講什麼是框架、如何學習框架、mybatis介紹、如何用idea搭建mybatis的環境(非maven)
1.什麼是框架?
你可以理解爲就是別人寫好的工具類,爲我們提供一種解決方案,最後爲了提高開發效率
2.爲什麼學習框架?
個人:對你底層開發無任何幫助意義,但是如果看源碼,可以學到如何設計的
公司:效益,提高了開發效率
3.怎麼去學習框架?
需要遵循框架規則:
- 找到jar包 class文件(java文件)
- 入口:核心配置文件
- 通過官方給定的幫助文檔,使用其提供API接口
- 測試
在這段時間裏,我將學習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中項目結構如下:
- lib放jar包
- com.hs.dao放接口,和接口實現類(MyBatis又分爲傳統模式(需要寫接口和接口實現類)和接口代理模式(只需要寫接口))
- com.hs.model放持久化類(實體Bean、數據庫表對應的對象)、XML映射文件(含SQL語句)
- com.hs.test放測試類
- com.hs.util放封裝好的工具類
- jdbc.properties放連接數據庫的信息,在mybatis-config.xml中加載
- log4j.properties這是日誌框架配置
- 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.數據庫屬性文件
爲了解決中文亂碼問題:
- 自己的mysql編碼要設置成utf-8或utf8mb4
- 如果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