首发于自己的博客 和尚的博客
本文主要讲什么是框架、如何学习框架、mybatis介绍、如何用idea搭建mybatis的环境(非maven)
源码获取github
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