首发于自己的博客 和尚的博客
本文主要讲什么是框架、如何学习框架、mybatis介绍、如何用idea搭建mybatis的环境(非maven)


源码获取github

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