目录
01-MyBatis
第1 章 框架概述
1.1 什么是框架
框架(Framework
)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法
; 另一种 定义认为,框架是可被应用开发者定制的应用骨架。前者是从应用方面而后者是从目的方面给出的定 义。 简而言之,框架其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统。简单说就是 使用别 人搭好的舞台,你来做表演。而且,框架一般是成熟的,不断升级的软件。 它是我们软件开发中的一套解决方案,不同的框架解决的是不同的问题。 使用框架的好处: 框架封装了很多的细节,使开发者可以使用极简的方式实现功能。大大提高开发效率。
1.2 框架要解决的问题
框架要解决的最重要的一个问题是技术整合的问题,在 J2EE 的 框架中,有着各种各样的技术,不同的 软件企业需要从 J2EE 中选择不同的技术,这就使得软件企业最终的应用依赖于这些技术,技术自身的复杂性和技术的风险性将会直接对应用造成冲击。而应用是软件企业的核心,是竞争力的关键所在,因 此应该将应用自身的设计和具体的实现技术解耦。这样,软件企业的研发将集中在应用的设计上,而不 是具体的技术实现,技术实现是应用的底层支撑,它不应该直接对应用产生影响。
1.3 软件开发的分层重要性
框架的重要性在于它实现了部分功能,并且能够很好的将低层应用平台和高层业务逻辑进行了缓和。为 了实现 软件工程中的“高内聚、低耦合
”
。把问题划分开来各个解决,易于控制,易于延展,易于分配资源。我 们常见的 MVC 软件设计思想就是很好的分层思想。
1.4 javaEE下常见的分层框架
框架图解:
1.4.1 解决数据库持久化问题的框架
Mybatis
mybatis是一个优秀的基于
java
的持久层框架,它内部封装了
jdbc
,使开发者只需要关注
sql
语句本身,而 不需要花费精力去处理加载驱动、创建连接、创建statement
等繁杂的过程。
SpringMVC
在web
模型中,
MVC
是一种很流行的框架,通过把
Model
,
View
,
Controller
分离,把较为复杂的
web应用分成逻辑清晰的几部分,是为了简化开发,减少出错。还是为了组内开发人员之间的配合。总之就是一种分层工作的办法。
SpringMVC
,是
spring
的一个子框架,当然拥有
spring
的特性,如依赖注入。
Spring下的子项目:
Spring Web MVC
是一种基于
Java
的实现了
Web MVC
设计模式的请求驱动类型的轻量级Web
框架,即使用了
MVC
架构模式的思想,将
web
层进行职责解耦,基于请求驱动指的就是使用请求-
响应模型,框架的目的就是帮助我们简化开发,
Spring Web MVC
也是要简化我们日常
Web
开发的。
Spring ,
spring是开源的轻量级框架
spring主要由两部分:1.面向切面编程(aop)不需要去修改源代码去增强方法的功能。2.控制反转(ioc) 极大程度地解决了程序之间的耦合度,通过spring去管理javabean对象,减少代码与代码之间的依赖关系。
1.5 回顾JDBC
package com.test.jdbc;
import javax.xml.transform.Result;
import java.sql.*;
public class jjdbcText {
public static void main(String[] args) throws Exception {
// 连接对象
Connection connection = null;
// 执行对象
PreparedStatement preparedStatement = null;
// 结果集
ResultSet resultSet = null;
try{
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql://192.168.137.168/travel?serverTimezone=UTC","root","123456");
String sql = "select * from tab_user";
preparedStatement = connection.prepareStatement(sql);
resultSet = preparedStatement.executeQuery();
while (resultSet.next()){
System.out.println(resultSet);
}
}catch ( Exception e ){
System.out.println();
}
// 释放资源......
}
}
1.6问题分析
- 每执行一次都会创建一次链接释放一次连接,极大的造成了性能资源的浪费
- 加载驱动,数据库,连接数据库的账号密码全部使用硬编码直接写死,不利于代码维护与管理
- sql语句糅杂在java代码中,耦合度高,可读性低
- 结果集每次都要一个一个手动判断获取,提高了代码书写的工作量
第2章 Mybatis 框架快速入门
2.1 mybatis概述
Mybatis
是一个持久层框架,用
java
编写的。
它封装了jdbc
操作的很多细节,使开发者只需要关注
sql
语句本身,而无需关注注册驱动,创建连接
等繁杂过程
它使用了ORM(Object Relational Mappging
对象关系映射)思想实现了结果集的封装。简单的说:
就是把数据库表和实体类及实体类的属性对应起来让我们可以操作实体类就实现操作数据库表。
2.2创建测试用的数据表
CREATE TABLE`user`
(
`id` int(11) NOT NULL auto_increment,
`username` varchar(32) NOT NULL COMMENT '用户名称',
`birthday` datetime default NULL COMMENT '生日',
`sex` char(1) default NULL COMMENT '性别',
`address` varchar(256) default NULL COMMENT '地址',
PRIMARY KEY (`id`)
);
insert into`user`(`id`,`username`,`birthday`,`sex`,`address`)values(41,'老
王','2020-02-27 17:47:08','男','北京'),(42,'小二王','2020-03-02 15:09:37','女','北京金燕龙'),(43,'小二王','2020-03-04 11:34:34','女','北京金燕龙'),(45,'六星教育','2020-03-04 12:04:06','男','北京金燕龙'),(46,'老王','2020-03-07 17:37:26','男','北京'),
(48,'小马宝莉','2020-03-08 11:44:00','女','北京修正');
2.3创建maven工程
maven配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<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>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>
<!--mybatis依赖jar包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!--单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
<!--MySQL数据库-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId><version>8.0.19</version>
<scope>runtime</scope>
</dependency>
<!--日志信息-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
</dependencies>
</project>
2.4对照数据表编写实体类
package com.haohao.domain;
import java.io.Serializable;
import java.util.Date;
public class user implements Serializable {
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
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 Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "user{" +
"id=" + id +
", username='" + username + '\'' +
", birthday=" + birthday +
", sex='" + sex + '\'' +
", address='" + address + '\'' +
'}';
}
}
2.5编写持久层接口UserDao
package com.haohao.dao;
import com.haohao.domain.User;
import java.util.List;
public interface UserDao {
/**
* 查询所有用户
* @return
*/
List<User> findAll();
}
2.6编写SqlMapConfig.xml 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTDConfig3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--mybatis的主配置文件-->
<configuration>
<!--配置环境-->
<environments default="mysql">
<!--配置mysql的环境-->
<environment id="mysql">
<!--配置事务的类型-->
<transactionManager type="JDBC">
</transactionManager>
<!--配置数据源(连接池)-->
<dataSource type="POOLED">
<!--配置连接数据库的4个基本信息-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://192.168.137.168:3306/travel?serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--配置映射关系-->
<mappers>
<mapper resource="com/haohao/dao/UserDao.xml"/>
</mappers>
</configuration>
2.7编写UserDao的映射文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTDMapper3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace:传入全限定类名-->
<mapper namespace="com.haohao.dao.UserDao">
<!-- 方法与sql语句的映射关系 查询集类型-->
<select id="findAll" resultType="com.haohao.domain.User">
SELECT * FROM user
</select>
</mapper>
2.8配置日志文件(从网上找一个)
### 设置###
log4j.rootLogger = debug,stdout,D,E
### 输出信息到控制抬 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
### 输出DEBUG 级别以上的日志到=E://logs/error.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = E://logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### 输出ERROR 级别以上的日志到=E://logs/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =E://logs/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
2.9测试类
import com.haohao.dao.UserDao;
import com.haohao.domain.User;
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;
import java.util.List;
public class MyBatisTest {
public static void main(String[] args) throws IOException {
//1.读取配置文件
InputStream in=Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建SqlSessionFactory的构建者对象
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
//3.使用构建者创建工厂对象SqlSessionFactory
SqlSessionFactory factory=builder.build(in);
//4.使用SqlSessionFactory生产SqlSession对象
SqlSession session=factory.openSession();
//5.使用SqlSession创建dao接口的代理对象
UserDao userDao=session.getMapper(UserDao.class);
//6.使用代理对象执行查询所有方法
List<User> users=userDao.findAll();
for (User u:users) {
System.out.println(u);
}
session.close();
}
}
补充:使用注解配置mybatis
1.添加注解
/**
*查询所有用户
*@return
*/
@Select("select * fromuser")
List<User>findAll();
2.修改SqlMapConfig.xml中mapper属性class为添加注解的类
<mappers>
<mapper class="com.sixstar.dao.UserDao"/>
</mappers>
总结:
通过快速入门示例,我们发现使用 mybatis
是非常容易的一件事情,因为只需要编写
Dao
接口并且按照 mybatis 要求编写两个配置文件,就可以实现功能。远比我们之前的 jdbc
方便多了。(我们使用注解
之后,将变得更为简单,只需要编写一个
mybatis 配置文件就够了。)
但是,这里面包含了许多细节,比如为什么会有工厂对象(
SqlSessionFactory
)
,
为什么有了工厂之后还 要有构建者对象(SqlSessionFactoryBuilder),为什么
IUserDao.xml
在创建时有位置和文件名的要
求等等。这些问题我们在自定义
mybatis 框架的章节,通过层层剥离的方式,给大家讲解。
请注意:我们讲解自定义
Mybatis
框架,不是让大家回去自己去写个
mybatis
,而是让我们能更好的了解 mybatis 内部是怎么执行的,在以后的开发中能更好的使用 mybatis
框架,同时对它的设计理念(设计模式)有 一个认识。