框架初学之MyBatis
框架
什么是框架
框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种定义认为,框架是可被应用开发者定制的应用骨架。前者是从应用方面而后者是从目的方面给出的定义。
简而言之,框架其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统。简单说就是使用别人搭好的舞台,你来做表演。而且,框架一般是成熟的,不断升级的软件。
使用框架的好处
框架封装了很多的细节,使开发者可以使用极简的方式实现功能,大大提高开发效率。
三层架构
表现层:用于展示数据
业务层:处理业务需求
持久层:是和数据库交互的
(MyBatis:持久层框架,实现增删改查)
持久层技术解决方案
JDBC技术
Connection
PreparedStatement
ResultSet
Spring的Jdbc Template
Spring中对jdbc的简单封装
Apache的DBUtils
他和Spring的JdbcTemplate很像,也是对Jdbc的简单封装
但以上这些都不是框架
JDBC是规范
Spring的JdbcTemplate和Apache的DBUtils都只是工具类
MyBatis框架概述
是一个持久层框架,使用java语言
封装了jdbc操作的很多细节,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动
它使用了ORM思想实现了结果集的封装
ORM
Object Telational Mappging 对象关系映射
简单的说
就是把数据库表和实体类的属性对应起来
让我们可以操作实体类就实现操作数据库表
需要做到
实体类中的属性和数据库表中的字段名称保持一致
mybatis的入门
mybatis的环境搭建
首先在idea中创建maven工程。
然后在pom.xml中添加上下列代码
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.18</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>
</dependency>
</dependencies>
(如果写完之后标红,记得刷新一下Maven就可)
然后在main下的java中创建User类
import java.io.Serializable;
import java.sql.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 + '\'' +
'}';
}
}
创建dao层IUserdao接口
import com.hncj.domain.User;
import java.util.List;
public interface IUserdao {
/*
* 查询所有操作
* @return
* */
List<User>findAll();
}
接下来在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/eesy_mybatis"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- 指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件 -->
<mappers>
<mapper resource="com/hncj/dao/IUserdao.xml"/>
</mappers>
</configuration>
然后在resources中,根据SQLMapConfig.xml文件中mapper中的参数创建Directory文件夹,最后创建一个file文件(一定跟mapper中参数的名字需要一摸一样)
例如,SQLMapConfig.xml文件mapper属性中写着
<mapper resource="com/itheima/dao/IUserdao.xml"/>
则需要右键点击resources选择new然后选择Directory,创建com
然后右键点击com选择new,然后选择Directory,创建itheima
依次循环,直到最后一个,选择new后,选择file,创建IUserDao.xml文件
创建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.hncj.dao.IUserDao">
<!--配置查询所有-->
<select id="findAll" resultType="com.hncj.domain.User">
select * from user
</select>
</mapper>
在resources中直接拷入log4j.properties文件
https://pan.baidu.com/s/1pLIAdBMLjpFk4X2rcCvXxQ 提取码:dvj8
注意事项
1.创建IUserDao.xml和IUserDao.java时名称是为了保持一致
在Mybatis中它把持久层的操作接口名称和映射文件也叫做Mapper
所以:IUserDao和IUserMapper是一样的
2.在idea中创建目录是,他和包是不一样的
包在创建时:com.itheima.dao是三级结构
目录创建时:com.itheima.dao是一级目录
3.mybatis的映射配置文件位置必须和dao接口的包结构相同
4.映射配置文件的mapper标签namespace属性的取值必须是dao接口的全限定类名
5.映射配置文件的操作配置,id属性的取值必须是dao接口的方法名
测试
在text文件夹下,创建com.hncj.test.MybatisTest实现类
package com.hncj.test;
import com.hncj.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;
public class 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();
}
}
项目结构
另附数据库代码
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','女','北京修正');