(一)Mybatis基本配置,Statement方式,動態代理增刪改查

首先明白Mybatis是幹什麼的,以前使用jdbc操做數據庫時候要寫不少語句,獲取光標,鏈接,獲取具體對象進行相應操做,代碼過於繁瑣,因此如今有了Mybatis,它將這個操做整合在了一塊兒,你不須要關心具體的和數據庫的之間交互,你如今只須要關心你的業務邏輯,書寫好你的sql語句,並進行相應的配置就能夠了,這樣大大提升了開發效率,簡化了沒必要要的代碼。ps:說實話我以爲jdbc操做真的繁瑣,要注意的太多了,這種方式操做數據庫方便多了,畢竟咱們重要的是業務邏輯代碼。html

這篇博客記錄了基本的配置,statement方式,動態代理方式的增刪改查java

Mybatis基本配置

1.首先咱們先從官網將壓縮包下載下來,而後將目錄下的  .jar文件引入項目文件之中,在Intellij之下,引入jar文件,具體怎麼引入問度娘,注意這裏暫時只須要引入一個.jar 文件,lib目錄下的jar文件至關因而擴展功能,你須要的時候再引入。而後用一樣的方式將jdbc引入一下,由於Mybatis是依賴於jdbc的,是jdbc的一種封裝能夠理解爲。mysql

2.好的接下來咱們建立 config.xml文件,用於配置數據庫的鏈接,以下sql

<?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="development"> <!--默認的配置環境,發行版本,debug版本--> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <!--建立鏈接池,效率高,一次打開,屢次使用--> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;characterEncoding=utf-8&amp;serverTimezone=GMT"/> <property name="username" value="xxx"/> <property name="password" value="xxxx"/> </dataSource> </environment> </environments> <mappers> <!-- 加載映射文件,有多個,直接寫相對於src文件的路徑--> <mapper resource="entity/PersonMapping.xml"/> </mappers> </configuration>

看它這個xml文件,仍是比較容易理解的,注意兩點,數據庫

1.我這裏使用的是mysql 8.0.2版本,配置和mysql低版本不太同樣,url後面的參數是以  &amp; 來分隔的。雖然也不知道爲撒這樣,反正人家這麼規定的。數組

2.最下面<mappers>加載映射文件的時候,一個<mapper resource-"xxx"/>加載一個,resource屬性就是具體的映射文件相對於src文件的路徑。session

接下來咱們建立Person類,和數據庫的一張表造成映射:以下mybatis

package entity; public class Person {
   private int id;
private String name; private String loves; public Person(){ }
  
public Person(String name, String loves) { this.name = name; this.loves = loves; }
  public int getId(){return id;}
  public void setId(int id){this.id=id;}
public String getName() { return name; } public void setName(String name) { this.name = name; } public String getLoves() { return loves; } public void setLoves(String loves) { this.loves = loves; } public String toString(){ return "姓名:"+this.name+"\n愛好:"+this.loves; } }

表person以下:app

 create table person( `id` int(11) not null auto_increment primary key, `name` varchar(30) not null, loves varchar(40) not null )engine=innodb;

 

而後看映射文件 PersonMapping.xml的配置,這個映射文件和Person類時對應的,配置的是關於表person和類Person的相關操做ide

<?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="entity.PersonMapping">       <!--該mapping文件的惟一映射--> <select id="selectPersonById" resultType="entity.Person" parameterType="string"> select * from person where `name` = #{name} </select> <insert id="insertOnePerson" parameterType="entity.Person"> insert into person values(#{name},#{loves}) </insert> <delete id="deleteOnePerson" parameterType="int" > delete from person where id=#{id} </delete> </mapper>

能夠看到首先namespace是該文件一個惟一標識,就是該文件的路徑(相對於src),接下來有各類標籤,<select>  <delete>  <insert> ..這其實就對應了數據庫的增刪改查,具體對哪一張表,什麼操做,看你書寫的sql語句,由於咱們看到標籤體的內容就是sql語句,舉個例子:

 <insert id="insertOnePerson" parameterType="entity.Person" resultType=""> insert into person values(#{name},#{loves}) </insert>

這個標籤是向數據庫插入數據,id表明的是該sql語句的惟一標識,parameterType  指的是傳入的參數類型,這裏是entity.Person,Person使咱們構造的一個類,resultType是返回值的類型,

標籤體是咱們書寫的sql語句,這裏是動態傳值的方式,輸出格式是:#{變量名},對於變量名咱們注意:若是傳入的是一個string,int等類型的數據,那這個變量名能夠是任何字符,可是若是傳入的是一個對象的話,那麼變量名就必須和該對象的屬性一一對應起來,好比  name  就指 person對象的name屬性,loves指person的loves屬性。另外注意Mybatis傳參只能傳一個值,可是有時候要傳多個參數,可使用數組的方式傳值。

一樣的,增刪改查操做都是在相應的標籤下書寫sql語句來完成的。

statement的增刪改查

到這裏咱們的基本配置demo就算是完成了,接下來寫一個具體的操做例子,首先分爲三步:

1.加載配置信息,2.獲取SqlSession對象進行操做  3.執行指定的sql語句

 public static void main(String[] args) throws IOException { //加載配置信息 Reader reader = Resources.getResourceAsReader("config.xml"); //connection SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader); SqlSession sqlSession = sessionFactory.openSession(); //執行指定的sql語句 String statement = "entity.PersonMapping.selectPersonById"; //查詢數據 List<Person> persons = new ArrayList<Person>(sqlSession.selectList(statement,"溫鴻飛")); for (Person person:persons) { System.out.println(person.toString()); } statement = "entity.PersonMapping.deleteOnePerson"; //刪除數據 sqlSession.delete(statement,1); System.out.println("------"); statement = "entity.PersonMapping.selectPersonById"; //查詢數據 persons = new ArrayList<Person>(sqlSession.selectList(statement,"溫鴻飛")); for (Person person:persons) { System.out.println(person.toString()); } sqlSession.commit(); sqlSession.close(); }

配置信息加載是經過Reader reader = Resources.getResourceAsReader("config.xml"); 完成,config就是咱們剛纔建立的配置文件,告訴編譯器都有哪些mapper,

獲取SqlSession對象,這個不說了,官網就是這麼寫的,規定

而後到了具體的操做了,看到咱們先書寫了一個 statement,這個statement對應了剛纔的PersonMapping.xml文件當中的一個標籤,格式是:namespace.id,好比

entity.PersonMapping.deleteOnePerson指的就是deleteOnePerson的標籤,以後用SqlSession來操做,調用增刪改查裏面的一個方式,傳入statement和相應的參數就能夠了,好比刪除
SqlSession.delete(statement,param); 以後有返回值的接受一下, 沒有就算了。sqlSession.commit()提交一下事務,固然這裏還有回滾等暫時不說了
上面的代碼執行結果以下,能夠看到正確的查詢到了數據並刪除了id爲1 的數據
"C:\Program Files\Java\jdk-11.0.1\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2019.1.3\lib\idea_rt.jar=63824:C:\Program Files\JetBrains\IntelliJ IDEA 2019.1.3\bin" -Dfile.encoding=UTF-8 -classpath C:\learn\java\mybatis\out\production\mybatis;C:\迅雷下載\mybatis-3.5.2\mybatis-3.5.2\mybatis-3.5.2.jar;C:\迅雷下載\mysql-connector-java-8.0.16.jar entity.test
姓名:溫鴻飛 愛好:哈啊哈哈
姓名:溫鴻飛 愛好:21212121 姓名:溫鴻飛 愛好:2121266 ------ 姓名:溫鴻飛 愛好:21212121 姓名:溫鴻飛 愛好:2121266

到這裏咱們的第一個statement小demo就算成功完成了,但使用statement的話,每次都要書寫statement,很繁瑣,因此咱們有了動態的進行增刪改查的方式,其實就是將statemtn語句進行約定,名字什麼都是有固定規則的,簡化代碼,省略掉statement,簡單來說,讓約定優於配置,根據約定定位sql語句

具體的話,看下面:

定義一個接口,經過這個接口來替代statement,該接口有以下規則;

1.接口名和映射.xml文件的文件名相同

2.接口之中的抽象方法的方法名,返回值,參數和映射.xml之中配置的均相同,

3.注意一下若是要返回一個數組的話,使用  List<className> 做爲返回類型

定義好了以後經過SqlSession.getMapper(接口名字.class);來獲取到操做數據庫的對象,以後調用該接口的方法就能夠了,具體代碼以下:

PersonMapping接口

package mappers; import entity.Person; import java.util.List; //操做person類的接口
public interface PersonMapping {    //接口名也同樣
    public abstract Person selectPersonById(int id);  //方法名,返回值,參數均和配置同樣
    void deletePersonById(int id); void insertOnePerson(Person person); public abstract List<Person> selectPersonByName(String name); }

main函數之中:

public class test { public static void main(String[] args) throws IOException { //加載配置信息
       。。。獲取到SqlSession對象,和前面同樣//獲取到mapper對象
        PersonMapping personMapping = sqlSession.getMapper(PersonMapping.class); //調用接口方法操做數據庫
        Person person = personMapping.selectPersonById(2); System.out.println(person); List<Person> persons = personMapping.selectPersonByName("溫鴻飛"); for (Person temp:persons) { System.out.println(temp); } sqlSession.commit(); sqlSession.close(); } }

感受這和symfony裏面的Respository同樣呀,不過你這個還要本身配置,Symfonyh都本身配置好了,你直接實例化對象就好了,symfony很強呀

 

原文出處:https://www.cnblogs.com/eenio/p/11314611.html

相關文章
相關標籤/搜索