Mybatis框架
Mybatis概述
Mybatis 是什么?
Mybatis 是一个持久层(DAO)框架
Mybatis 的作用
Mybatis 是一个持久层框架,其作用就是操作数据库的(增删改查)
为什么需要学习Mybatis
Mybatis 的理念:让开发者是10%的代码(相对于原生jdbc代码操作)就可以实现数据库的操作。
解决方案:持久层(DAO)的零实现,所谓的零实现,就是不用写实现类代码,直接使用接口就可以操作数据库内容。
Mybatis的定义,提高开发的效率!!!真的写很少的代码!!!就可以实现增删改查
写的更少,做的更多,类比与Jquery理念。
Mybatis 的作用
Mybatis 框架能够让我们以最少的代码就可以操作数据库。从而提高开发的效率!!!
–如何将代码减少呢?
持久层的零实现(不需要写实现类)
可以自动将数据封装到对象里面不需要手工编写映射的关系
Mybatis配置流程图
Resources:资源类,用于读取总配置文件
SqlSessionFactoryBuilder:会话工厂构造类,通过读取的总配置文件构建会话工厂
SqlSessionFactory:会话工厂
SqlSession:会话,就是操作数据库的操作类
入门实例
原官方文档:http://www.mybatis.org/mybatis-3/zh/getting-started.html
支持中文翻译!!!
配置流程说明
获得数据库连接
第一步:导入包(任何框架需要的事情)
第二步:创建总配置文件,文件名按需求写
第三步:创建一个MybatisUtils工具类,(获得操作对象)
需求:插入数据到数据库
第四步:创建一个映射接口
第五步:创建一个映射文件
第六步:在总配置文件加载映射文件
第七步:编写测试插入数据库代码
Mysql数据库(mybatis)内容
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for department
-- ----------------------------
DROP TABLE IF EXISTS `department`;
CREATE TABLE `department` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of department
-- ----------------------------
INSERT INTO `department` VALUES ('1', '总经办');
INSERT INTO `department` VALUES ('2', '研发部');
INSERT INTO `department` VALUES ('3', '人事部');
-- ----------------------------
-- Table structure for employee
-- ----------------------------
DROP TABLE IF EXISTS `employee`;
CREATE TABLE `employee` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
`dept_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of employee
-- ----------------------------
INSERT INTO `employee` VALUES ('1', '乔峰', '1');
INSERT INTO `employee` VALUES ('2', '虚竹', '2');
INSERT INTO `employee` VALUES ('3', '段誉', '1');
INSERT INTO `employee` VALUES ('4', '王二麻子', '3');
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
`password` varchar(50) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', '乔峰', '123', '35');
INSERT INTO `user` VALUES ('2', '段誉', '123', '25');
INSERT INTO `user` VALUES ('3', '虚竹', 'abc', '30');
INSERT INTO `user` VALUES ('4', '叶孤城', '123', '50');
INSERT INTO `user` VALUES ('5', '花满楼', '123', '40');
创建一个普通java项目并导入相关
–mybatis-3.4.4.jar
(Mybatis核心包,可以按照需求安装不同的Mybatis核心包,不建议安装最新版,最好安装最稳定版本)
–mysql-connector-java-5.1.26-bin.jar
(连接mysql5.1.26版本连接包)
创建主配置文件 mybatis-config.xml
在项目的src(类路径classpath)下面创建配置文件 mybatis-config.xml
具体配置可参考mybatis的官方文档。
<?xml version="1.0" encoding="UTF-8"?>
<!-- 所有的xml文件需要通过上面代码进行声明! -->
<!-- mybatis框架主配置文件的约束 -->
<!-- 文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。
DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。 -->
<!-- mybatis框架同一DTD声明格式 -->
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- 根元素:用于配置mybatis -->
<!-- configuration 配置 -->
<configuration>
<!-- 配置mybatis的运行环境,可以配置多个环境,但是一次只能使用一个 -->
<!-- default属性:mybatis当前使用的环境
值必须和下面 具体的某一个环境的id值相同 -->
<!-- environments 环境 -->
<environments default="mysql">
<!--
<environment id="mysql">
具体的环境配置
id 属性 : 当前环境的唯一标识,以供上面 <environments default="mysql">使用
标签内部就是环境配置细节
-->
<environment id="mysql">
<!--
<transactionManager type="JDBC"/>
transactionManager 事务管理器
MyBatis框架的事务管理器配置
type属性 :事务管理器的类型 ,JDBC ,默认使用原始jdbc的事务
-->
<transactionManager type="JDBC"></transactionManager>
<!--
<dataSource type="POOLED">
数据源(连接池)配置(连接数据库的具体配置)dataSource(数据源) POOLED (汇集)
type :POOLED(使用是Mybatis别名配置) Mybatis内置的微型连接池(因为以后框架连接数据都是要通过连接池)
实际开发一般会用第三方连接池 (阿里巴巴 druid,Apache的 dbcp)
-->
<dataSource type="POOLED">
<!-- property 财产 -->
<!-- 数据库驱动 -->
<property name="driver" value="com.mysql.jdbc.Driver"></property>
<!-- url -->
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"></property>
<!-- 账号 -->
<property name="username" value="root"></property>
<!-- 密码 -->
<property name="password" value="root"></property>
</dataSource>
</environment>
</environments>
<!-- 配置映射文件 -->
<mappers>
<!-- 配置单个xml映射文件 -->
<mapper resource="cn/xc/mybatis/mapper/UserMapper.xml"></mapper>
</mappers>
</configuration>
创建MyBatisUtil工具类
MyBatisUtil 工具类的作用主要用于读取配置文件,创建工厂对象,提供创建SqlSession数据库操作对象的方法。
MyBatisUtil.java
package cn.xc.mybatis.utils;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
//1.读取配置文件,创建工厂对象 SqlSessionFacotry
//2.使用SqlSessionFacotry 创建 SqlSession
public class MyBatisUtil {
private MyBatisUtil() {
}
private static SqlSessionFactory factory;
static {
// 配置文件名称 resource(资源)
String resource = "mybatis-config.xml";
// 读取配置文件并返回输入流
// try(需要是释放资源的变量声明) //Java7开始才支持的新特性语法,自动释放
// getResourceAsStream(获取资源流)
try (InputStream inputStream = Resources.getResourceAsStream(resource);) {
// try {
// 创建 SqlSessionFactoryBuilder (SQL会话工厂生成器) 对象 构建 SqlSessionFactory(SQL会话工厂)
factory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 提供一个返回SqlSession会话对象的方法,以供其他程序调用
*
* @return SqlSession
*/
public static SqlSession openSession() {
// SqlSessionFactory(SQL会话工厂) openSession 打开/创建一个Session对象
SqlSession session = factory.openSession();
return session;
}
public static void main(String[] args) {
SqlSession session = openSession();
System.out.println(session);
//org.apache.ibatis.session.defaults.DefaultSqlSession@5680a178
}
}
创建数据库表对应的实体类
User.java
package cn.xc.mybatis.pojo;
public class User {
private Integer id;
private String name;
private String password;
private Integer age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public User() {
super();
}
public User(Integer id, String name, String password, Integer age) {
super();
this.id = id;
this.name = name;
this.password = password;
this.age = age;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", password=" + password + ", age=" + age + "]";
}
}
创建一个操作接口
UserMapper.java
package cn.xc.mybatis.mapper;
import cn.xc.mybatis.pojo.User;
/*
* 使用MyBatis的动态代理开发编写代码遵循四个原则
* 1.映射文件的namespace命名空间的值必须是对应接口的全限定名
2.映射文件的对应功能 id值必须等于映射接口中方法的名称
3.映射文件的参数类型必须和接口中方法的参数类型一致
4.映射文件查询的返回结果类型必须和接口的方法的返回数据类型一致,
DML操作返回的受影响的行数,除外
*/
public interface UserMapper {
int insert(User user);
}
创建表对应的映射文件 :UserMapper.xml
UserMapper.xml
<?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="">
映射的根元素
namespace属性:命名空间 (唯一),必须是当前对应映射接口的全限定名
全限定名 : 包名+简单类名/接口名
cn.xc.mybatis.mapper.UserMapper
-->
<mapper namespace="cn.xc.mybatis.mapper.UserMapper">
<!--
<insert id="">
插入数据的功能标签
id属性:唯一标识,(必须和对应的UserMapper接口的方法名相同)
parameterType属性:参数类型,和对应接口方法的参数类型相同(全限定名)
-->
<insert id="insert" parameterType="cn.xc.mybatis.pojo.User">
<!-- #{对象的属性或者map的key}
OGNL 表达式语言
-->
insert into user (name,password,age)values(#{name},#{password},#{age})
</insert>
</mapper>
创建测试类准备测试
UserMapperTest.java
package cn.xc.mybatis.test;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import cn.xc.mybatis.mapper.UserMapper;
import cn.xc.mybatis.pojo.User;
import cn.xc.mybatis.utils.MyBatisUtil;
public class UserMapperTest {
// 插入功能
@Test
public void testInsert() throws Exception {
// 1.创建SqlSession对象
SqlSession session = MyBatisUtil.openSession();
// 2.创建UserMapper 映射接口的代理对象(接口不能直接创建对象,底层创建代理对象)
UserMapper userMapper = session.getMapper(UserMapper.class);
System.out.println(userMapper.getClass().getName());// com.sun.proxy.$Proxy4
//3.执行insert插入方法
User user = new User(null, "东东拜拜", "ddbb", 50);
int row = userMapper.insert(user);
System.out.println("受影响的行数:" + row);// 受影响的行数:1
//4.手动提交事务
session.commit();
//5.关闭Session
session.close();
}
}
log4j日志框架的配置
说明
log4j是一个日志输出框架,就是用于输出日志的。
Mybatis的日志输出是通过Log4J输出的。主流框架大部分都是Log4j输出的。Spring框架也可以通过Log4j输出日志!!
问题:既然Log4j功能类似System.out.println(),为什么使用log4j而不直接使用System.out.println()?
答:Log4j提供了强大的日志输出的自定义功能。
- 通过级别输出日志 (调试、信息、警告、错误、致命异常)
- 可以指定输出到控制台,以及输出到文件。
- 可以设置输出的日志格式
所以学习LOG4J.需要学会自定义配置LOG4J的输出格式以及输出等级
下载路径
Log4j的下载地址:http://logging.apache.org/log4j/1.2/
配置步骤
第一步:导入log4j-1.2.17.jar的包
第二步:在src下创建一个log4j.propertis文件
注意:文件名必须为log4j.properties
# Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
#配置日志记录的包
#规则 log4j.logger. + (要输入日志的包,cn.xc.mybatis.mapper)+ =TRACE
log4j.logger.cn.xc.mybatis.mapper=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
运行效果
com.sun.proxy.$Proxy4
DEBUG [main] - ==> Preparing: insert into user (name,password,age)values(?,?,?)
DEBUG [main] - ==> Parameters: 东东拜拜(String), ddbb(String), 50(Integer)
DEBUG [main] - <== Updates: 1
受影响的行数:1