三种连接数据库的技术性能比较:
开源持久层框架,只管访问数据库
底层为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为导入包的类型。
<mapper namespace="test">
<!-- id:要求唯一 parameterType:参数类型,填写实体类的完整名字 -->
<insert id="save" parameterType="com.it.entity.Person">
INSERT INTO PERSON VALUES(seq_newsId.nextval,#{pname},#{pwd})
</insert>
</mapper>
编程步骤:四种数据库基本操作方法CRUD
1 导入jar包:myBatis
2 添加配置文件 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">
<configuration>
<properties resource="db.properties"/>
<!-- 别名 包以其子包下所有类 头字母大小都行-->
<typeAliases>
<!-- <typeAlias type="com.itheima.mybatis.pojo.User" alias="User"/> -->
<package name="com.itheima.mybatis.pojo"/>
</typeAliases>
<!-- 和spring整合后 environments配置将废除 -->
<environments default="environments">
<environment id="environments">
<!-- 使用jdbc事务管理 -->
<transactionManager type="JDBC" /> <!-- 数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="${database.driverClassName}"></property><!-- oracle.jdbc.driver.OracleDriver -->
<property name="url" value="${database.url}"></property><!-- jdbc:oracle:thin:@localhost:1521:orcl -->
<property name="username" value="${database.username}"></property>
<property name="password" value="${database.password}"></property>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="PersonMapper.xml"/>
</mappers>
</configuration>
3 编写实体类
getter setter 有参构造无参构造
4 编写映射文件 里面写sql语句
<?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">
<!-- 写Sql语句 -->
<mapper namespace="test">
<!-- id:要求唯一
parameterType:参数类型,填写实体类的完整名字 -->
<insert id="save" parameterType="com.it.entity.Person">
INSERT INTO PERSON VALUES(seq_newsId.nextval,#{pname},#{pwd})
</insert>
</mapper>
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
<?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">
<!-- 写Sql语句 -->
<mapper namespace="test">
<!-- id:要求唯一 parameterType:参数类型,填写实体类的完整名字 -->
<insert id="save" parameterType="com.it.entity.Person">
INSERT INTO PERSON VALUES(seq_newsId.nextval,#{pname},#{pwd})
</insert>
<select id="queryAll" resultType="com.it.entity.Person">
SELECT * FROM PERSON
</select>
<select id="queryOne" parameterType="int" resultType="com.it.entity.Person">
SELECT * FROM PERSON WHERE pid = #{rtttt}
</select>
<update id="update" parameterType="com.it.entity.Person">
UPDATE PERSON SET pname=#{pname},pwd=#{pwd} WHERE pid = #{pid}
</update>
<delete id="delete" parameterType="int">
DELETE FROM PERSON WHERE pid = #{asdasd}
</delete>
</mapper>
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<Person> 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语句在映射文件中写法较为特殊,需要记忆。