1.数据持久化
要用MyBatis框架,首先要了解数据持久化技术,程序在内存中是瞬时存在的,数据库里的信息是持久存在的,通过ORM(Object/Relational Mapping)映射,让对象的属性信息通过一种规范与数据库里的信息实现一一对应。一般将类名与表名一致,类属性与表字段(列)一致,类属性的数据类型要和字段类型一致,这样,对象的信息就可以持久存在数据库中了
ORM的理解:
O:object,对象,指java类里的对象
R:relation,关系,指数据库里的关系表
M:Mapper,映射,o—>r的映射
2.Mybatis介绍
知道数据持久化概念和ORM之后,就应该会想这种映射模式已经提出来了,但是如何实现呢?MyBatis就是用来实现ORM的一种框架,MyBatis是一种半自动化框架,它能将xml文件里的sql语句的结果自动的转化为对象,我们要做的就是在xml文件里定义好该sql语句的id,参数,返回值类型。我们以后要用的sql语句(增删改查)就在该xml文件里写好,以后在java类(Mapper)中直接解析该xml文件即可使用sql语句,省去程序员重复编写sql语句的过程,让程序员专心专注于自己面向对象的世界里~~便捷的实现增删改查
MyBatis的使用步骤
1.导入MyBatis要用到的jar包
a.新建一个项目,我这里就叫mybatis01
b.到网上下载这三个jar包
MyBatis的前身是ibatis,ibatis更新的2版本时开始的MyBatis,Mybatis是从3版本直接命名的
c.将下载的jar包复制到src目录下
d.右键选择构建模块
第一步完成
2.编写MyBatis的主配置xml文件,我这里叫mybatis-config.xml
这个是主配置文件,代码不需要死记,MaBtis提供的有模板,网上找到copy即可。
主要是需要理解那几个标签的含义
是最大父标签,里面写的是配置信息
这里的environments的default是要和你要用的environment的id对应的,事实上我们现在只用到一个environment,这里写的是环境信息
jdbc事务管理
以链接池的方式链接
第二步完成
3.创建实体类
首先在数据库建表
我以这个users表为例
编写实体类
为了清晰的和后面的dao层映射对应,先创建一个包,以com包为例,在com包下创建bean包以后专门存放实体类
在该包中创建实体类
package com.bean;
import java.util.Date;
public class Users {
private int id;
private String realname;
private String nickname;
private String pwd;
private String phone;
private String email;
private String address;
private Date createTime;
private int type;
private String realid;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getRealname() {
return realname;
}
public void setRealname(String realname) {
this.realname = realname;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public String getRealid() {
return realid;
}
public void setRealid(String realid) {
this.realid = realid;
}
}
第三步完成
4.实现dao层映射(以查找为例)
在该com包下在新建一个dao包,用来专门存放Mapper
创建接口UsersMapper,定义查找方法
package com.dao;
import com.bean.Users;
import java.util.List;
public interface UsersMapper {
Users findById(int id);
}
编写映射文件UsersMapper.xml
注意:
这里就是o—>r的映射
是查询语句的标签,java
<select id=“findById”.为了方便以后解析找到该sql语句,这里的namespace一般以包名.类名命名,id以方法名命名
千万不要忽略这个parameterType,这个参数的值是要给sql语句里的#{}占位符的,它就是sql语句里要用到的参数
resultType,刚刚说MyBatis是一种半自动化的框架,类属性名和表字段名是我们手工创建对应的,而这个 resultType指定的返回值类型,MyBatis会帮我们把这个select语句的返回值自动装成该类型对应的对象比如说这个语句,通过id查找的一行结果,MyBatis会自动的装成Users对象,并将对应的属性赋值
到这里,我们的映射工作就已经完成啦
5.创建测试类
a.将UsersMapper.xml配置到主配置文件mybatis-config里
创建测试类UsersMapperTest
package com.dao;
import com.bean.Users;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Assert;
import org.junit.Test;
import org.apache.ibatis.session.SqlSessionFactory;
import java.io.IOException;
import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
public class UsersMapperTest {
static final String CONF_FILE="mybatis-config.xml";
static SqlSessionFactory factory=null;
//静态代码块实例化静态成员
static {
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
try {
InputStream resourceAsStream= Resources.getResourceAsStream(CONF_FILE);
factory=builder.build(resourceAsStream);
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void findById(){
SqlSession session=factory.openSession();
Users user= session.selectOne("com.dao.UsersMapper.findById",1);
session.close();
//断言
//assert (user!null);
Assert.assertNotNull(user);
Assert.assertEquals("管理员",user.getNickname());
Assert.assertEquals("123",user.getPwd());
SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");
String dateStr=df.format(user.getCreateTime());
Assert.assertEquals("2019-10-09",dateStr);
}
SqlsessionFactoryBuilder—>SqlsessionFactory—>Sqlsession
Sqlsession实现对数据库的一次会话
顺便提一下,有兴趣的可以到网上找xml的解析过程。有助于理解