前言
數據庫從最傳統的JDBC連接方式和數據庫池化技術到Hibernate的使用,再到Mybatis的快捷輕量級操作,技術迭代的速度飛快。
在了解了基礎的理論和方法后,學習前沿編程框架、工具,我認為是一種必然的趨勢。
再不看看外面,可能真的要落伍了~
之後,我借團隊項目開發的機會,學習了Mybatis框架,和大家分享一下經驗,願意和大家共同進步!
正文
從零開始
參考:
1. 下載Mybatis的,並且導入
點擊連接,選擇下載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的配置信息中 ” & ” 符號無法解析,需要變為 “ & “;
映射文件路徑以 “ / ”作為文件夾,從src作為根目錄進行訪問;
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. 編寫表對應的實體類User.java
此處可用IDEA的pojo快捷操作,生成對應實體;
package main.pojo;
public class User {
private String userPhoneNumber;private String userName;private String userPassword;public User(String userPhoneNumber, String userName, String userPassword) {
this.userPhoneNumber = userPhoneNumber;
this.userName = userName;
this.userPassword = userPassword;
}
public String getUserPhoneNumber() {
return userPhoneNumber;
}
public void setUserPhoneNumber(String userPhoneNumber) {
this.userPhoneNumber = userPhoneNumber;
}public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}public String getUserPassword() {
return userPassword;
}
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
@Override
public String toString() {
return "User{" +
"userPhoneNumber='" + userPhoneNumber + '\'' +
", userName='" + userName + '\'' +
", userPassword='" + userPassword + '\'' +
'}';
}
}
5. 編寫實體管理類映射接口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同時存在;
- 傳參方式如代碼所示,用 ${ } 標識參數,和接口一致;
- namespace是全路徑,訪問到當前對應Map的接口文件;
- 注意傳參的數據類型,如果是字符型或者String,需要用單引號包含,如: ‘${userName}’
<?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="main.mapper.UserMapper">
<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實體類等的博客。
如果運行異常,歡迎留言交流,共同進步!
這裏特別感謝博客:
本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能
※評比前十大台北網頁設計、台北網站設計公司知名案例作品心得分享
※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選
※台灣海運大陸貨務運送流程
※兩岸物流進出口一站式服務