开源持久层框架,只管访问数据库
底层为jdbc
优点:性能最高,已掌握。
缺点:代码繁琐。
Hibernate 冬眠
不用写sql,代码简洁
性能不好 person.hbm.xml cfg.xml两个配置文件,自动生成的dql效率低下,复杂业务
自动生成sql缺点很大。
MyBatis
优点:代码简洁,容易掌握
缺点:得写sql,性能一般。
sqlMapConfig.xml:用于加入数据库连接池,添加映射文件PersonMapper.xml,创建预编译的PerporedStatement方法。
sqlSessionFactory通过读取SqlMapFactory来创建Map,内容为键值对,其中为Statement,有了连接池就可以获得预编译。Map中键值对key为sql语句的id,值为sql语句。
java类中首先获得sqlsessionFactoryBuilder对象,新建数据流对配置文件进行读取,并获得sqlsessionFactory对象
sqlSessionFactory获得sqlsession对象,他会从map中依据sql id获取事先创建好的statement对象,然后执行。返回一个session对象。
session.insert方法中两个参数(test.save,e)
分别为namespace和sql id, e为实体类的实例化。
映射文件PersonMapper.xml用于书写sql语句。
#{pname}用于获得实体类对象中的get方法,加入sequence序列的类型。 parameterType为导入包的类型。
INSERT INTO PERSON VALUES(seq_newsId.nextval,#{pname},#{pwd})
1 导入jar包:myBatis
2 添加配置文件 sqlMapConfig.xml
3 编写实体类
getter setter 有参构造无参构造
4 编写映射文件 里面写sql语句
INSERT INTO PERSON VALUES(seq_newsId.nextval,#{pname},#{pwd})
5 调用SqlSession对象提供的方法来访问数据库。
public static void test1() {
String config = "sqlMapConfig.xml";
// 创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
// 创建sqlSessionFactory对象 新建数据流对文件进行读取
SqlSessionFactory ssf = ssfb.build(TestCase.class.getClassLoader().getResourceAsStream(config));
SqlSession session = ssf.openSession();
// 调用sqlSessionFactory提供的方法访问数据库
Person a = new Person();
a.setPname("Tony");
a.setPwd("yuquan");
session.insert("test.save", a);
session.commit();
session.close();
}
public static void main(String[] args) {
test1();
System.out.println("插入成功");
}
如果是查询,会先将记录中的数据放到一个Map对象中,字段名为key 字段值为value
接下来将Map对象中的书库放在对应的实体对象里面。
所有创建SqlSession对象的方法都可以共同加入一个方法,方便调用:
public static SqlSession init() {
String config = "sqlMapConfig.xml";
// 创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
// 创建sqlSessionFactory对象 新建数据流对文件进行读取
SqlSessionFactory ssf = ssfb.build(TestCase.class.getClassLoader().getResourceAsStream(config));
SqlSession session = ssf.openSession();
// 调用sqlSessionFactory提供的方法访问数据库
return session;
}
PersonMapper.xml
INSERT INTO PERSON VALUES(seq_newsId.nextval,#{pname},#{pwd})
UPDATE PERSON SET pname=#{pname},pwd=#{pwd} WHERE pid = #{pid}
DELETE FROM PERSON WHERE pid = #{asdasd}
TestCase.java
package Test;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.jupiter.api.Test;
import com.it.entity.Person;
public class TestCase {
private SqlSession session;
//创建session对象
public static SqlSession init() {
String config = "sqlMapConfig.xml";
// 创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
// 创建sqlSessionFactory对象 新建数据流对文件进行读取
SqlSessionFactory ssf = ssfb.build(TestCase.class.getClassLoader().getResourceAsStream(config));
SqlSession session = ssf.openSession();
// 调用sqlSessionFactory提供的方法访问数据库
return session;
}
//插入
public static void test1() {
Person a = new Person();
a.setPname("Tonyzhang");
a.setPwd("yuquan980730");
SqlSession session=init();
session.insert("test.save", a);
session.commit();
System.out.println("插入");
session.close();
}
//查询所有
public static void test2() {
/*String config = "sqlMapConfig.xml";
// 创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
// 创建sqlSessionFactory对象 新建数据流对文件进行读取
SqlSessionFactory ssf = ssfb.build(TestCase.class.getClassLoader().getResourceAsStream(config));
SqlSession session = ssf.openSession();
// 调用sqlSessionFactory提供的方法访问数据库
*/ SqlSession session=init();
List list=session.selectList("test.queryAll");
System.out.println("查询");
System.out.println(list);
for(Person a :list) {
System.out.println(a);
}
session.close();
}
//查询单个
public static void test3() {
SqlSession session=init();
Person a=session.selectOne("test.queryOne",5);
System.out.println(a);
session.close();
}
//更新測試方法
public static void test4() {
SqlSession session=init();
Person a=session.selectOne("test.queryOne", 5);
System.out.println("查詢到的結果:"+a);
a.setPname(a.getPname());
a.setPwd("愛愛豆豆");
session.update("test.update",a);
session.commit();
System.out.println("修改完成");
System.out.println("修改后的内容:"+a);
session.close();
}
//删除
public static void test5() {
SqlSession session=init();
Person a=session.selectOne("test.queryOne", 7);
System.out.println("即将删除的结果:"+a);
if(a!=null) {
session.delete("test.delete",7);
System.out.println("删除成功");
}else {
System.out.println("没有可以删除的内容");
}
session.commit();
session.close();
}
public static void main(String[] args) {
test5();
}
}
SQL语句在映射文件中写法较为特殊,需要记忆。