Mybatis介绍及环境搭建
1 三层架构和ssm框架的对应关系
1.1 什么是框架
框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种定义认为,框架是可被应用开发者定制的应用骨架。前者是从应用方面而后者是从目的方面给出的定义。
简而言之,框架其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统。简单说就是使用别人搭好的舞台,你来做表演。而且,框架一般是成熟的,不断升级的软件。
它是我们软件开发中的一套解决方案,不同的框架解决的是不同的问题。
使用框架的好处:
框架封装了很多的细节,使开发者可以使用极简的方式实现功能。大大提高开发效率。
1.2 框架要解决的问题
框架要解决的最重要的一个问题是技术整合的问题,在 J2EE 的 框架中,有着各种各样的技术,不同的软件企业需要从 J2EE 中选择不同的技术,这就使得软件企业最终的应用依赖于这些技术,技术自身的复杂性和技术的风险性将会直接对应用造成冲击。而应用是软件企业的核心,是竞争力的关键所在,因此应该将应用自身的设计和具体的实现技术解耦。这样,软件企业的研发将集中在应用的设计上,而不是具体的技术实现,技术实现是应用的底层支撑,它不应该直接对应用产生影响。
框架一般处在低层应用平台(如 J2EE)和高层业务逻辑之间的中间层。
1.3 软件开发的分层重要性
框架的重要性在于它实现了部分功能,并且能够很好的将低层应用平台和高层业务逻辑进行了缓和。为了实现软件工程中的“高内聚、低耦合”。把问题划分开来各个解决,易于控制,易于延展,易于分配资源。我们常见的MVC 软件设计思想就是很好的分层思想。 如图所示:
通过分层更好的实现了各个部分的职责,在每一层将再细化出不同的框架,分别解决各层关注的问题。
1.4 三层架构
表现层:
是用于展示数据的。
业务层:
是处理业务需求。
持久层:
是和数据库交互的。
如图所示:
1.5 持久层技术解决方案
JDBC技术:
Connection
PreparedStatement
ResultSet
Spring的JdbcTemplate:
Spring中对jdbc的简单封装。
Apache的DBUtils:
它和Spring的JdbcTemplate很像,也是对Jdbc的简单封装。
以上这些都不是框架。
JDBC是规范
Spring的JdbcTemplate和Apache的DBUtils都只是工具类。
1.6 MyBatis 框架概述
mybatis是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建 statement等繁杂的过程。
mybatis通过xml或注解的方式将要执行的各种statement配置起来,并通过java对象和statement中sql 的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java 对象并返回。
采用ORM思想解决了实体和数据库映射的问题,对jdbc进行了封装,屏蔽了jdbc api底层访问细节,使我们不用与 jdbc api打交道,就可以完成对数据库的持久化操作。
为了我们能够更好掌握框架运行的内部过程,并且有更好的体验,下面我们将从自定义 Mybatis 框架开始来学习框架。此时我们将会体验框架从无到有的过程体验,也能够很好的综合前面阶段所学的基础。
mybatis是一个持久层框架,用java编写的。
它封装了jdbc操作的很多细节,使开发者只需要关注sql语句本身,而无需关注注册驱动,创建连接等繁杂过程。
它使用了ORM思想实现了结果集的封装。
ORM:
Object Relational Mappging 对象关系映射
简单的说:
就是把数据库表和实体类及实体类的属性对应起来
让我们可以操作实体类就实现操作数据库表。
user User
id userId
user_name userName
今天我们需要做到实体类中的属性和数据库表的字段名称保持一致。
user User
id id
user_name user_name
1.7 mybatis环境搭建-前期准备
首先创建数据库和表结构的代码如下:
CREATE DATABASE mybatis; -- 创建数据库
use mybatis; -- 使用数据库
CREATE TABLE `user` ( -- 创建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`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 插入数据
insert into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (41,'老王','2018-02-27 17:47:08','男','北京'),(42,'小二王','2018-03-02 15:09:37','女','北京金燕龙'),(43,'小二王','2018-03-04 11:34:34','女','北京金燕龙'),(45,'学无止路','2018-03-04 12:04:06','男','贵州省六盘水市'),(46,'老王','2018-03-07 17:37:26','男','北京'),(48,'小马宝莉','2018-03-08 11:44:00','女','北京修正');
-- 查询数据
SELECT * FROM user;
1.打开IDEA工具如图所示,并点击Create New Project。
2.选择Maven工程和JDK的版本,点击Next,如图所示:
3.填写项目名称和保存的地址,并点击Finish。如图所示:
4.导入相应的依赖jar包的代码如下:
<?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>com.txw</groupId>
<artifactId>day01_01mybatis</artifactId>
<version>1.0-SNAPSHOT</version>
<!--打包的方式-->
<packaging>jar</packaging>
<dependencies>
<!--mybatis的依赖jar包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
</dependencies>
</project>
5.编写用户的实体类代码如下:
package com.txw.domain;
import lombok.Data;
import lombok.ToString;
import java.io.Serializable;
import java.util.Date;
/**
* 用户的实体类
* @author:Adair
* @QQ:1578533828
*/
@Data // 自动生成set和get方法
@ToString // 重写toString方法
@SuppressWarnings("all") // 注解警告信息
public class User implements Serializable {
private Integer id; // 用户的id
private String username; // 用户名
private Date birthday; // 用户的生日
private String sex; // 用户的性别
private String address; // 用户的地址
}
6.编写实体类的持久层接口的代码如下:
package com.txw.dao;
import com.txw.domain.User;
import java.util.List;
/**
* 实体类的持久层接口
* @author:Adair
* @QQ:1578533828
*/
@SuppressWarnings("all") // 注解警告信息
public interface UserDao {
/**
* 查询所有操作
* @return
*/
List<User> findAll();
}
7.在resources目录下创建SqlMapConfig.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">
<!-- 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://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- 指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件 -->
<mappers>
<mapper resource="com/txw/dao/UserDao.xml"/>
</mappers>
</configuration>
8.在resources目录下创建com.txw.dao.UserDao.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="com.txw.dao.UserDao">
<!--配置查询所有-->
<select id="findAll" resultType="com.txw.domain.User">
select * from user
</select>
</mapper>
9.编写测试代码如下:
package com.txw.test;
import com.txw.dao.UserDao;
import com.txw.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.InputStream;
import java.util.List;
/**
* 测试
* @author:Adair
* @QQ:1578533828
*/
@SuppressWarnings("all") // 注解警告信息
public class MybatisTest {
/**
* 入门案例
* @param args
*/
public static void main(String[] args)throws Exception {
// 1.读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
// 2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
// 3.使用工厂生产SqlSession对象
SqlSession session = factory.openSession();
// 4.使用SqlSession创建Dao接口的代理对象
UserDao userDao = session.getMapper(UserDao.class);
// 5.使用代理对象执行方法
List<User> users = userDao.findAll();
for(User user : users){
System.out.println(user);
}
// 6.释放资源
session.close();
in.close();
}
}
运行结果如图所示:
注意事项:
不要忘记在映射配置中告知mybatis要封装到哪个实体类中。
配置的方式:指定实体类的全限定类名。
mybatis的环境搭建
第一步:创建maven工程并导入坐标。
第二步:创建实体类和dao的接口。
第三步:创建Mybatis的主配置文件。
SqlMapConifg.xml。
第四步:创建映射配置文件
UserDao.xml。
环境搭建的注意事项:
第一个:创建UserDao.xml 和 UserDao.java时名称是为了和我们之前的知识保持一致。
在Mybatis中它把持久层的操作接口名称和映射文件也叫做:Mapper。
所以:UserDao 和 IUserMapper是一样的。
第二个:在idea中创建目录的时候,它和包是不一样的。
包在创建时:com.txw.dao它是三级结构。
目录在创建时:com.txw.dao是一级目录。
第三个:mybatis的映射配置文件位置必须和dao接口的包结构相同。
第四个:映射配置文件的mapper标签namespace属性的取值必须是dao接口的全限定类名。
第五个:映射配置文件的操作配置(select),id属性的取值必须是dao接口的方法名。
当我们遵从了第三,四,五点之后,我们在开发中就无须再写dao的实现类。
入门分析如图所示:
1.8 mybatis注解开发和编写dao实现类的方式
1.8.1 mybatis注解开发
1.点击File,选择New,并点击Project。如图所示:
2.选择Maven工程和JDK的版本,点击Next,如图所示:
3.填写项目名称和保存的地址,并点击Finish。如图所示:
4.导入相应的依赖jar包的代码如下:
<?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>com.txw</groupId>
<artifactId>day01_02mybatis_annotation</artifactId>
<version>1.0-SNAPSHOT</version>
<!--打包的方式-->
<packaging>jar</packaging>
<dependencies>
<!--mybatis的依赖jar包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
</dependencies>
</project>
5.编写实体类的代码如下:
package com.txw.domain;
import lombok.Data;
import lombok.ToString;
import java.io.Serializable;
import java.util.Date;
/**
* 用户的实体类
* @author:Adair
* @QQ:1578533828
*/
@Data // 自动生成set和get方法
@ToString // 重写toString方法
@SuppressWarnings("all") // 注解警告信息
public class User implements Serializable {
private Integer id; // 用户的id
private String username; // 用户名
private Date birthday; // 用户的生日
private String sex; // 用户的性别
private String address; // 用户的地址
}
6.编写实体类持久层的代码如下:
package com.txw.dao;
import com.txw.domain.User;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* 实体类的持久层接口
* @author:Adair
* @QQ:1578533828
*/
@SuppressWarnings("all") // 注解警告信息
public interface UserDao {
/**
* 查询所有操作
* @return
*/
@Select("select * from user")
List<User> findAll();
}
7.在resources目录下创建SqlMapConfig.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">
<!-- 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://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- 指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件
如果是用注解来配置的话,此处应该使用class属性指定被注解的dao全限定类名
-->
<mappers>
<mapper class="com.txw.dao.UserDao"/>
</mappers>
</configuration>
8.编写测试的代码如下:
package com.txw.test;
import com.txw.dao.UserDao;
import com.txw.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.InputStream;
import java.util.List;
/**
* 测试
* @author:Adair
* @QQ:1578533828
*/
@SuppressWarnings("all") // 注解警告信息
public class MybatisTest {
/**
* 入门案例
* @param args
*/
public static void main(String[] args)throws Exception {
// 1.读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
// 2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
// 3.使用工厂生产SqlSession对象
SqlSession session = factory.openSession();
// 4.使用SqlSession创建Dao接口的代理对象
UserDao userDao = session.getMapper(UserDao.class);
// 5.使用代理对象执行方法
List<User> users = userDao.findAll();
for(User user : users){
System.out.println(user);
}
// 6.释放资源
session.close();
in.close();
}
}
运行结果如图所示:
mybatis基于注解的入门案例:
把UserDao.xml移除,在dao接口的方法上使用@Select注解,并且指定SQL语句
同时需要在SqlMapConfig.xml中的mapper配置时,使用class属性指定dao接口的全限定类名。
明确:
我们在实际开发中,都是越简便越好,所以都是采用不写dao实现类的方式。
不管使用XML还是注解配置。
但是Mybatis它是支持写dao实现类的。
1.8.2 编写dao实现类的方式
1.点击File,选择New,并点击Project。如图所示:
2.选择Maven工程和JDK的版本,点击Next,如图所示:
3.填写项目名称和保存的地址,并点击Finish。如图所示:
4.导入相应的依赖jar包的代码如下:
<?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>com.txw</groupId>
<artifactId>day01__03mybatis_dao</artifactId>
<version>1.0-SNAPSHOT</version>
<!--打包的方式-->
<packaging>jar</packaging>
<dependencies>
<!--mybatis的依赖jar包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
</dependencies>
</project>
5.编写实体类的代码如下:
package com.txw.domain;
import lombok.Data;
import lombok.ToString;
import java.io.Serializable;
import java.util.Date;
/**
* 用户的实体类
* @author:Adair
* @QQ:1578533828
*/
@Data // 自动生成set和get方法
@ToString // 重写toString方法
@SuppressWarnings("all") // 注解警告信息
public class User implements Serializable {
private Integer id; // 用户的id
private String username; // 用户名
private Date birthday; // 用户的生日
private String sex; // 用户的性别
private String address; // 用户的地址
}
6.编写实体类持久层的接口代码如下:
package com.txw.dao;
import com.txw.domain.User;
import java.util.List;
/**
* 实体类的持久层接口
* @author:Adair
* @QQ:1578533828
*/
@SuppressWarnings("all") // 注解警告信息
public interface UserDao {
/**
* 查询所有操作
* @return
*/
List<User> findAll();
}
7.编写实体类持久层的实现类代码如下:
package com.txw.dao.impl;
import com.txw.dao.UserDao;
import com.txw.domain.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import java.util.List;
/**
* 实体类的持久层实现类
* @author:Adair
* @QQ:1578533828
*/
@SuppressWarnings("all") // 注解警告信息
public class UserDaoImpl implements UserDao {
// 声明SqlSessionFactory∵东西
private SqlSessionFactory factory;
// 构造方法
public UserDaoImpl(SqlSessionFactory factory){
this.factory = factory;
}
/**
* 查询所有操作
* @return
*/
public List<User> findAll() {
// 1.使用工厂创建SqlSession对象
SqlSession session = factory.openSession();
// 2.使用session执行查询所有方法
List<User> users = session.selectList("com.txw.dao.UserDao.findAll");
session.close();
// 3.返回查询结果
return users;
}
}
8.在resources目录下创建SqlMapConfig.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">
<!-- 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://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- 指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件 -->
<mappers>
<mapper resource="com/txw/dao/UserDao.xml"/>
</mappers>
</configuration>
9.在resources目录下创建com.txw.dao.UserDao.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="com.txw.dao.UserDao">
<!--配置查询所有-->
<select id="findAll" resultType="com.txw.domain.User">
select * from user
</select>
</mapper>
10.编写测试代码如下:
package com.txw.test;
import com.txw.dao.UserDao;
import com.txw.dao.impl.UserDaoImpl;
import com.txw.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.InputStream;
import java.util.List;
/**
* 测试
* @author:Adair
* @QQ:1578533828
*/
@SuppressWarnings("all") // 注解警告信息
public class MybatisTest {
/**
* 入门案例
* @param args
*/
public static void main(String[] args)throws Exception {
// 1.读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
// 2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
// 3.使用工厂创建dao对象
UserDao userDao = new UserDaoImpl(factory);
// 4.使用代理对象执行方法
List<User> users = userDao.findAll();
for(User user : users){
System.out.println(user);
}
// 5.释放资源
in.close();
}
}
运行结果如图所示: