1:Hibernate
2:jdbcTemplate,Spring提供的,不是很好用,也是面向sql语句的,和ibatis以及Mybatis有类似之处,但是没有这两者好用,也没有这两者的功能强大。
3:ibatis,目前的最高版本到2。之前是阿帕奇公司的,后来被谷歌接管了,将ibatis改为mybatis,将整体的架构做了重构,语法用法有区别。但是核心的思想没有变化。现在使用的还是比较多
4:mybatis:
Mybatis和之前的hibernate有所不同:
Hibernate是完全orm的映射,是对象和模型关系进行映射。Mybatis更关注sql语句,更为灵活。Hibernate封装的东西更多,更厚。Mybatis封装的东西更薄,更为灵活。Mybatis的效率,性能更高。因为Mybaits直接执行的是sql语句,不像hibernate要执行一系列的对象之间的转换。
MyBatis的学习成本更低,较为好学。MyBatis将jdbc做了封装,但是不是简单的封装。
1:对jdbc做了很好的封装
2:容易掌握
3:灵活性强
其实不管是核心包还是依赖包这里面的东西都不多,所以我们的Mybatis是一个比较轻量级的框架。
这里使用Mysql数据库:
package com.lb.model;
import java.util.Date;
public class Persons {
private Integer id;
private String name;
private Integer gender;
private String adderss;
private Date birthday;
/*
* 类中的这些属性的属性名字必须要和我数据库中的字段对应。
* 这里赋值的原理是通过反射的方式,调用set方法。
*/
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getGender() {
return gender;
}
public void setGender(Integer gender) {
this.gender = gender;
}
public String getAdderss() {
return adderss;
}
public void setAdderss(String adderss) {
this.adderss = adderss;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "Persons [id=" + id + ", name=" + name + ", gender=" + gender
+ ", adderss=" + adderss + ", birthday=" + birthday + "]";
}
核心配置文件的模板
PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> |
建立每一个类的映射文件:
命名规范:
表名的驼峰模式,但是首个单词的首字母也要大写+Mapper.xml;
这是一种规范,但不是强制的,最好使用这种规范。
映射文件的模板
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> select * from Blog where id = #{id} |
第七步:测试:
public class Test {
SqlSessionFactory sessionFactory;
@Before
public void setUp() throws Exception {
//每次执行方法的时候,都先执行这个方法
//获得核心配置文件
InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml");
//初始化核心配置文件
sessionFactory = new SqlSessionFactoryBuilder().build(in);
}
@org.junit.Test
public void test() {
//创建SqlSession,通过工厂创建
SqlSession sqlSession = sessionFactory.openSession();
try {
//参数一:寻找我要使用的sql语句,通过命名空间和sql的id来获得
//第二个参数是,传递给sql的实参
Persons p = sqlSession.selectOne("com.lb.mapper.PersonsMapper.selectPersonById", 1);
System.out.println(p);
}finally{
//关闭Session
sqlSession.close();
}
}
}
细节详解:
1:对于Model实体,属性我如果没有提供公共的set方法,从数据库中获得的属性的值,也是可以获取的。这些值同样也可以注入进来。这里是Mybatis框架的策略,如果提供了set方法,就反射的调用set方法,来将值注入进来。没有提供set方法的话,就会根据字段和属性名字的匹配,直接赋值(虽然属性值是private的,但是通过反射的方式是可以将权限破坏的)
2:虽然属性名字和数据库中的字段要对应上,但是现实项目中,往往有时候对应不上。如果对应不上,我们是有策略解决的。
为什么有时候属性名字和数据库中的字段会对应不上:
在我们做项目的时候,有一些字段使用的不是一个单词,可能要使用多个单词连接。
上面这样显然是有问题的,但是我们无论是类中属性名字的命名规范还是数据库中字段的命名规范都是不能改变的,那么我们怎么来处理:
通过resultMap在中间提供一种映射,明确的指出,那个字段赋值给那个属性:
@org.junit.Test
public void test1() {
//创建SqlSession,通过工厂创建
SqlSession sqlSession = sessionFactory.openSession();
try {
//查询表中的总记录数
Integer count = sqlSession.selectOne("com.lb.mapper.PersonsMapper.selectPersonsCount");
System.out.println(count);
}finally{
//关闭Session
sqlSession.close();
}
}