mybatis框架
- mybatis是一款优秀的持久性框架,它支持定制化SQL、存储过程以及高级映射。mybatis避免了几乎所有的jdbc代码和手动获取参数以及获取结果集。mybatis可以使用简单的xml或注解来配置和映射原生信息,将接口和java的pojos(普通的java对象)映射成数据库中的记录。
功能框架:
- API接口层(接口应用层):提供外部使用的接口API,开发人员通过这些本地API类操纵数据库。接口层一接收调用请求就会调用数据处理层来完成具体的数据处理(增删改查)。
- 数据处理层(sql处理层):负责具体的sql查找、sql解析、sql执行和执行结果的映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
- 基础支撑层(平台):负责最基础的功能支撑,包括连接管理、配置加载和缓冲处理,这些都是共同的东西,将他们抽取出来作为最基础最基础的组件。为上层的数据处理层提供最基础的支撑。
框架架构:
- 加载配置:
配置来源于两个方向,一处是配置文件,一处是java代码的注解,将SQL的配置信息加载成一个个mappedstatement对象(包括了传入参数映射配置、执行的sq1语句、结果映射配置),存储在内存中。配置来源于两个方向,一处是配置文件,一处是java代码的注解,将SQL的配置信息加载成一个个mappedstatement对象(包括了传入参数映射配置、执行的sq1语句、结果映射配置),存储在内存中。 - SQL解析:
当API接口层接收到调用请求,会接收到传入的sql的id和传入对象(可以是map、javabean或者基本数据类型),mybatis会根据传入参数对象对mappedstatement进行解析,解析后可以得到最终执行的sql语句和参数。 - SQL执行: 将最终得到的sql和参数拿到数据库进行执行,得到操作数据库的结果。
- 结果映射: 将操作数据库的结果按照映射的配置进行转换,可以转换成HashMap、JavaBean或者基本数据类型,并将最终结果返回。
mybatis具体操作步骤:
(0)数据库数据准备
创建数据库,并在库中创建表
DROP DATABASE IF EXISTS tcgbtms;
CREATE DATABASE tcgbtms default character set utf8;
打开数据库
use tcgbtms
创建表
drop table if exists `t_members`;
CREATE TABLE `t_members` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`nickname` varchar(255) DEFAULT NULL COMMENT '昵称',
`password` char(32) NOT NULL DEFAULT '' COMMENT '密码',
`realname` varchar(36) NOT NULL DEFAULT '' COMMENT '真实姓名',
`gender` enum('MALE','FEMALE','NONE') NOT NULL DEFAULT 'NONE' COMMENT '姓名',
`rank` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT '会员等级',
`email` char(50) NOT NULL DEFAULT '' COMMENT '邮箱',
`mobile` varchar(15) NOT NULL DEFAULT '' COMMENT '手机号',
`safequestion` varchar(255) NOT NULL DEFAULT '0' COMMENT '安全问题',
`safeanswer` char(30) NOT NULL DEFAULT '' COMMENT '安全答案',
`createdTime` datetime DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='会员表';
-
向表中写入数据
INSERT INTO `t_members` VALUES (1,'nick-01','123456','real-01','MALE',1,'e1@t.com','11111111111','1+1=?','2',NULL); INSERT INTO `t_members` VALUES (2,'nick-02','123456','real-02','FEMALE',1,'e2@t.com','11111111111','1+1=?','2',NULL);
(1)在pom.xml文件中配置mybatis中相关配置依赖驱动。 a)引入mysql数据库依赖:
<!--添加mysql驱动程序依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.40</version>
</dependency>
b)引入mybatis框架依赖
<!—- 添加mybatis框架依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.8</version> </dependency>
c)log4j日志管理依赖
<!—添加log4j依赖-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
(2)创建MyBatis核心配置文件-- mybatis-config.xml
a)mybatis-config.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">
<configuration>
<!-- 引入属性配置文件 -->
<properties resource="configs.properties"/>
<!-- 配置mybatis(setting可以配置日志缓存) -->
<settings>
<setting name="logImpl" value="log4j"/>
</settings>
<!-- 配置别名 -->
<typeAliases>
<typeAlias type="cn.tedu.pojo.User"
alias="User"/>
</typeAliases>
<!-- 配置初始化环境(连接) -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbcDriver}"/>
<property name="url" value="${jdbcUrl}"/>
<property name="username" value="${jdbcUser}"/>
<property name="password" value="${jdbcPassword}"/>
</dataSource>
</environment>
</environments>
<!-- 不能随便放,添加映射文件,environments之下 -->
<mappers>
<mapper resource=MemberMapper.xml"/>
</mappers>
</configuration>
b) 配置属性文件configs.properties
log4j.rootLogger=INFO,stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d [%-5p] %c - %m%n
log4j.logger.com.mybatis3=DEBUG
log4j.logger.com.pt=DEBUG(要求规范包名)
(3)创建持久化类和SQL映射文件
a)创建实体类com.pt.member.entity (包名).Member.java(类名)
package com.pt.member.entity;
import java.io.Serializable;
/**
* 借助实体类对象储存表中数据与对象中数据之间的映射
*/
public class Member implements Serializable{
//协议名版本号(序列化与反序列化)
private static final long serialVersionUID = 6546546546546546L;
private Integer id;
private String nickname;
private String password;
private String realname;
private String gender;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getRealname() {
return realname;
}
public void setRealname(String realname) {
this.realname = realname;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
//重写的toString方法,方便查询结果的输出
@Override
public String toString() {
return "Member [id=" + id + ", nickname=" + nickname + ", password=" + password + ", realname=" + realname
+ ", gender=" + gender + "]";
}
}
-
b)创建MemberMapper.xml映射文件
<!—此文件注意namespace(命名空间)、id(唯一标识)、resultType(结果类型) parameterType(参数类型) --> <?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.pt.member.dao.MemberDao"> <select id="findById" resultType="com.pt.member.entity.Member" parameterType="int" > select * from t_members where id=#{id} </select> </mapper>
-
c)定义接口com.pt.member.dao.MemberDao(类全名:包名+类名)
- //说明:接口的类全名要与映射文件的命名空间一致。 - public interface MemberDao{ - List<Member> findById(Integer id); - }
-
(4)创建测试类
-
a)创建测试基类TestBase:
public class TestBase { //1.声明 factory protected SqlSessionFactory factory; @Before public void init() throws Exception{ //2.读取配置文件 InputStream in = Resources.getResourceAsStream("mybatis-configs.xml"); //3.设置factory factory = new SqlSessionFactoryBuilder().build(in); } } b)创建测试类TestMember: public class TestMember extends TestBase { @Test public void testFindById () { //1.创建SqlSession对象 SqlSession session=factory.openSession(); //2.获取Dao接口 MemberDao dao = session.getMapper(MemberDao.class); //3.执行SQL操作 List<Member> list=dao.findById(6); //4.输出结果 for(Member m:list) { System.out.println(m); } //5.释放资源 session.close();}}