什麼是框架?
框架(Frame)可以理解爲是一個Jar包,裏面定義了一些類和接口的集合,供我們在開發中使用,也可以理解爲是某種應用的半成品,使用框架能極大的提高我們在開發中的效率,讓我們能更加專注於編程本身,而不是拘泥於某些細節。
框架存在的意義
框架要解決的最重要的一個問題是技術整合的問題,在 Java和J2EE中,有着各種各樣的技術,不同的開發需求就對應不同的技術要求,這就使得我們開發出來的應用高度依賴於這些技術,這樣一來就會讓技術自身的複雜性和風險性對開發的應用造成衝擊。因此爲了降低應用和技術耦合,於是就有了框架。這樣一來軟件的研發將集中在應用的設計上,而不是具體的技術實現,從而降低技術直接對應用產生影響,框架一般處在低層應用平臺(如 J2EE)和高層業務邏輯之間的中間層。
Java中的三層架構
一個完整的項目可以大致分爲三層架構,分別是表現層(UI)、邏輯層(BLL)以及數據訪問層(DAL),Java對此提出了分層思想,實現軟件工程中的“高內聚、低耦合”。把問題劃分開來各個解決,易於控制,易於延展,易於分配資源。 我們常見的MVC 軟件設計思想就是很好的分層思想。
基於這三層架構就出現了許多框架,比如在業務邏輯層上的典型框架有Spring、SpringBoot,常見的Web表現層的框架就有SpringMVC等、還有數據持久層框架Mybatis,也就是我今天學習的內容。
MyBatis
mybatis 是一個優秀的基於 java 的持久層框架,它內部封裝了 jdbc,讓我們在開發中可以直接使用封裝好的內容,不用再取做加載驅動、創建連接、創建statement的工作。
工作原理
mybatis 通過 xml 或註解的方式將要執行的各種 statement 配置起來,並通過 java 對象和 statement 中sql 的動態參數進行映射生成最終執行的 sql 語句,最後由 mybatis 框架執行 sql 並將結果映射爲 java 對象並返回。
基於XML使用mybatis完成數據訪問
步驟:
- 定義sqlMapConfig.xml配置文件,在裏面定義要連接的數據庫的driver、url、username、password。並在裏面配置Mapper映射的對應Dao層接口的xml文件
- 定義對應dao的xml文件,命名最好和對應Dao層接口的名稱一致。並再裏面定義好名稱空間、id以及ResultType(返回結果類型)
- 在要調用Dao層方法的地方完成以下步驟
-
讀取配置文件
InputStream is=Resources.getResourceAsStream("sqlMapConfig.xml");
-
創建sqlSessionFactory的構建着對象
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
-
使用構建者對象創建sqlSessionFactory
SqlSessionFactory factory =builder.build(is);
-
使用sqlSessionFaxtory創建sqlSession
SqlSession sqlSession=factory.openSession();
-
使用sqlSession創建dao接口的代理對象
StudentDao studentDao=sqlSession.getMapper(StudentDao.class);
-
使用代理對象執行dao接口的方法
List<Student> list = studentDao.findAll();
-
關流
session.close(); is.close();
-
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>
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test01"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="gzgs/dao/StudentDao.xml"></mapper>
</mappers>
</configuration>
StudentDao.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">
<mapper namespace="com.gzgs.dao.StudentDao">
<select id="findAll" resultType="com.gzgs.domain.Student">
select * from student
</select>
</mapper>
StudentTest.java
package com.gzgs.test;
import com.gzgs.dao.StudentDao;
import com.gzgs.domain.Student;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
import java.util.List;
public class StudentTest {
public static void main(String[] args)throws Exception {
//讀取配置文件
InputStream is=Resources.getResourceAsStream("sqlMapConfig.xml");
//常見sqlSessionFactory的構建着對象
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
//使用構建者對象創建sqlSessionFactory
SqlSessionFactory factory =builder.build(is);
//使用sqlSessionFaxtory創建sqlSession
SqlSession sqlSession=factory.openSession();
//使用sqlSession創建dao接口的代理對象
StudentDao studentDao=sqlSession.getMapper(StudentDao.class);
//使用代理對象執行dao接口的方法
List<Student> list = studentDao.findAll();
for (Student student:list){
System.out.println(student);
}
}
}
基於註解的使用方式
步驟:
-
定義sqlMapConfig.xml配置文件,在裏面定義要連接的數據庫的driver、url、username、password。並在裏面配置Mapper映射的對應Dao層接口的全限定類名
-
在對應的Dao層接口的方法上添加相應的註解
@Select("select * from student") public List<Student> findAll();
-
在要調用Dao層方法的地方完成以下步驟
-
讀取配置文件
InputStream is=Resources.getResourceAsStream("sqlMapConfig.xml");
-
創建sqlSessionFactory的構建着對象
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
-
使用構建者對象創建sqlSessionFactory
SqlSessionFactory factory =builder.build(is);
-
使用sqlSessionFaxtory創建sqlSession
SqlSession sqlSession=factory.openSession();
-
使用sqlSession創建dao接口的代理對象
StudentDao studentDao=sqlSession.getMapper(StudentDao.class);
-
使用代理對象執行dao接口的方法
List<Student> list = studentDao.findAll();
-
關流
session.close(); is.close();
-
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>
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test01"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper class="com.gzgs.dao.StudentDao"/>
</mappers>
</configuration>
StudentDao
package com.gzgs.dao;
import com.gzgs.domain.Student;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* 用戶的持久層接口
*/
public interface StudentDao {
@Select("select * from student")
public List<Student> findAll();
}
StudentTest.java
package com.gzgs.test;
import com.gzgs.dao.StudentDao;
import com.gzgs.domain.Student;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import javax.annotation.PreDestroy;
import java.io.InputStream;
import java.util.List;
public class StudentTest {
public static void main(String[] args)throws Exception{
//讀取配置文件
InputStream is= Resources.getResourceAsStream("sqlMapConfig.xml");
//創建SqlSessionFactoryBulider
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
//創建SqlSessionFactory
SqlSessionFactory factory = builder.build(is);
//創建SqlSession
SqlSession session=factory.openSession();
//實驗SqlSession生成代理對象
StudentDao dao=session.getMapper(StudentDao.class);
//使用dao執行方法
List<Student> all = dao.findAll();
for(Student student:all){
System.out.println(student);
}
//關流
session.close();
is.close();
}
}