1. 程式人生 > >HNU_團隊專案_資料庫框架Mybatis_環境配置和樣例

HNU_團隊專案_資料庫框架Mybatis_環境配置和樣例

前言

資料庫從最傳統的JDBC連線方式和資料庫池化技術到Hibernate的使用,再到Mybatis的快捷輕量級操作,技術迭代的速度飛快。

在瞭解了基礎的理論和方法後,學習前沿程式設計框架、工具,我認為是一種必然的趨勢。

再不看看外面,可能真的要落伍了~

之後,我借團隊專案開發的機會,學習了Mybatis框架,和大家分享一下經驗,願意和大家共同進步!


 

正文

從零開始

參考:Mybatis官方文件 

1. 下載Mybatis的jar包,並且匯入

  點選連線,選擇下載Mybatis的jar包。這裡有三個檔案,基礎使用的話,下載第一個mybatis-3.5.3.zip即可,如果需要檢視原始碼的話,建議將Source code也下載下來,Windows使用zip,Ubuntu使用tar.gz;

  Eclipse匯入只要build puth即可,IDEA的話,在File->Project Structure裡匯入jar;(建議在專案內建一個lib資料夾,便於遷移)

  只是資料庫部分的話,以下兩個包便足夠了。

 

 

2. 新建Java Web Application,編寫資料庫配置檔案

檔名可以自定義,我設定的是Mybatis.xml。但是要放到src的根目錄下,這一點要注意。

注意:url的配置資訊中 ” & " 符號無法解析,需要變為 “ & ";

 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 <!--上面一段是非常重要的,有了這一段,xml的配置就擁有了自動補全,這也是考量Mybatis包是否匯入成功的一個方面;-->
 6 <configuration>
 7 <!--    可以相容多種資料庫,配置多個environment,default為當前配置-->
 8     <environments default="mysql">
 9         <environment id="mysql">
10             <transactionManager type="JDBC"/>
11 <!--            使用資料庫池化技術,詳細可以看官方文件-->
12             <dataSource type="POOLED">
13                 <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
14                 <property name="url" value="jdbc:mysql://localhost:3306/databaseName?useUnicode=true&amp;serverTimezone=GMT%2B8&amp;characterEncoding=utf-8"/>
15                 <property name="username" value=username"/>
16                 <property name="password" value="password"/>
17             </dataSource>
18         </environment>
19     </environments>
20 <!--    對映檔案路徑,需要告訴資料庫,要執行哪些操作,以及資料庫實體類和欄位的對應關係,接下來進行解釋-->
21     <mappers>
22         <mapper resource="main/mapper/UserMapper.xml"/>
23     </mappers>
24 </configuration>

 

3. 編寫執行SQL語句的SqlSessionFactory

  可以編寫工具類或者工廠類,避免程式碼重複。我這裡設定的是DBTools.java

 1 package main.dao;
 2 
 3 import org.apache.ibatis.io.Resources;
 4 import org.apache.ibatis.session.SqlSession;
 5 import org.apache.ibatis.session.SqlSessionFactory;
 6 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
 7 
 8 import javax.annotation.Resource;
 9 import java.io.IOException;
10 import java.io.InputStream;
11 
12 /*
13 Comet_Fei
14 2019/11/17
15 */
16 public class DBTools
17 {
18     private static SqlSessionFactory sqlSessionFactory;
19 
20     static
21     {
22         try
23         {
24             //輸入流讀取檔案 Resources Mybatis的自帶載入類
25             InputStream config = Resources.getResourceAsStream("mybatis.xml");
26             //工廠設計模式
27             sqlSessionFactory = new SqlSessionFactoryBuilder().build(config);
28         }
29         catch (IOException e)
30         {
31             e.printStackTrace();
32         }
33     }
34 
35     //建立可以執行對映檔案sql的sqlsession
36     public static SqlSession getSqlSession()
37     {
38         return sqlSessionFactory.openSession();
39     }
40 }

 

4. 編寫實體類對映介面UserMapper.java

  UserMapper介面和Mybatis的對映xml檔案相對應,便於操作和使用

 

 1 package main.mapper;
 2 
 3 import main.pojo.User;
 4 
 5 import java.util.List;
 6 
 7 /*
 8 Comet_Fei
 9 2019/11/17
10 */
11 public interface UserMapper
12 {
13     int addUser(User user);
14     User getUser(String userPhoneNumber);
15     int deleteUser(String userPhoneNumber);
16     int setPassword(User user);
17     List<User> listUser();
18 
19 }

 

5. 編寫對映檔案UserMapper.xml

  這類檔案非常重要,會將資料庫表和Java程式碼的pojo(bean)進行對映,極大的簡化了操作步驟,減小程式碼量。

引數說明:

resultMap是資料庫表和實體的Map對映設定,在使用時,只要加入 resultMap="userResultMap" 引數即可,如select語句;

parameterType是傳入的引數型別,如果傳入引數較多的話,可以使用實體類傳參;(還沒有學習複雜語句,所以這裡只是簡單介紹)

resultType是返回值型別,但是不能和resultMap同時存在;

傳參方式如程式碼所示,用  ${ } 標識引數,和介面一致;

 

<?xml version="1.0" encoding="UTF-8" ?>
<!--這裡的dtd配置檔案也是讓程式碼可以自動補全-->
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace是包名和類名,一定要設定-->
<mapper namespace="main.mapper.UserMapper">
<!--    對映關係,將表中的column欄位和實體User類的屬性相關聯-->
    <resultMap id="userResultMap" type="main.pojo.User">
        <result property="userPhoneNumber" column="user_phone_number"/>
        <result property="headPictureId" column="head_pictureId"/>
        <result property="rolePowerId" column="role_power_id"/>
        <result property="userName" column="user_name"/>
        <result property="userPersonalAutograph" column="user_personal_autograph"/>
        <result property="userPassword" column="user_password"/>
        <result property="userSex" column="user_sex"/>
        <result property="userEmail" column="user_email"/>
        <result property="userAddress" column="user_address"/>
        <result property="userUploadNumbers" column="user_upload_numbers"/>
    </resultMap>

<!--    新增使用者-->
    <insert id="addUser" parameterType="main.pojo.User" >
        INSERT INTO user(user_phone_number, user_name, user_password)
        VALUES (${userPhoneNumber}, ${userName}, ${userPassword});
    </insert>
<!--    刪除使用者-->
    <delete id="deleteUser" parameterType="String">
        DELETE FROM user WHERE user_phone_number = ${userPhoneNumber};
    </delete>

    <!--    獲得賬號為user_phone_number的使用者-->
    <select id="getUser" resultMap="userResultMap">
        SELECT * FROM user WHERE user_phone_number = ${userPhoneNumber};
    </select>

<!--    獲得使用者列表-->
    <select id="listUser" resultType="main.pojo.User">
        SELECT * FROM user;
    </select>

<!--    重設密碼-->
    <update id="setPassword" parameterType="main.pojo.User">
        UPDATE user SET user_password = ${userPassword} WHERE user_phone_number = ${userPhoneNumber};
    </update>

</mapper>

 

6. 最後是操作層(DAO)UserDao.java

  因為操作層有特定的業務,這裡只是一個示意而已。java裡面的main函式可以進行區域性測試,便於和前端、控制器(servlet)等對接。

 1 package main.dao;
 2 
 3 import main.mapper.UserMapper;
 4 import main.pojo.User;
 5 import org.apache.ibatis.session.SqlSession;
 6 
 7 import java.io.IOException;
 8 
 9 /*
10 Comet_Fei
11 2019/11/17
12 */
13 public class UserDao {
14 //    定義dao內的sqlSession和對映介面mapper
15     private SqlSession sqlSession;
16     private UserMapper mapper;
17 
18     public UserDao()
19     {
20 //        通過工廠,初始化session;通過特有getMapper設定對映介面
21         sqlSession = DBTools.getSqlSession();
22         mapper = sqlSession.getMapper(UserMapper.class);
23     }
24 
25     //新增使用者 成功1 失敗0
26     public int addUser(String userPhoneNumber, String userPassword) throws IOException
27     {
28         //使用者的 手機號,姓名(預設手機號),密碼
29         User user = new User(userPhoneNumber,userPhoneNumber, userPassword);
30         int result = mapper.addUser(user);
31         sqlSession.commit();
32         System.out.println(result);
33         return result;
34     }
35 
36     //使用者登入 簡訊 成功2;失敗0
37     public int right(String userPhoneNumber)
38     {
39         int result;
40         User user = mapper.getUser(userPhoneNumber);
41         if(user != null)
42         {
43             result = 2;//登入成功
44         }
45         else
46         {
47             result = 0;//登入失敗
48         }
49         sqlSession.commit();
50         return result;
51     }
52 
53     //使用者登入 手機 密碼 成功2;密碼錯誤1;手機號錯誤0
54     public int right(String userPhoneNumber, String userPassword)
55     {
56         int result;
57         User user = mapper.getUser(userPhoneNumber);
58         if((user != null)&&(userPassword.equals(user.getUserPassword())))
59         {
60             result = 2;//登入成功
61         }
62         else if(user != null)
63         {
64             result = 1;//密碼錯誤
65         }
66         else
67         {
68             result = 0;//此手機號未註冊
69         }
70         sqlSession.commit();
71         return result;
72     }
73 
74     //刪除使用者 成功是1,不成功是0
75     public int deleteUser(String userPhoneNumber)
76     {
77         int result = mapper.deleteUser(userPhoneNumber);
78         sqlSession.commit();
79         return result;
80     }
81 
82     //重設密碼
83     public int setPassword(String userPhoneNumber, String userPassword)
84     {
85         User user = new User(userPhoneNumber, userPhoneNumber, userPassword);
86         return mapper.setPassword(user);
87     }
88     public static void main(String[] args) throws IOException {
89         UserDao dao = new UserDao();
90 //        System.out.println(dao.deleteUser("111")); //刪除使用者
91 //        dao.addUser("111","111");// 新增使用者
92 //        System.out.println(dao.right("11"));//簡訊登入;
93 //        System.out.println(dao.right("111","111"));//簡訊登入;
94         System.out.println(dao.setPassword("111","111"));
95     }
96 }

 

以上為全部內容,之後還會寫一些關於IDEA操作上的快捷鍵,如,IDEA如何連線資料庫、快速生成pojo實體類等的部落格。

這裡特別感謝部落格:IDEA專案搭建四——使用Mybatis實現Dao層 

 

&n