(二)mybatis學習之入門增刪改查


准備工作

首先從github里【https://github.com/mybatis/mybatis-3】里下載mybatis,里面有個pdf說明文檔,文檔詳細介紹了mybatis所涉及到的所有內容。開發的過程中,我們需要參考這個文檔。

在eclipse里新創建一個maven項目,並添加響應的依賴包

(1)servlet的依賴包 (2)mybatis的依賴包 (3)mysql數據庫依賴包 (4)log4j日志依賴包(slf4j和log4j) (5)junit單元測試依賴包
pom.xml配置文件內容如下:
<dependencies>

<!-- 添加servlet的依賴包 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>

<!-- 添加mybatis的依賴包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.3.1</version>
</dependency>

<!-- 加入mysql數據庫依賴包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>

<!-- 添加log4j依賴包(slf4j和log4j) -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.20</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>

<!-- junit單元測試包 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>

</dependencies>



添加日志配置文件log4j.properties,內容如下:
log4j.rootLogger=DEBUG,Console  

#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n

log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG


mybatis入門增刪改查

對於mybatis開發內容來說,其實就是一個全局配置文件和N個mapper.xml映射文件以及sql查詢結果所需要映射的的pojo實體類。接下來以用戶信息的增刪改查功能來進行配置開發。

全局配置文件sqlMapConfig.xml

創建一個mybatis的全局配置文件sqlMapConfig.xml【內容可從mybatis的pdf說明文檔里copy過來】sqlMapConfig.xml內容如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

<!-- environments指的是mybatis運行環境,目前單獨使用mybatis做測試時,需要在該環境中配置數據源。
當mybatis與spring整合后,這一塊內容則被廢棄了。因為數據源等環境都交由了spring來管理
-->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事務管理,事務控制由mybatis管理 -->
<transactionManager type="JDBC"/>
<!-- 數據庫連接池,由mybatis管理 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatisdb?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull"/>
<property name="username" value="root"/>
<property name="password" value="888"/>
</dataSource>
</environment>
</environments>

</configuration>

根據id查詢用戶信息

映射文件(user.xml)

     需要在映射文件中配置sql語句
<?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">
<!-- namespace命名空間,作用是對sql語句進行分類管理
附加說明:如果以后用到mapper代理開發,則這里的namespace內容必須與代理類的全路徑一致
如果其他配置文件(namespace=yyy)也有一個id值叫findUserById,那么這個時候,就要使用命名空間來區別
java外部要使用某個findUserById查詢時,就要用xxx.findUserById 或 yyy.findUserById 來獲取對應的sql配置
-->
<mapper namespace="xxxx">

<!-- 通過select來執行數據庫的查詢
id:用於標識映射文件中的sql語句
#{}:表示占位符
#{id}:其中的id表示接收輸入的參數,如果輸入參數是簡單類型,#{}中的參數名稱可以任意
parameterType:指定輸入參數類型,目前這里是字符串類型
parameterMap:早期版本,目前已廢棄不用
resultType:指定sql查詢輸出結果所映射的java對象類型,這里是返回一個user對象
-->
<select id="findUserById" parameterType="java.lang.String" resultType="pojo.User">
select * from tab_user where id=#{id}
</select>

</mapper>

pojo類(User.java)

public class User {

private String id;
private String userName;//用戶名
private String nickName;//昵稱
private String password;//登錄密碼
private Integer sex;//性別
private Date birthday;//出生日期
private String province;//省
private String city;//市
private String county;//縣
private Date createTime;//創建時間

/** get、set 方法*/

在sqlMapConfig.xml中配置加載user.xml文件

<!-- 加載映射文件 -->
<mappers>
<mapper resource="sqlMap/user.xml"/>
</mappers>

項目結構



測試



根據昵稱模糊查詢用戶信息

配置文件

使用user.xml配置文件,在配置文件里添加如下配置代碼:
<!-- 根據昵稱模糊查詢用戶信息 
resultType:指定的是單條記錄所映射的java對象類型,雖然這里查詢出來的結果集是list
但是仍然設置resultType為對象類型
如果這里使用#{value}占位符來接收輸入參數,那么java代碼里就得程序員自己加上%傳進來,
如:List<User> userList = sqlSession.selectList("xxxx.findUserByName", "%卡%");
平時一般都不會使用這種方式來進行傳值,我們應該把%放到配置文件中,此時需要用到${}
${}:表示拼接sql串,將接收到的參數內容不加任何修飾拼接到sql語句中
使用${}拼接sql,可能會引起sql注入。
${value}:接收傳入參數的內容,如果傳入參數是簡單類型,${}里面只能為value
-->
<select id="findUserByName" parameterType="java.lang.String" resultType="pojo.User">
select * from tab_user where nickName like '%${value}%'
</select>

代碼測試




添加用戶信息

配置文件

在user.xml中添加新增用戶的sql配置

自增主鍵的返回

<!-- 新增用戶 
parameterType:指定輸入參數類型是pojo
#{}中指定pojo的屬性名,接收到pojo對象的屬性值,mybatis通過OGNL獲取對象的屬性值
實際情況中,插入新記錄后可能需要用到主鍵id,此時需要使用到selectKey來配置主鍵返回
(1)自增主鍵返回:mysql自增主鍵,是執行insert提交之前主動生成一個自增主鍵,可以通過
mysql函數獲取到剛剛插入的主鍵id
-->
<insert id="addUser" parameterType="pojo.User">

<!-- 將插入數據的主鍵返回,返回到user對象中
select LAST_INSERT_ID();獲取到insert進去的記錄主鍵值,只適用於自增主鍵
keyProperty:將查詢到的主鍵值設置到parameterType指定的對象的某個屬性
order:select LAST_INSERT_ID()的執行順序,BEFORE表示在insert語句之前執行,AFTER則反之
-->
<selectKey keyProperty="id" order="AFTER" resultType="int">
select LAST_INSERT_ID()
</selectKey>
insert into tab_user (userName,nickName,`password`,sex)
values (#{userName},#{nickName},#{password},#{sex})
</insert>

非自增主鍵返回

<!-- 新增用戶 
parameterType:指定輸入參數類型是pojo
#{}中指定pojo的屬性名,接收到pojo對象的屬性值,mybatis通過OGNL獲取對象的屬性值
實際情況中,插入新記錄后可能需要用到主鍵id,此時需要使用到selectKey來配置主鍵返回
(1)自增主鍵返回:mysql自增主鍵,是執行insert提交之前主動生成一個自增主鍵,可以通過
mysql函數獲取到剛剛插入的主鍵id
-->
<insert id="addUser" parameterType="pojo.User">

<!-- 將插入數據的主鍵返回,返回到user對象中
使用mysql的UUID()方法獲取主鍵值
keyProperty:將查詢到的主鍵值設置到parameterType指定的對象的某個屬性
order:select UUID()的執行順序,BEFORE表示在insert語句之前執行,AFTER則反之
-->
<selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
<!-- 這里可以根據項目需求設置主鍵的生成規則 -->
select UUID()
</selectKey>
insert into tab_user (id,userName,nickName,`password`,sex)
values (#{id},#{userName},#{nickName},#{password},#{sex})
</insert>

代碼測試

當前數據庫表的id是uuid生成的,故這里只對非自增主鍵的例子進行測試


更新用戶信息和刪除用戶信息

配置文件

<!-- 更新用戶信息 -->
<update id="updateUser" parameterType="pojo.User" >
update tab_user set userName=#{userName},`password`=#{password} where id=#{id}
</update>

<!-- 根據id刪除用戶信息 -->
<delete id="deleteUserById" parameterType="java.lang.Integer">
delete tab_user where id=#{id}
</delete>

代碼測試

更新用戶代碼測試


根據id刪除用戶代碼測試





注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com