1、 mybatis的介绍
1.1 、mybatis 的概述
mybatis是一个持久层框架,用java编写的。它封装了jdbc操作的很多细节,使开发者只需要关注sql语句本身,而无需关注注册驱动,创建连接等繁杂过程。该框架使用了ORM思想实现了结果集的封装。
ORM 是 Object Relational Mappging 对象关系映射,简单的说:就是把数据库表和实体类及实体类的属性对应起来,让我们可以操作实体类就实现操作数据库表。
1.2、mybatis的特点
- MyBatis 是一款优秀的持久层框架
- 它支持定制化 SQL、存储过程以及高级映射。
- MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
- MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
1.3、为什么需要Mybatis?
- 帮助程序员将数据存入到数据库中。
- 传统的JDBC代码太复杂了。简化、框架、自动化。
- 优点:
- 简单易学、灵活
- sql和代码的分离,提高了可维护性。
- 提供映射标签,支持对象与数据库的orm字段关系映射
- 提供对象关系映射标签,支持对象关系组建维护
- 提供xml标签,支持编写动态sql。
2、第一个mybatis程序
2.1 准备工作
创建数据库并使用
CREATE DATABASE `mybatis`;
use `mybatis`;
创建一张user表
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`)
) 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', '女', '深圳' );
2.2 mybatis的环境搭建
-
新建一个普通的maven项目
-
删除src目录
-
导入maven依赖
<dependencies>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.1</version>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.17</version>
</dependency>
<!-- 日志-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<!-- junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.2</version>
</dependency>
</dependencies>
4、创建实体类 (该类中的字段一定要与数据库表中的字段一致)
public class User {
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
//省略get set方法 toString
..........
}
5、创建dao的接口
public interface IUserDao {
/**
* 查询所有的操作
* @return
*/
//@Select("select * from user")
List<User> findAll();
}
6、创建Mybatis的主配置文件 SqlMapConifg.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>
<!-- xml的配置方式 -->
<mapper resource="com/lipine/dao/IUserDao.xml"/>
<!--注解的方式 -->
<!-- <mapper class="com.lipine.dao.IUserDao"/>-->
</mappers>
</configuration>
7、创建映射配置文件 IUserDao.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.lipine.dao.IUserDao">
<!--配置查询所有-->
<select id="findAll" resultType="com.lipine.domain.User">
select * from user
</select>
</mapper>
环境搭建的注意事项:
-
创建IUserDao.xml 和 IUserDao.java时名称是为了和我们之前的知识保持一致。在Mybatis中它把持久层的操作接
口名称和映射文件也叫做:Mapper 所以:IUserDao 和 IUserMapper是一样的
-
在idea中创建目录的时候,它和包是不一样的,包在创建时:com.lipine.dao;它是三级结构目录在创建时
com.lipine.dao是一级目录。
-
mybatis的映射配置文件位置必须和dao接口的包结构相同
-
映射配置文件的mapper标签namespace属性的取值必须是dao接口的全限定类名
-
映射配置文件的操作配置(select),id属性的取值必须是dao接口的方法名
2.3 测试
新建MybatisTest
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接口的代理对象
IUserDao userDao = session.getMapper(IUserDao.class);
//5.使用代理对象执行方法
List<User> users = userDao.findAll();
for(User user : users){
System.out.println(user);
}
//6.释放资源
session.close();
in.close();
}
mybatis 基于注解的入门案例:
把IUserDao.xml移除,在 IUserDao接口的方法上使用@Select注解,并且指定SQL语句
同时需要在SqlMapConfig.xml中的mapper配置时,使用class属性指定 IUserDao接口的全限定类名。