mybatis框架
ORM 框架: Object Relationship Model 对象关系模型
持久层框架 (数据持久化)
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。
新建一个maven project ,项目资源结构如下
首先我们开始配置maven:pom.xml 导入mybatis框架的依赖jar包
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.bwf</groupId>
<artifactId>maven01</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>maven01</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- 单元测试 -->
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- 日志 -->
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-simple -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.8.0-beta2</version>
<scope>test</scope>
</dependency>
<!-- mybatis框架 -->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!-- mysql依赖 -->
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.12</version>
</dependency>
</dependencies>
<!-- 定义项目比对JDK版本,至少需要这一个 右键项目 maven >>> update project...
可以重新加载jar包 如果没有这个配置,就会将jdk设置成maven默认的jdk而有了这个配置,
就会加载我们所需要的jdk -->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
要使用mybatis框架,当然要配置mybatis的配置文件 mybatis-config.xml
配置文件中就是一对<configuration>标签中 依次写入三部分:1、模型对象,即java实体类对象,写在<typeAliases>标签中,2、环境配置,包括开发环境、生产环境等,比如配置数据库连接信息,即配置一个数据库事物管理器,写在<environments default="development">标签中,3、ORM配置,即将数据库中的表与java实体类相映射,写在<mappers>标签中;这三个部分的顺序不可乱。
<?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>
<!-- 1. 模型对象 -->
<typeAliases>
<!-- 定义实体类的地方 -->
<typeAlias alias="User" type="com.bwf.entity.User"/>
</typeAliases>
<!-- 2. 数据库连接信息 -->
<environments default="development">
<!-- 开发环境 -->
<environment id="development">
<!-- 事务管理器:基于jdbc -->
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<!--
jdbc参数:
user 用户名
password 密码
useUnicode 是否使用Unicode字符集
characterEncoding 当useUnicode为true是,指定字符编码(utf-8\gbk\gb2312)
autoReconnect 当数据库断开时,是否自动连接
autoReconnectForPools 是否使用针对数据库连接池的重连策略
failOverReadOnly 自动重连成功后,连接是否设置为只读?
maxReconnects autoReconnect设置为true时,重试连接的次数
initialTimeout autoReconnect设置为true时,两次重连之间的时间间隔,单位:秒
connectTimeout 和数据库服务器建立socket连接时的超时,单位:毫秒。 0表示永不超时,适用于JDK 1.4及更高版本
socketTimeout socket操作(读写)超时,单位:毫秒。 0表示永不超时
timeZone\serverTimezone 设置时区
useSSL 使用ssl协议
-->
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis1?useUnicode=true&characterEncoding=utf-8&serverTimezone=PRC&useSSL=true" />
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
<!--生产环境<environment id="production"></environment>-->
</environments>
<!-- 3. ORM -->
<mappers>
<!-- 通过这个文件 把 数据库中的表 映射到 实体类上去 -->
<mapper resource="com/bwf/mapper/User.xml"/>
</mappers>
</configuration>
既然配置好了模型对象,我们就需要一个User实体对象类 com.bwf.entity.User.class 一个最简单的实体类
package com.bwf.entity;
public class User {
private Integer id;
private String username;
private String gender;
private Integer score;
public User(Integer id, String username, String gender, Integer score) {
super();
this.id = id;
this.username = username;
this.gender = gender;
this.score = score;
}
public User() {
super();
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Integer getScore() {
return score;
}
public void setScore(Integer score) {
this.score = score;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", gender=" + gender + ", score=" + score + "]";
}
}
mybatis配置中配置好了ORM,我们当然要配置好映射文件啦 配置 com/bwf/mapper/User.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">
<!-- 对应 dao 中的 接口 -->
<mapper namespace="com.bwf.dao.UserDao">
<!-- 根据Id查询一个模型对象 -->
<!-- 对应 dao接口中的方法
id -> 方法名
parameterType -> 方法的形参类型
resultType -> 方法的返回值类型
-->
<select id="getUserById" parameterType="int" resultType="User">
select * from `user` where id = #{id}
</select>
</mapper>
上面的配置文件中,提到了UserDao接口,这就是我们调用jdbc的dao的接口,这里只需写接口,无需写实现,这就是mybatis框架为我们做的事,利用类反射来实现jdbc功能,下面根据上面的配置文件来写 com.bwf.dao.UserDao 接口
package com.bwf.dao;
import com.bwf.entity.User;
public interface UserDao {
User getUserById(int id);
}
没错,就是这么简单,有了上面的这些配置文件、实体类和接口,接下来我们需要一个工具类来通过mybatis的功能来加载这些配置文件,获取数据库连接,并调用我们的接口UserDao中的方法,来得到我们的实体类User对象,他就是 com.bwf.utils.MyBatisUtils.java
Reader对象用来加载mybatis的配置文件mybatis-config.xml,SqlSessonFactory对象通过reader对象读取的信息创造出SqlSession对象,通过getSession()方法实现
package com.bwf.utils;
import java.io.IOException;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MyBatisUtils {
private static SqlSessionFactory sqlSessionFactory;
private static Reader reader;
static {
try {
reader = Resources.getResourceAsReader("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSession() {
return sqlSessionFactory.openSession();
}
}
最后进行测试 com.bwf.test.test1.java
第一种方法直接通过SqlSession对象,通过类反射来调用接口UserDao的方法,不推荐使用
package com.bwf.test;
import org.apache.ibatis.session.SqlSession;
import com.bwf.entity.User;
import com.bwf.utils.MyBatisUtils;
public class Test1 {
public static void main(String[] args) {
SqlSession session = MyBatisUtils.getSession();
//不推荐使用
User user = session.selectOne("com.bwf.dao.UserDao.getUserById", 3);
System.out.println(user);
}
}
com.bwf.test.test2.java
这种方法通过SqlSession对象得到UserDao对象,再用Userdao对象调用其方法,推荐使用这种方法
package com.bwf.test;
import org.apache.ibatis.session.SqlSession;
import com.bwf.dao.UserDao;
import com.bwf.entity.User;
import com.bwf.utils.MyBatisUtils;
public class Test2 {
public static void main(String[] args) {
SqlSession session = MyBatisUtils.getSession();
//推荐使用的方法
UserDao userDao = session.getMapper(UserDao.class);
User user = userDao.getUserById(5);
System.out.println(user);
}
}
.sql文件
# MySQL-Front 5.1 (Build 4.2)
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE */;
/*!40101 SET SQL_MODE='STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES */;
/*!40103 SET SQL_NOTES='ON' */;
# Host: localhost Database: mybatis1
# ------------------------------------------------------
# Server version 5.5.20
DROP DATABASE IF EXISTS `mybatis1`;
CREATE DATABASE `mybatis1` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `mybatis1`;
#
# Source for table user
#
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) NOT NULL DEFAULT '',
`gender` char(4) NOT NULL DEFAULT '',
`score` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
#
# Dumping data for table user
#
INSERT INTO `user` VALUES (1,'jack','男',90);
INSERT INTO `user` VALUES (2,'Tom','男',60);
INSERT INTO `user` VALUES (3,'张三','男',70);
INSERT INTO `user` VALUES (4,'李四','女',99);
INSERT INTO `user` VALUES (5,'王五','女',60);
INSERT INTO `user` VALUES (6,'赵六','女',80);
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;