2021年8月2日 星期一

建立一個最基本的 mybatis

在 maven 專案下建立 mybatis,並完成對資料庫的新增/查詢/修改/刪除動作

環境

    Intellij IDEA 2021.1。

    已建立好的 springboot 專案。

    Oracle 12c (cdb/pdb模式) 資料庫,建好一張叫 Person 的表,其 schema 如下。


    CREATE TABLE PERSON (

        NAME VARCHAR2(100) NOT null,

        EMAIL VARCHAR2(100),

        AGE INTEGER,

        CONSTRAINT "PERSON_PK" PRIMARY KEY ("NAME")

    );


提示

對 oracle 的連接字串,在版本 12c 前/後似乎不同,之前的似乎是,jdbc:oracle:thin:@192.168.1.113:1521:ORCLPDB1 

之後的是 jdbc:oracle:thin:@192.168.1.113:1521/ORCLPDB1,sid (ORCLPDB1) 前面的是:或是/。這可能是因為 12c 之

後多了 cdb/pdb 的關係,所以即使在 12c 之後如果資料庫是設定非 cdb/pdb 這種格式的話,可能 sid 前也是要用「:」。

如果在 12c 「cdb/pdb模式」下,接連字串是用「:」而不是「/」會報一個 ORA-12505, 

TNS:listener does not currently know of SID given in connect descriptor 的錯誤

推論而己,oracle 還不太熟。

本文


1.目錄結構如下

        App.java:入口的 main 方法和測試的程式碼

        UserDao.java:一個 interface,裡面定義的 method 會和 userMapper.xml 裡所定義的 select/insert/update/delete 的標籤上的 id 屬性對應

        Person.java:與資料表內欄位對應的物件

        mybatis-config.xml:與 oracle 連線用的連接字串、及 mybatis 相關的設定值

        userMapper.xml:定義 sql 指令,與 UserDao.java (interface) 內定義的 method 對應


2.上 MVNRepository (https://mvnrepository.com/) 取得 mybatis 和 oracle jdbc 的 dependency,並複製到 pom.xml 下

pom.xml
  1. <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
  2. <dependency>
  3. <groupId>org.mybatis</groupId>
  4. <artifactId>mybatis</artifactId>
  5. <version>3.5.7</version>
  6. </dependency>
  7. <!-- https://mvnrepository.com/artifact/com.oracle.database.jdbc/ojdbc8 -->
  8. <dependency>
  9. <groupId>com.oracle.database.jdbc</groupId>
  10. <artifactId>ojdbc8</artifactId>
  11. <version>21.1.0.0</version>
  12. </dependency>


3. 建立 mybatis-config.xml,設定 jdbc 對 oracle 的連線和建立的 mapper 文件

mybatis-config.xml
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <!-- 根標籤 -->
  6. <configuration>
  7. <!-- 環境,可以配置多個,default:指定採用哪個環境 -->
  8. <environments default="test">
  9. <!-- id:唯一標識 -->
  10. <environment id="test">
  11. <!-- 事務管理器,使用JDBC型別的事務管理器 -->
  12. <transactionManager type="JDBC" />
  13. <!-- 使用連接池方式來獲取連接 -->
  14. <dataSource type="POOLED">
  15. <property name="driver" value="oracle.jdbc.driver.OracleDriver" />
  16. <property name="url" value="jdbc:oracle:thin:@192.168.1.113:1521/ORCLPDB1" />
  17. <property name="username" value="yu" />
  18. <property name="password" value="qwe" />
  19. </dataSource>
  20. </environment>
  21. </environments>
  22. <!--加載 map 文件-->
  23. <mappers>
  24. <mapper resource="userMapper.xml" />
  25. </mappers>
  26. </configuration>


4. 建立 Person.java,對應 oracle 中,資料表 person 的欄位

Person.java
  1. package model;
  2. public class Person {
  3. private int id;
  4. private String name;
  5. private String email;
  6. private int age;
  7. public int getId(){
  8. return this.id;
  9. }
  10. public void setId(int id){
  11. this.id = id;
  12. }
  13. public String getName(){
  14. return this.name;
  15. }
  16. public void setName(String name){ this.name = name; }
  17. public String getEmail(){
  18. return this.email;
  19. }
  20. public void setEmail(String email){
  21. this.email = email;
  22. }
  23. public int getAge(){
  24. return this.age;
  25. }
  26. public void setAge(int age){
  27. this.age = age;
  28. }
  29. }


5. 建立 userMapper.xml 與 userDAO,建立一個供叫用的 interface,和實際定義了該執行那些 sql 指令的 xml (mapper) 檔案


UserDao.java
  1. package mappers;
  2. import model.Person;
  3. public interface UserDao {
  4. Person getPersonById(Integer id);
  5. void AddPerson(Person person);
  6. int updatePerson(Person person);
  7. int deletePerson(Person person);
  8. }
  9.  

userMapper.xml
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  4. <mapper namespace="mappers.UserDao">
  5. <!--當 db 與程式裡定義的 model 不一致時,可以透過 resultmap 重新對應映射,column:db欄名、property:class欄名-->
  6. <resultMap id="resultListUser" type="model.Person">
  7. <id column="id" property="id" />
  8. <result column="namexx" property="name"/>
  9. <result column="email" property="email"/>
  10. <result column="age" property="age"/>
  11. </resultMap>
  12. <!--resultmap 是指傳回的物件型態,與 resultMap 標籤互相定義-->
  13. <!--parameterType 執行這段 sql 時傳入的物件型態-->
  14. <!--id 會對應至 interface (UserDao.java) 中定義的 method 名稱-->
  15. <select id="getPersonById" parameterType="Integer" resultMap="resultListUser">
  16. select id, name as namexx, email, age from person where id = #{id}
  17. </select>
  18. <insert id="AddPerson" parameterType="model.Person">
  19. insert into person(Id, name, email, age) values (#{id}, #{name}, #{email}, #{age})
  20. </insert>
  21. <update id="updatePerson" parameterType="model.Person">
  22. update person set email = #{email} where id=#{id}
  23. </update>
  24. <delete id="deletePerson" parameterType="model.Person">
  25. delete from person where id=#{id}
  26. </delete>
  27. </mapper>
6. 建立測試用的程式碼

App.java
  1. package basic;
  2. import mappers.UserDao;
  3. import model.Person;
  4. import org.apache.ibatis.session.SqlSession;
  5. import org.apache.ibatis.session.SqlSessionFactory;
  6. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  7. import java.io.InputStream;
  8. public class App {
  9. public static void main(String[] args) throws Exception {
  10. // 讀取 mybatis-config.xml 設定檔
  11. String location = "mybatis-config.xml";
  12. InputStream stream = App.class.getClassLoader().getResourceAsStream(location);
  13. // 依讀入的 mybatis-config.xml 設定檔,生成 SqlSessionFactory
  14. SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(stream);
  15. // 生成 SqlSession (完全包含以db為背景的所有執行SQL的方法,底層封裝了 jdbc 連接,可以執行被映射的 SQL 語句(從 UserDao 映射到 userMapper.xml 中定義的 sql)
  16. // 不是線程安全的,使用完務必要關閉。
  17. SqlSession session = sessionFactory.openSession();
  18. UserDao userDao = session.getMapper(UserDao.class);
  19. // 新增資料
  20. Person newPerson = new Person();
  21. newPerson.setId(5);
  22. newPerson.setName("David");
  23. newPerson.setEmail("David@gmail.com");
  24. newPerson.setAge(16);
  25. userDao.AddPerson(newPerson);
  26. session.commit();
  27. // 查詢單筆
  28. Person person = userDao.getPersonById(5);
  29. System.out.println(person.getName() + " " + person.getEmail() + " " + person.getAge());
  30. // 更正資料
  31. person.setId(5);
  32. person.setEmail("DDD@gmail.com");
  33. userDao.updatePerson(person);
  34. session.commit();
  35. //刪除資料
  36. userDao.deletePerson(person);
  37. session.commit();
  38. }
  39. }
  40.  

沒有留言:

張貼留言