1. 程式人生 > 實用技巧 >SSM框架學習之MyBatis淺談

SSM框架學習之MyBatis淺談

JDBC流程:

  • 載入驅動
  • 獲取連結
  • 獲取操作物件
  • 操作資料庫
  • 返回結果

JDBCDemo(以MySql為例):

 1       //載入驅動
 2         Class.forName("com.mysql.jdbc.Driver");
 3         String url = "jdbc:mysql://127.0.0.1:3306/mysql";//jdbc:mysql://localhost:3306/+資料庫名稱
 4         String userName = "root";//資料庫賬號
 5         String passWord = "root";//資料庫密碼
 6         //
獲取連結 7 Connection connection = DriverManager.getConnection(url, userName, passWord); 8 //獲取操作物件 9 Statement statement = connection.createStatement(); 10 //操作資料庫 11 String querySql = "SELECT * FROM USER";//查詢語句 12 String addSql = "INSERT INTO USER VALUES ('001','zhangsan','001');";//
增加語句 13 String deleteSql = "DELETE FROM USER WHERE id = '001';";//刪除語句 14 String updateSql = "UPDATE USER SET userName = 'lisi' WHERE id = '001';";//更新語句 15 //返回結果 16 ResultSet resultSet = statement.executeQuery(querySql); 17 int addFlag = statement.executeUpdate(addSql);//
返回操作行數 18 int deleteFlag = statement.executeUpdate(deleteSql);//返回操作行數 19 int updateFlag = statement.executeUpdate(updateSql);//返回操作行數

Mybatis介紹:

百度:

MyBatis 本是apache的一個開源專案iBatis, 2010年這個專案由apache software foundation 遷移到了google code,並且改名為MyBatis 。2013年11月遷移到Github。

MyBatis 是一款優秀的持久層框架,它支援定製化 SQL、儲存過程以及高階對映。MyBatis 避免了幾乎所有的 JDBC 程式碼和手動設定引數以及獲取結果集。MyBatis 可以使用簡單的 XML 或註解來配置和對映原生資訊,將介面和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java物件)對映成資料庫中的記錄。

專案Demo:

資料庫準備:新建庫:mybatis,然後建表:user,插入幾行資料。

CREATE TABLE USER (
userId varchar(100),
userName varchar(100),
phoneNum varchar(100),
passWorld varchar(100)
);
 INSERT INTO USER VALUES ('001','張三','13888888888','123');
 INSERT INTO USER VALUES ('002','李四','13888888888','456');
 INSERT INTO USER VALUES ('003','王五','13888888888','789');

Pom.xml:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 
 3 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 5   <modelVersion>4.0.0</modelVersion>
 6 
 7   <groupId>com.demo.ibatis</groupId>
 8   <artifactId>ibatis</artifactId>
 9   <version>1.0-SNAPSHOT</version>
10   <packaging>war</packaging>
11 
12   <name>ibatis Maven Webapp</name>
13   <!-- FIXME change it to the project's website -->
14   <url>http://www.example.com</url>
15 
16   <properties>
17     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
18     <maven.compiler.source>1.8</maven.compiler.source>
19     <maven.compiler.target>1.8</maven.compiler.target>
20   </properties>
21 
22   <dependencies>
23     <dependency>
24       <groupId>junit</groupId>
25       <artifactId>junit</artifactId>
26       <version>4.11</version>
27       <scope>test</scope>
28     </dependency>
29     <dependency>
30       <groupId>org.springframework</groupId>
31       <artifactId>spring-webmvc</artifactId>
32       <version>5.1.7.RELEASE</version>
33     </dependency>
34     <dependency>
35       <groupId>org.slf4j</groupId>
36       <artifactId>slf4j-log4j12</artifactId>
37       <version>1.7.12</version>
38     </dependency>
39     <dependency>
40       <groupId>jstl</groupId>
41       <artifactId>jstl</artifactId>
42       <version>1.2</version>
43     </dependency>
44     <dependency>
45       <groupId>javax.servlet</groupId>
46       <artifactId>servlet-api</artifactId>
47       <version>2.5</version>
48     </dependency>
49     <!-- MySql -->
50     <dependency>
51       <groupId>mysql</groupId>
52       <artifactId>mysql-connector-java</artifactId>
53       <version>8.0.16</version>
54     </dependency>
55     <dependency>
56       <groupId>org.mybatis</groupId>
57       <artifactId>mybatis</artifactId>
58       <version>3.5.1</version>
59     </dependency>
60   </dependencies>
61 
62   <build>
63     <finalName>ibatis</finalName>
64     <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
65       <plugins>
66         <plugin>
67           <artifactId>maven-clean-plugin</artifactId>
68           <version>3.1.0</version>
69         </plugin>
70         <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
71         <plugin>
72           <artifactId>maven-resources-plugin</artifactId>
73           <version>3.0.2</version>
74         </plugin>
75         <plugin>
76           <artifactId>maven-compiler-plugin</artifactId>
77           <version>3.8.0</version>
78         </plugin>
79         <plugin>
80           <artifactId>maven-surefire-plugin</artifactId>
81           <version>2.22.1</version>
82         </plugin>
83         <plugin>
84           <artifactId>maven-war-plugin</artifactId>
85           <version>3.2.2</version>
86         </plugin>
87         <plugin>
88           <artifactId>maven-install-plugin</artifactId>
89           <version>2.5.2</version>
90         </plugin>
91         <plugin>
92           <artifactId>maven-deploy-plugin</artifactId>
93           <version>2.8.2</version>
94         </plugin>
95       </plugins>
96     </pluginManagement>
97   </build>
98 </project>
Pom.xml檔案

Web.xml:不用動,使用建立專案時預設的即可。

下面四個檔案放在專案的“Resources”目錄下。

jdbc.properties(資料庫資訊):

1 driver=com.mysql.jdbc.Driver
2 url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
3 username=root
4 password=root
JDBC

log4j.properties(日誌資訊):

 1 ### direct log messages to stdout ###
 2 log4j.appender.stdout=org.apache.log4j.ConsoleAppender
 3 log4j.appender.stdout.Target=System.out
 4 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
 5 log4j.appender.stdout.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n
 6 
 7 ### direct messages to file mylog.log ###
 8 log4j.appender.file=org.apache.log4j.FileAppender
 9 log4j.appender.file.File=e:/mylog.log
10 log4j.appender.file.layout=org.apache.log4j.PatternLayout
11 log4j.appender.file.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n
12 
13 ### set log levels - for more verbose logging change 'info' to 'debug' ###
14 
15 log4j.rootLogger=debug, stdout,file
log

mybatis-config.xml(mybatis配置檔案★★★):

 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 <configuration>
 6     <!--獲取JDBC的相關資訊-->
 7     <properties resource="jdbc.properties"></properties>
 8     <!-- 配置環境:可以配置多個環境,default:配置某一個環境的唯一標識,表示預設使用哪個環境 -->
 9     <environments default="development">
10         <!-- 配置環境,id:環境的唯一標識 -->
11         <environment id="development">
12             <!-- 事務管理器,type:使用jdbc的事務管理器 -->
13             <transactionManager type="JDBC"/>
14             <!-- 資料來源,type:資料來源型別,池型別的資料來源 -->
15             <dataSource type="POOLED">
16                 <!-- 配置連線資訊 -->
17                 <property name="driver" value="${driver}" />
18                 <property name="url" value="${url}" />
19                 <property name="username" value="${username}" />
20                 <property name="password" value="${password}" />
21             </dataSource>
22         </environment>
23     </environments>
24     <!-- 配置對映檔案:用來配置sql語句和結果集型別等 -->
25     <mappers>
26         <mapper resource="UserMapper.xml"/>
27     </mappers>
28 </configuration>
Mybaits-config

UserMapper.xml(程式碼操作資料庫的對映檔案):

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE mapper
 3         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 4         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 5 <!--
 6     mapper標籤:配置各類宣告
 7     namespace:名稱空間,由於對映檔案有多個,為了防止crud語句的唯一標識被重複,可以設定空間名稱。
 8  -->
 9 <mapper namespace="com.demo.mapper.UserMapper">
10     <!--
11     select:查詢的statement(宣告),用來編寫查詢語句
12     id:語句的唯一標識
13     resultType:配置返回的結果集型別
14     parameterType:傳遞的引數型別,可以省略
15     -->
16     <select id="queryUserById" resultType="com.demo.bean.User">
17         select * from user where userId = #{id} ;
18     </select>
19     <select id="queryUserList" resultType="com.demo.bean.User">
20         select * from user ;
21     </select>
22     <!--
23           insert:插入的statement,編寫插入語句
24           id:插入語句的唯一標識
25           parameterType:插入語句的引數,可以省略
26        -->
27     <insert id="insertUser" parameterType="com.demo.bean.User">
28     insert into user VALUES (
29     #{userId},
30     #{userName},
31     #{phoneNum},
32     #{passWorld}
33     );
34 </insert>
35     <!-- 
36     update:更新的statement,用來編寫更新語句
37     id:語句的唯一標識
38     parameterType:語句的引數,可以省略
39  -->
40     <update id="updateUser">
41     update user set userName =   #{userName} where userId = #{userId};
42     </update>
43     <!--
44     delete:刪除的statement,用來編寫刪除語句
45     id:語句的唯一標識
46     parameterType:語句的引數,可以省略
47  -->
48     <delete id="deleteUserById">
49         delete from user where userId = #{id};
50     </delete>
51 
52 </mapper>
UserMapper

User:

 1 public class User {
 2     private String userId;
 3     private String userName;
 4     private String phoneNum;
 5     private String passWorld;
 6 
 7     public User() {
 8     }
 9 
10     public User(String userId, String userName, String phoneNum, String passWorld) {
11         this.userId = userId;
12         this.userName = userName;
13         this.phoneNum = phoneNum;
14         this.passWorld = passWorld;
15     }
16 
17     public void setUserId(String userId) {
18         this.userId = userId;
19     }
20 
21     public void setUserName(String userName) {
22         this.userName = userName;
23     }
24 
25     public void setPhoneNum(String phoneNum) {
26         this.phoneNum = phoneNum;
27     }
28 
29     public void setPassWorld(String passWorld) {
30         this.passWorld = passWorld;
31     }
32 
33     public String getUserId() {
34         return userId;
35     }
36 
37     public String getUserName() {
38         return userName;
39     }
40 
41     public String getPhoneNum() {
42         return phoneNum;
43     }
44 
45     public String getPassWorld() {
46         return passWorld;
47     }
48 
49     @Override
50     public String toString() {
51         return "User{" +
52                 "userId='" + userId + '\'' +
53                 ", userName='" + userName + '\'' +
54                 ", phoneNum='" + phoneNum + '\'' +
55                 ", passWorld='" + passWorld + '\'' +
56                 '}';
57     }
58 }
Bean

UserMapper(上面的時配置檔案,這個時程式碼檔案):

 1 public interface UserMapper {
 2     /**
 3      * 通過id查詢user物件
 4      * @param id
 5      * @return
 6      */
 7     User queryUserById(String id);
 8     /**
 9      * 查詢所有使用者
10      * @return
11      */
12     List<User> queryUserList();
13 
14     /**
15      * 插入使用者
16      * @param user
17      */
18     void insertUser(User user);
19 
20     /**
21      * 更新使用者
22      * @param user
23      */
24     void updateUser(User user);
25     /**
26      * 通過id刪除使用者
27      * @param id
28      */
29     void deleteUserById(String id);
30 
31 }
UserMapper

測試:

 1 public class MyController {
 2     public static void main(String[] args) throws IOException {
 3         //獲取全域性配置檔案的輸入流
 4         InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
 5         //載入全域性配置檔案獲取sqlSessionFactory
 6         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
 7         //獲取sqlSession,引數:true,自動開啟事務
 8         SqlSession sqlSession = sqlSessionFactory.openSession(true);
 9         UserMapper mapper = sqlSession.getMapper(UserMapper.class);
10         //單個查詢
11         User user1 = mapper.queryUserById("001");
12         System.out.println(user1);
13         //多個查詢
14         List<User> users = mapper.queryUserList();
15         for (User user2 : users) {
16             System.out.println(user2);
17         }
18         User user3 = new User();
19         user3.setUserId("004");
20         user3.setUserName("趙六");
21         user3.setPhoneNum("13888888888");
22         user3.setPassWorld("000");
23         //增加
24         mapper.insertUser(user3);
25         //修改(把張三改為吳彥祖)
26         User user4 = new User("001","吳彥祖","13888888888","123");
27         mapper.updateUser(user4);
28         //刪除
29         mapper.deleteUserById("002");
30     }
31 }
Controller

結果:

配置檔案:

配置步驟:

1、 配置全域性配置檔案

設定環境(事務、資料來源)

管理對映檔案XxxMapper.xml

2、 配置對映檔案

Mapper標籤:用來配置不同的statement

Namespace屬性:用來配置名稱空間,來區分不同的對映檔案中的statement

編寫crud的statement:select 、update 、insert 、delete

Select:專門用於查詢的statement,可以編寫查詢語句

Id屬性:該statement的唯一標識,一般用來被引用

resultType:結果集型別

paramterType:引數型別,可以省略,一般都省略

使用步驟:

1、獲取全域性配置檔案的資料流,載入全域性配置檔案

2、通過全域性配置檔案的輸入流建立SqlSessionFactory

3、通過SqlSessionFactory獲取SqlSession

4、通過SqlSession操作crud

5、關閉SqlSession,釋放資源。

補充:

#{}:

1、 是預編譯

2、 編譯成佔位符

3、 可以防止sql注入

4、 自動判斷資料型別

5、 一個引數時,可以使用任意引數名稱進行接收

${}:

1、 非預編譯

2、 sql的直接拼接

3、 不能防止sql注入

4、 需要判斷資料型別,如果是字串,需要手動新增引號。

5、 一個引數時,引數名稱必須是value,才能接收引數。

ResultMap:

ResultMap是mybatis中最重要最強大的元素,使用ResultMap可以解決兩大問題:

  • POJO屬性名和表結構欄位名不一致的問題(有些情況下也不是標準的駝峰格式,比如id和userId)
  • 完成高階查詢,比如說,一對一、一對多、多對多。