java priorityqueue,mybatis基礎總結01

 2023-10-20 阅读 29 评论 0

摘要:背景介紹: 1.ORM 對象關系映射模式 面向對象編程和關系型數據庫,都是目前最流行的技術,但是它們的模型是不一樣的。 面向對象編程把所有實體看成對象(object),關系型數據庫則是采用實體之間的關系(relation)連接數據

背景介紹:
1.ORM 對象關系映射模式
面向對象編程和關系型數據庫,都是目前最流行的技術,但是它們的模型是不一樣的。
面向對象編程把所有實體看成對象(object),關系型數據庫則是采用實體之間的關系(relation)連接數據。很早就有人提出,關系也可以用對象表達,這樣的話,就能使用面向對象編程,來操作關系型數據庫
簡單說,ORM 就是通過實例對象的語法,完成關系型數據庫的操作的技術,是"對象-關系映射"(Object/Relational Mapping) 的縮寫。
查看圖片:ORM示例圖.jpg
ORM把數據庫映射成對象。
2.三層架構:
表示層(web) 業務邏輯層(service) 持久化層(dao)
springMVC spring mybatis

一 、mybatis入門
1.1 mybatis是什么
MyBatis是一個簡化和實現了 Java 數據持久化層(persistence layer)的開源框架,它抽象了大量的JDBC冗余代碼,并提供了一個簡單易用的API和數據庫交互方式。
MyBatis的前身是iBATIS,iBATIS于2002年由ClintonBegin創建。MyBatis3是iBATIS的全新設計,支持注解和Mapper(映射器)。
MyBatis流行的主要原因在于它的簡單性和易使用性。在Java應用程序中,數據持久化層涉及到的工作有:將從數據庫查詢到的數據生成所需要的Java對象;將Java對象中的數據通SQL持久化到數據庫中。
MyBatis通過抽象底層的JDBC代碼,自動化SQL結果集產生Java對象、Java對象的數據持久化數據庫中的過程使得對SQL的使用變得容易。

1.2 Git 是一個免費開源的分布式版本控制系統,被用于高速有效地處理大大小小項目中所有文件,在軟件開發中使用的其他版本控制軟件類似與SVN、VSS、CVS等等.

1.3 作為一個分布式的版本控制系統,在Git中并不存在主庫這樣的概念,每一份復制出的庫都可以獨立使用,任何兩個庫之間的不一致之處都可以進行合并。github以托管各種git庫,并提供一個web界面,可以說是一款易于使用的git圖形客戶端。我們熟知的spring、struts、Hibernate等框架的源代碼在github上面都可以找到其源代碼

1.4 iBATIS一詞來源于internet和abatis的組合,是一個在2002年發起的開放源代碼項目。于2010年6月16號被谷歌托管,改名為MyBatis。
ibatis的官網 http://ibatis.apache.org/ 進去官網會看到下面提示:

java priorityqueue、apache ibatis is retired at the apache software foundation
(2010/06/16) the original project team has moved to mybatis hosted
at google code. see http://www.mybatis.org/ for more.

然而http://www.mybatis.org/這個地址一直處于打不開狀態…
但是我們最終是可以在github中找到mybatis的相關下載的:
mybatis在github中的地址

https://github.com/mybatis/mybatis-3

最新版本的mybatis的下載地址

https://github.com/mybatis/mybatis-3/releases

doc文檔

Mybatis框架,http://www.mybatis.org/mybatis-3/

1.5 當前有很多Java實現的持久化框架,而MyBatis流行起來有以下原因:

1.5.1 它消除了大量的JDBC冗余代碼Java通過JDBC的API來操作關系型數據庫,但是JDBC是一個非常底層的API,我們需要書寫大量的代碼來完成對數據庫的操作。例如一個插入操作(參考之前學習JDBC時候的代碼實例)但是使用mybatis來完成相同的插入操作要簡單方便靈活的多:第一步:在SQLMapper映射配置文件中配置SQL語句,假定為StudentMapper.xml<insert id="insertStudent" parameterType="Student">INSERT INTO STUDENTS(ID,NAME,EMAIL)VALUES(#{id},#{name},#{email})</insert>第二步:創建一個StudentMapper接口:public interface StudentMapper{void insertStudent(Student student);}第三步:編寫java代碼完成插入操作://SqlSession是重要的接口。接口的實現類對象可以動態獲取映射接口的對象SqlSession session = getSqlSessionFactory().openSession();//擴展:代理模式/反射技術是框架的基礎。//接口類型StudentMapper的引用mapper指向實現類的對象StudentMapper mapper = session.getMapper(StudentMapper.class);//實現類對象調用方法mapper.insertStudent(student);特別之處的是,MyBatis還提供了其他的一些特性來簡化持久化邏輯的實現它支持復雜的SQL結果集數據映射到嵌套的對象結構它支持一對一和一對多的結果集和Java對象的映射它支持根據輸入的數據構建動態的SQL語句1.5.2 它有低的學習曲線MyBatis能夠流行的首要原因之一在于它學習和使用起來非常簡單,它取決于你Java和 SQL方面的知識。如果開發人員很熟悉Java和SQL,他們會發現MyBatis入門非常簡單。1.5.3 它能很好地與傳統數據庫協同工作有時我們可能需要用不正規形式與傳統數據庫協同工作,使用成熟的ORM框架(例如大家熟知的Hibernate)有可能、但是很難跟傳統數據庫很好地協同工作,因為他們嘗試將Java對象靜態地映射到數據庫的表上.而MyBatis是將查詢的結果與Java對象映射起來,這使得MyBatis可以很好地與傳統數據庫協同工作。你可以根據面向對象的模型創建Java域對象,執行傳統數據庫的查詢,然后將結果映射到對應的Java對象上。1.5.4 它可以接受SQL語句成熟的ORM框架鼓勵使用實體對象和在其底層自動產生SQL語句。由于這種的SQL生成方式,我們有可能不能夠利用到數據庫的一些特有的特性。Hibernate允許執行本地SQL,但是這樣會打破持久層和數據庫獨立的原則。MyBatis框架接受SQL語句,而不是將其對開發人員隱藏起來。由于MyBatis不會產生任何的SQL語句,所以開發人員就要準備SQL語句,這樣就可以充分利用數據庫特有的特性并且可以準備自定義的查詢。另外,MyBatis 對存儲過程也提供了支持。1.5.5 它提供了與Spring框架的集成支持MyBatis提供了與流行的依賴注入框架Spring的開包即用的集成支持,這將進一步簡化MyBatis的使用
1.5.6 它提供了與第三方緩存類庫的集成支持MyBatis有內建的SqlSession級別的緩存機制,用于緩存Select語句查詢出來的結果。除此之外,MyBatis提供了與多種第三方緩存類庫的集成支持,如EHCache,OSCache,Hazelcast等。1.5.7 它引入了更好的性能性能問題是關乎軟件應用成功與否的關鍵因素之一。為了達到更好的性能,需要考慮很多事情,而對很多應用而言,數據持久化層是整個系統性能的關鍵。MyBatis支持數據庫連接池,消除了為每一個請求創建一個數據庫連接的開銷,MyBatis提供了內建的緩存機制,在SqlSession級別提供了對SQL查詢結果的緩存。即:如果你調用了相同的select查詢,MyBatis 會將放在緩存的結果返回,而不會去再查詢數據庫。MyBatis框架并沒有大量地使用代理機制,因此對于其他的過度地使用代理的ORM框架而言,MyBatis可以獲得更好的性能.

1.6 mybatis的jar包
mybatis的核心包只有一個mybatis-3.x.0.jar,另外還有一些【可選】的依賴包(日志、代理等所需要的),在下載的壓縮包中可以找到.

1.7 mybatis框架中一般需要倆種文件:

第一種:mybatis的配置文件: mybatis-config.xml,其中包括數據庫連接信息,類型別名,映射文件路徑等等
特點:
名字一般是固定的
位置是src下面
示例:

<?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><typeAliases><typeAlias alias="Student" type="com.briup.pojo.Student" /></typeAliases><environments default="development"><environment id="development"><transactionManager type="JDBC" /><dataSource type="POOLED"><!--<property name="driver" value="com.mysql.jdbc.Driver" /><property name="url" value="jdbc:mysql://localhost:3306/test" />--><property name="driver" value="oracle.jdbc.driver.OracleDriver" /><property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:XE" /><property name="username" value="test" /><property name="password" value="test" /></dataSource></environment></environments><mappers><mapper resource="com/briup/pojo/StudentMapper.xml" /></mappers></configuration>

第二種:mybatis的映射文件:XxxxMapper.xml,這個xml文件中包括Xxxx類所對應的數據庫表的各種增刪改查sql語句
例如:StudentMapper.xml文件中是Student類對應的表的各種select insert update delete
特點:
名字一般為XxxxMapper.xml,Xxxx是對應類的名字
位置不固定,一般放到一個專門的package里面
實例:

<?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.briup.pojo.StudentMapper"><resultMap type="Student" id="StudentResult"><id property="StudId" column="stud_id" /><result property="name" column="name" /><result property="email" column="email" /></resultMap><select id="findAllStudents" resultMap="StudentResult">SELECT * FROM STUDENTS</select><select id="findStudentById" parameterType="int" resultType="Student">SELECT ID AS STUDID, NAME, EMAILFROM STUDENTS WHERE ID=#{Id}</select><insert id="insertStudent" parameterType="Student">INSERT INTO STUDENTS(ID,NAME,EMAIL)VALUES(#{id },#{name},#{email})</insert></mapper>

javaweb實驗報告總結。1.8 mybatis中的映射接口XxxxMapper.java(對XxxxMapper.xml中的sql語句進行映射)
mybatis中除了必須的jar包、各種xml配置文件之外,一般還需要有調用sql語句執行的接口XxxxMapper.java
示例:

public interface StudentMapper{List<Student> findAllStudents();Student findStudentById(Integer id);void insertStudent(Student student);}

注意:接口中的方法的名字和XML文件定義的SQL映射語句的名稱要相同
同時我們不需要去實現該接口,因為mybatis中提供了相應的方式在運行期間動態生成該接口的實現類對象(動態代理技術,spring框架中會詳細講解動態代理).

1.9 mybatis中的SqlSession接口和sqlSessionFactory接口
SqlSession接口的實現類對象是mybatis中最重要的一個對象,我們可以使用該對象動態獲得XxxxMapper.java接口的實現類對象,然后就可以調用到XxxxMapper.java接口中方法所映射的sql語句(在xml文件中配置的sql語句)。
sqlSessionFactory接口的實現類對象是一個工廠對象,專門負責來產生SqlSession對象的
例如:

	InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession session = sqlSessionFactory.openSession();//第一種執行sql語句的方式  通過XxxxMapper接口的實現類對象來調用//動態獲得XxxxMapper接口的實現類StudentMapper mapper = session.getMapper(StudentMapper.class);mapper.insertStudent(new Student(1,"tom","123@.qq.com"));//第二種執行sql語句的方式  執行調用XxxxMapper.xml中寫好的sql語句//也可以【不通過】Mapper接口執行映射的SQL//然而,使用 Mapper接口是最佳實踐//session.selectOne("com.briup.pojo.StudentMapper.findStudentById",1);

1.10 編寫一個簡單的mybatis進行插入數據的實例

1.10.1 數據庫建表 dob = Date of Birth

drop table students;create table students (stud_id number PRIMARY KEY,name varchar2(50) ,email varchar2(50) ,dob date);

1.10.2 新建一個項目,創建好相應的package及class

package com.briup.pojo;import java.util.Date;public class Student {private Integer studId;private String name;private String email;private Date dob;get/set}

java基礎知識總結 超詳細、1.10.3 項目中引入mybatis的核心包以及可選的依賴包
必須的包 mybatis-3.3.0.jar ojdbc14.jar
可選的包 junit-4.7.jar log4j-1.2.17.jar

1.10.4 mybatis中的配置文件和映射文件分別引入到項目中
src下面的mybatis-config.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><typeAliases><typeAlias type="com.briup.pojo.Student" alias="Student" /></typeAliases><environments default="development"><environment id="development"><transactionManager type="JDBC"></transactionManager><dataSource type="POOLED"><property name="driver" value="oracle.jdbc.driver.OracleDriver" /><property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:XE" /><property name="username" value="test" /><property name="password" value="test" /></dataSource></environment></environments><mappers><mapper resource="com/briup/mappers/StudentMapper.xml"/></mappers></configuration>

com.briup.mappers包下面的StudentMapper.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"><!-- com.briup.mappers.StudentMapper是我們定義接口的全限定名字 這樣就可以使用接口調用映射的SQL語句了 這個名字一定要和接口對應上--><mapper namespace="com.briup.mappers.StudentMapper"><resultMap type="Student" id="StudentResult"><id property="studId" column="stud_id" /><result property="name" column="name" /><result property="email" column="email" /><result property="dob" column="dob" /></resultMap><select id="findAllStudents" resultMap="StudentResult">SELECT * FROM STUDENTS</select><!-- 列名和屬性名字不一致可以給查詢的列起一個別名 --><select id="findStudentById" parameterType="int" resultType="Student">SELECT STUD_ID AS STUDID,NAME,EMAIL,DOBFROM STUDENTSWHERESTUD_ID=#{id}</select><insert id="insertStudent" parameterType="Student">INSERT INTOSTUDENTS(STUD_ID,NAME,EMAIL,DOB)VALUES(#{studId},#{name},#{email},#{dob})</insert></mapper>

1.10.5 配置log4j.properties文件中的日志輸出:
位置src下面
內容:

log4j.rootLogger=DEBUG, stdoutlog4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%d [%-5p] %c - %m%n#show sqllog4j.logger.java.sql.ResultSet=INFOlog4j.logger.org.apache=INFOlog4j.logger.java.sql.Connection=DEBUGlog4j.logger.java.sql.Statement=DEBUGlog4j.logger.java.sql.PreparedStatement=DEBUG

1.10.6 com.briup.mappers包下面新建一個接口StudentMapper.java,用來對應xml文件中的sql語句(映射),從而方便我們調用

package com.briup.mappers;import java.util.List;import com.briup.pojo.Student;//創建映射器Mapper接口StudentMapper//方法名和StudentMapper.xml中定義的SQL映射定義名相同//這個其實就是dao層接口(數據訪問層,負責和數據庫進行交互)public interface StudentMapper {List<Student> findAllStudents();Student findStudentById(Integer id);void insertStudent(Student student);//void updateStudent(Student student);//void deleteStudentById(Integer id);//void insertStudentWithPhone(Student student);//Student findStudentWithPhoneById(Integer id);}

1.10.7 創建一個測試類StudentMapperTest.java

package test;import java.io.InputStream;import java.util.Date;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 org.junit.Test;import com.briup.mappers.StudentMapper;import com.briup.pojo.Student;public class StudentMapperTest {@Testpublic void test_insert(){try {InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);Student s = new Student(1,"tom","123@briup.com",new Date());studentMapper.insertStudent(s);sqlSession.commit();} catch (Exception e) {e.printStackTrace();}}}

javacsdn博客?1.10.8 運行成功后會在控制臺中看到log4j日志輸出的這個程序運行的相關信息
1.10.9 對mybatis的一些基本封裝
每次讀取配置文件,產生一個工廠對象SqlSessionFactory,然后再生成出SqlSession對象,這個過程雖然并不復雜,但是也都是一些重復的代碼流程,所以我們可以對其進行一個簡單的封裝:

	package com.briup.utils;import java.io.IOException;import java.io.InputStream;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;public class MyBatisSqlSessionFactory {private static SqlSessionFactory sqlSessionFactory;public static SqlSessionFactory getSqlSessionFactory(){if(sqlSessionFactory == null){InputStream inputStream = null;try {inputStream = Resources.getResourceAsStream("mybatis-config.xml");sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);} catch (IOException e) {e.printStackTrace();throw new RuntimeException(e.getCause());}}return sqlSessionFactory;}public static SqlSession openSession() {return openSession(false);}public static SqlSession openSession(boolean autoCommit) {return getSqlSessionFactory().openSession(autoCommit);}}

之后每次使用的時候只需要調用該類中的靜態方法openSession即可
上面的代碼可簡寫為: //注意事務是自動提交還是手動提交
MyBatisSqlSessionFactory.openSession().getMapper(StudentMapper.class).insertStudent(s);

     	*******************************************************注意:xml文件中寫的sql語句,最后面不要寫分號,否則會報錯誤,ORA-00911: 無效字符*******************************************************		

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/1/151657.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息