01.【MyBatis框架】
1. 前提
什么是框架
它是我们软件开发中的一套解决方案,不同的框架解决的是不同的问题。
使用框架的好处:框架封装了很多的细节,使开发者可以使用极简的方式实现功能。大大提高开发效率。
三层架构
- 表现层:是用于展示数据的
- 业务层:是处理业务需求
- 持久层:是和数据库交互的
持久层技术解决方案
-
JDBC技术:
Connection
、PreparedStatement
、ResultSet
-
Spring的JdbcTemplate:Spring中对jdbc的简单封装
-
Apache的DBUtils:它和Spring的JdbcTemplate很像,也是对Jdbc的简单封装
以上这些都不是框架
-
JDBC是规范
-
Spring的JdbcTemplate和Apache的DBUtils都只是工具类
2. mybatis的概述
mybatis是一个持久层框架,用java编写的。
它封装了jdbc操作的很多细节,使开发者只需要关注sql语句本身,而无需关注注册驱动,创建连接等繁杂过程
它使用了ORM思想实现了结果集的封装。
四大部分组成
mybatis的分析
ORM:对象关系映射
Object Relational Mappging
简单的说:就是把数据库表和实体类及实体类的属性对应起来,让我们可以操作实体类就实现操作数据库表。
user User
id userId
user_name userName
今天我们需要做到,,实体类中的属性和数据库表的字段名称保持一致。
user User
id id
user_name user_name
3. 入门
环境搭建
- 创建maven工程并导入坐标
- 创建实体类和dao的接口
- 创建Mybatis的主配置文件:
SqlMapConifg.xml
- 创建映射配置文件:
IUserDao.xml
测试类步骤
第一步:读取配置文件
第二步:创建SqlSessionFactory工厂
第三步:创建SqlSession
第四步:创建Dao接口的代理对象
第五步:执行dao中的方法
第六步:释放资源
目录结构
注意事项
-
创建IUserDao.xml 和 IUserDao.java时名称是为了和我们之前的知识保持一致。
在Mybatis中它把持久层的操作接口名称和映射文件也叫做:Mapper
所以:IUserDao 和 IUserMapper是一样的
-
在idea中创建目录的时候,它和包是不一样的
包在创建时:com.itheima.dao它是三级结构
目录在创建时:com.itheima.dao是一级目录 (不能一起创建!)
-
mybatis的映射配置文件位置必须和dao接口的包结构相同
-
映射配置文件的mapper标签namespace属性的取值必须是dao接口的全限定类名
-
映射配置文件的操作配置(select),id属性的取值必须是dao接口的方法名
-
不要忘记在映射配置中告知mybatis要封装到哪个实体类中
配置的方式:指定实体类的全限定类名
当我们遵从了第三,四,五点之后,我们在开发中就无须再写dao的实现类。
基础代码
- pom.xml
<?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.luis</groupId>
<artifactId>day01_01mybatis</artifactId>
<version>1.0-SNAPSHOT</version>
<!--打包方式-->
<packaging>jar</packaging>
<dependencies>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<!--log4j-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<!--Junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<!--只在测试时起作用-->
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<!--jdk编译插件-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>1.9</source>
<target>1.9</target>
<encoding>utf-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
- domain包
package cn.luis.domain;
import java.io.Serializable;
import java.util.Date;
/**
* @ClassName User
* @Description TODO
* @Author L
* @Date 2020.02.28 17:24
* @Version 1.0
* @Remark TODO
**/
public class User implements Serializable {
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
// 省略...
}
}
- dao包
package cn.luis.dao;
import cn.luis.domain.User;
import java.util.List;
/**
* @InterfaceName IUserDao
* @Description 用户的持久层接口
* @Author L
* @Date 2020.02.28 18:54
* @Version 1.0
* @Remark TODO
**/
public interface IUserDao {
/**
* @Description 查询所有操作
* @Author Luis
* @Date 2020.02.28 18:56
* @Param []
* @Return java.util.List<cn.luis.domain.User>
**/
List<User> findAll();
}
- 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="root"/>
</dataSource>
</environment>
</environments>
<!--指定映射配置文件的位置,映射配置文件的是每个dao独立的配置文件-->
<mappers>
<mapper resource="cn/luis/dao/IUserDao.xml"/>
</mappers>
</configuration>
- IUserDao.xml
-
【namespace】用于绑定Dao接口的,即面向接口编程
它的好处在于当使用了namespace之后就可以不用写接口实现类,
业务逻辑会直接通过这个绑定寻找到相对应的SQL语句进行对应的数据处理
<?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="cn.luis.dao.IUserDao">
<!--配置查询所有 id:方法名称 resultType:把结果集封装到哪里去-->
<select id="findAll" resultType="cn.luis.domain.User">
/*sql语句*/
select * from user
</select>
</mapper>
- 测试类
代码:
package cn.luis.test;
import java.io.InputStream;
import java.util.List;
import cn.luis.dao.IUserDao;
import cn.luis.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;
/**
* @ClassName MyBatisTest
* @Description mybatis入门案例
* @Author L
* @Date 2020.02.28 20:00
* @Version 1.0
* @Remark TODO
**/
public class MyBatisTest {
/**
* @Description 入门案例
* @Author Luis
* @Date 2020.02.28 20:01
* @Param [args]
* @Return void
**/
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接口的代理对象 (session根据字节码文件生成代理对象)
IUserDao dao = session.getMapper(IUserDao.class);
// 5.使用代理对象执行方法
List<User> users = dao.findAll();
for (User user : users) {
System.out.println(user);
}
// 6.释放资源
session.close();
in.close();
}
}
结果:
User{id=41, username='老王', birthday=Tue Feb 27 17:47:08 CST 2018, sex='男', address='北京'}
User{id=42, username='小二王', birthday=Fri Mar 02 15:09:37 CST 2018, sex='女', address='北京金燕龙'}
User{id=43, username='小二王', birthday=Sun Mar 04 11:34:34 CST 2018, sex='女', address='北京金燕龙'}
User{id=45, username='mybatis updateuser', birthday=Sun Mar 01 01:14:18 CST 2020, sex='女', address='沈阳'}
User{id=46, username='老王', birthday=Wed Mar 07 17:37:26 CST 2018, sex='男', address='北京'}
User{id=48, username='小马宝莉', birthday=Thu Mar 08 11:44:00 CST 2018, sex='女', address='北京修正'}
User{id=50, username='mybatis last insertid', birthday=Sun Mar 01 02:18:02 CST 2020, sex='男', address='沈阳'}
User{id=51, username='mybatis last insertid', birthday=Sun Mar 01 21:21:08 CST 2020, sex='男', address='沈阳'}
下一篇: Java基础——基本概念
推荐阅读
-
01.【MyBatis框架】
-
Mybatis框架_day01
-
SSM框架分页查询NullPointerException
-
SSM框架实现分页查询例子
-
Spring集成Quartz定时任务框架介绍和Cron表达式详解 博客分类: spring
-
canvas学习 博客分类: web框架 web进度条js
-
Spring集成Quartz定时任务框架介绍和Cron表达式详解 博客分类: spring
-
选择器学习 博客分类: web框架 cssjshtml
-
ibatis文档 博客分类: web框架 线程安全sqlmap新手入门注意事项mybatis
-
form表单的Action.java文件和jsp之间数据传递 博客分类: web框架 strutsjavajspJavaScriptXHTML