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&serverTimezone=GMT%2B8&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