Mybatis框架簡單介紹
mybatis 是一個優秀的基於 java 的持久層框架,它內部封裝了 jdbc,使開發者只需要關注 sql 語句本身而不需要花費精力去處理加載驅動、創建連接、創建 statement 等繁雜的過程。 mybatis 通過 xml 或註解的方式將要執行的各 statement 配置起來,並通過 java 對象和 statement 中 sql 的動態參數進行映射生成最終執行的 sq 語句,最後由 mybatis 框架執行 sql 並將結果映射爲 java 對象並 返回。 採用 ORM 思想解決了實體和數據庫映射的問題,dbc 進行了封裝,屏蔽了 jdbc api 底層訪問細節,使我 們不用與 jdbc api 打交道,就可以完成對數據庫的持久化操作。
這裏附上源碼(可以下載參考使用): https://download.csdn.net/download/qq_43230007/12173926
Mybatis框架實現簡單的CRUD操作實現步驟
步驟一:前期資源準備
- 創建maven工程,同時創建數據庫表
DROP DATABASE IF EXISTS demo;
CREATE DATABASE IF NOT EXISTS demo;
USE demo;
DROP TABLE IF EXISTS `user`;
SELECT DATABASE();
CREATE TABLE `user` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`username` VARCHAR(32) NOT NULL COMMENT '用戶名稱',
`birthday` DATETIME DEFAULT NULL COMMENT '生日',
`sex` CHAR(1) DEFAULT NULL COMMENT '性別',
`address` VARCHAR(256) DEFAULT NULL COMMENT '地址',
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
INSERT INTO `user`(`id`,`username`,`birthday`,`sex`,`address`) VALUES (41,'老王','2018-02-27 17:47:08','男','北京'),(42,'小二王','2018-03-02 15:09:37','女','寧波'),(43,'小二王','2018-03-04 11:34:34','女','杭州'),(45,'張三','2018-03-04 12:04:06','男','天津'),(46,'老王','2018-03-07 17:37:26','男','北京'),(48,'馬七','2018-03-08 11:44:00','女','河南');
SELECT * FROM USER;
- 配置pom.xml,導入相關依賴座標
<dependencies>
<!--Mybatis包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!--日誌包-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<!--測試類包-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--JDBC驅動包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
</dependencies>
-
完善目錄結構
-
創建Dao層接口
package com.demo.dao;
import com.demo.domain.User;
import java.util.List;
/**
* CRUD 這個是一個數據庫最基礎的操作
* 增刪改
* 查詢
* 模糊查詢
* 聚合函數查詢
* @author Ye
*/
public interface UserDao {
/**
* 爲什麼我下面的參數選擇user,因爲這樣就方便選擇user
* 屬性中的任意屬性進行數據庫表的操作
* @param user
*/
void updateUser(User user);
/**
* 插入操作
* @param user
*/
void insertUser(User user);
/**
* 刪除操作
* @param user
*/
void deleteUser(User user);
/**
* 查詢所有
* @return
*/
List<User> findAll();
/**
* 通過名稱查找
* @param user
* @return
*/
List<User> findUserByName(User user);
/**
* 通過關鍵字查找
* @param user
* @return
*/
List<User> findByKeyWord(User user);
/**
* 查詢總數
* @param user
* @return
*/
Integer findTotalCount(User user);
}
- 創建數據模型User對應數據庫的User表
package com.demo.domain;
import java.util.Date;
/**
* 定義的User類,對應了數據庫中的User表
*/
public class User {
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", birthday=" + birthday +
", sex='" + sex + '\'' +
", address='" + address + '\'' +
'}';
}
}
- 配置文件的準備
步驟二
- 測試類準備
package com.demo.test;
import com.demo.dao.UserDao;
import com.demo.domain.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class UserTest {
private InputStream in;
private SqlSession sqlSession;
private UserDao userDao;
/**
* 初始化資源
* @throws IOException
*/
@Before
public void init() throws IOException {
//1.讀取配置文件,生成字節輸入流
in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.獲取SqlSessionFactory
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//3.獲取SqlSession對象
sqlSession = factory.openSession(true);
//4.獲取dao的代理對象
userDao = sqlSession.getMapper(UserDao.class);
}
/**
* 關閉資源
* @throws Exception
*/
@After
public void destroy() throws Exception {
//關閉資源
sqlSession.close();
in.close();
}
/**
* 插入操作
*/
@Test
public void insertUser() {
User user = new User();
user.setUsername("李四");
userDao.insertUser(user);
}
/**
* 更新操作
*/
@Test
public void updateUser() {
User user = new User();
user.setUsername("張三2");
userDao.updateUser(user);
}
/**
* 刪除操作
*/
@Test
public void deleteUser() {
User user = new User();
user.setUsername("李四");
userDao.deleteUser(user);
}
/**
* 查詢所有操作
*/
@Test
public void findAll() {
User user = new User();
user.setUsername("張三");
List<User> li = userDao.findAll();
for (User user1 : li) {
System.out.println(user);
}
}
/**
* 通過姓名查詢
*/
@Test
public void findUserByName() {
User user = new User();
user.setUsername("老王");
List<User> li = userDao.findUserByName(user);
for (User user1 : li) {
System.out.println(user);
}
}
/**
* 關鍵字模糊查詢
*/
@Test
public void findByKeyWord() {
User user = new User();
//模糊查詢需要傳入帶通配符的參數,例如下面就是查詢姓名中包含"王"的用戶
user.setUsername("%王%");
List<User> li = userDao.findByKeyWord(user);
for (User u : li) {
System.out.println(u);
}
}
/**
* 查詢總數
*/
@Test
public void findTotalCount() { User user = new User();
user.setUsername("小二王");
Integer li = userDao.findTotalCount(user);
System.out.println("查詢到小二王的數量是:"+li);
}
}
- 完善相關xml配置文件
<?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="com.demo.dao.UserDao">
<!-- 定義User類的返回值模板 resultMap-->
<!--1.id是user對象的模板
2.type是指指定的模板類名稱爲User
-->
<resultMap id="userMap" type="User">
<!--<id>是主鍵字段別名標籤:如果User類中的id字段對應數
據庫中的id字段是帶有主鍵約束的話,那麼就需要使用<id>標籤-->
<!--<result>標籤是非對應主鍵字段所使用的標籤-->
<!--屬性:
property:指定的是User類中的字段名稱
column:指定的是數據庫表的字段名稱
-->
<id property="id" column="id"></id>
<result property="username" column="username"></result>
<result property="address" column="address"></result>
<result property="sex" column="sex"></result>
<result property="birthday" column="birthday"></result>
</resultMap>
<!--
說明:以下都是數據庫查詢語句的標籤內容,其實質就是在寫數據庫操作的方法,
只不過就是通過標籤的形式書寫代碼而已。
標籤介紹:對應的就是CRUD操作
<insert>
<delete>
<update>
<select>
屬性介紹:
id:對應實現的接口的方法名,這裏實現了接口"com.demo.dao.UserDao"
parameterType:對應了方法中的參數,這裏主要使用的參數都是user
resultType:返回值類型屬性賦值,可以賦值全類名或者已經配置的別名
resultMap:返回值類型,一些引用類型對象的返回值使用這個標籤,通常配合<resultMap>標籤使用
-->
<!--增、刪、改操作,因爲這些操作-->
<!--新增用戶-->
<insert id="insertUser" parameterType="user">
insert into user(username) values(#{username});
</insert>
<!--刪除用戶-->
<delete id="deleteUser" parameterType="user">
DELETE FROM USER WHERE username=#{username};
</delete>
<!--更新用戶-->
<update id="updateUser" parameterType="user">
UPDATE USER SET username=#{username} WHERE username='張三';
</update>
<!--普通查詢、模糊查詢、聚合查詢-->
<!--查詢所有-->
<select id="findAll" resultMap="userMap">
SELECT * FROM USER;
</select>
<!--通過名稱查詢-->
<select id="findUserByName" parameterType="user" resultMap="userMap">
SELECT * FROM USER WHERE username=#{username};
</select>
<!--模糊查詢-->
<select id="findByKeyWord" parameterType="user" resultMap="userMap">
SELECT * FROM USER WHERE username LIKE #{username};
</select>
<!--聚合函數查詢-->
<select id="findTotalCount" parameterType="user" resultType="Integer">
SELECT COUNT(*) FROM USER WHERE username=#{username};
</select>
</mapper>
- 測試
### 總結
Mybatis框架極大的方便了我們對數據庫的操作,只需要學習其中的標籤,我們就可以非常方便的通過對xml配置文件的修改從而改變對數據庫的操作,而不是去修改java源碼,這樣就方便了對程序的維護和測試。