環境:
- jdk1.8
- mysql5.7
- maven3.6.0
- IDEA
什麼是mybatis框架?
- MyBatis 是一款優秀的持久層框架,
- 它支援自定義 SQL、儲存過程以及高階對映。
- MyBatis免除了幾乎所有的 JDBC 程式碼以及設定引數和獲取結果集的工作。
- MyBatis可以通過簡單的 XML 或註解來配置和對映原始型別、介面和 Java POJO(Plain Old Java Objects,普通老式 Java 物件)為資料庫中的記錄。
- MyBatis 本是apache的一個開源專案iBatis, 2010年這個專案由apache software foundation 遷移到了[google code](https://baike.baidu.com/item/google code/2346604),並且改名為MyBatis 。2013年11月遷移到Github。
下面開始搭建
- sql檔案如下:
/*
SQLyog Ultimate v13.1.1 (64 bit)
MySQL - 5.7.31-log : Database - mybatis
*********************************************************************
*/
CREATE DATABASE /*!32312 IF NOT EXISTS*/`mybatis` /*!40100 DEFAULT CHARACTER SET latin1 */;
USE `mybatis`;
/*Table structure for table `user` */
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(20) NOT NULL,
`name` varchar(30) DEFAULT NULL,
`pwd` varchar(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*Data for the table `user` */
insert into `user`(`id`,`name`,`pwd`) values
(1,'qijian','123'),
(2,'Tom','123'),
(3,'qijian','111');
- 使用 Maven 來構建專案。pom.xml檔案程式碼如下。注意我搭建該專案是mybatis-study的子專案。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>mybatis-study</artifactId>
<groupId>com.qijijan</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>mybatis-01</artifactId>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
</dependencies>
<build>
<!--Maven靜態資源過濾問題-->
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.poroperties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
</project>
- XML 配置檔案中包含了對 MyBatis 系統的核心設定,包括獲取資料庫連線例項的資料來源(DataSource)以及決定事務作用域和控制方式的事務管理器(TransactionManager)。
<?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 default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="****"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/qijian/dao/UserMapper.xml"/>
</mappers>
</configuration>
注意: XML 頭部的宣告,它用來驗證 XML 文件的正確性。environment 元素體中包含了事務管理和連線池的配置。mappers 元素則包含了一組對映器(mapper),這些對映器的 XML 對映檔案包含了 SQL 程式碼和對映定義資訊。
- 每個基於 MyBatis 的應用都是以一個 SqlSessionFactory 的例項為核心的。SqlSessionFactory 的例項可以通過 SqlSessionFactoryBuilder 獲得。而 SqlSessionFactoryBuilder 則可以從 XML 配置檔案或一個預先配置的 Configuration 例項來構建出 SqlSessionFactory 例項。這裡使用的是XML 配置檔案。
MybatisUtils工具類.
package com.qijian.utils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
private static String resource = "mybatis-Config.xml";
private static InputStream inputStream;
static {
//使用mybatis的第一步:獲取 SqlSessionFactory物件
try {
inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
//既然有了 SqlSessionFactory,顧名思義,我們可以從中獲得 SqlSession 的例項。
// SqlSession 提供了在資料庫執行 SQL 命令所需的所有方法。
public static SqlSession getSqlSession() throws IOException {
return sqlSessionFactory.openSession();
}
}
- 實體類user如下
package com.qijian.pojo;
public class User {
private int id;
private String name;
private String pwd;
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", pwd='" + pwd + '\'' +
'}';
}
public User(int id, String name, String pwd) {
this.id = id;
this.name = name;
this.pwd = pwd;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
- UserMapper類
package com.qijian.dao;
import com.qijian.pojo.User;
import java.util.List;
import java.util.Map;
public interface UserMapper {
//查詢所有的使用者
//@Select("SELECT * FROM mybatis.user WHERE id = #{id}")
List<User> getUserList();
//通過id查詢使用者
User getUserById(int id);
//增加使用者
int addUser(User user);
//新增使用者 使用Map集合
int addUserByMap(Map<String,Object> map);
//修改使用者
int updateUser(User user);
//刪除使用者
void deleteUser(int id);
}
- 基於 XML 對映語句 在名稱空間 “com.qijian.dao.UserMapper” 中定義如下 的對映語句(例如名為 “getUserList”),這樣你就可以用全限定名 “com.qijian.dao.UserMapper.getUserList” 來呼叫對映語句了
<?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.qijian.dao.UserMapper">
<select id="getUserList" resultType="com.qijian.pojo.User">
select * from mybatis.user
</select>
<select id="getUserById" parameterType="int" resultType="com.qijian.pojo.User">
select *from mybatis.user where id = #{id};
</select>
<insert id="addUser" parameterType="com.qijian.pojo.User">
insert into mybatis.user(id,name,pwd) values(#{id},#{name},#{pwd});
</insert>
<insert id="addUserByMap" parameterType="Map">
insert into mybatis.user(id,name,pwd) values(#{id},#{name},#{pwd});
</insert>
<update id="updateUser" parameterType="com.qijian.pojo.User">
update mybatis.user
set name = #{name},pwd = #{pwd}
where id=#{id};
</update>
<delete id="deleteUser" parameterType="int">
delete from mybatis.user where id=#{id};
</delete>
</mapper>
注意:
對名稱空間的一點補充
在之前版本的 MyBatis 中,名稱空間(Namespaces)的作用並不大,是可選的。 但現在,隨著名稱空間越發重要,你必須指定名稱空間。
名稱空間的作用有兩個,一個是利用更長的全限定名來將不同的語句隔離開來,同時也實現了你上面見到的介面繫結。就算你覺得暫時用不到介面繫結,你也應該遵循這裡的規定,以防哪天你改變了主意。 長遠來看,只要將名稱空間置於合適的 Java 包名稱空間之中,你的程式碼會變得更加整潔,也有利於你更方便地使用 MyBatis。
命名解析:為了減少輸入量,MyBatis 對所有具有名稱的配置元素(包括語句,結果對映,快取等)使用瞭如下的命名解析規則。
全限定名(比如 “com.mypackage.MyMapper.selectAllThings)將被直接用於查詢及使用。
短名稱(比如 “selectAllThings”)如果全域性唯一也可以作為一個單獨的引用。 如果不唯一,有兩個或兩個以上的相同名稱(比如 “com.foo.selectAllThings” 和 “com.bar.selectAllThings”),那麼使用時就會產生“短名稱不唯一”的錯誤,這種情況下就必須使用全限定名。
8. 測試類
package com.qijian.dao;
import com.qijian.pojo.User;
import com.qijian.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class UserMapperTest {
@Test
public void testSelect() throws IOException {
//第一步:獲取sqlsesion物件
SqlSession sqlSession = MybatisUtils.getSqlSession();
//執行
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = userMapper.getUserList();
for(User user : userList){
System.out.println(user);
}
//關閉資源
sqlSession.close();
}
@Test
public void testSelectById() throws IOException {
//獲取sqlSession物件
SqlSession sqlSession = MybatisUtils.getSqlSession();
//執行
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.getUserById(1);
System.out.println(user);
sqlSession.close();
}
// 注意增刪改差需要提交事務
@Test
public void testAddUser() throws IOException {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
int res = userMapper.addUser(new User(7,"herry","123"));
if (res>0){
System.out.println("插入成功!");
}
//提交事務
sqlSession.commit();
sqlSession.close();
}
@Test
public void testUpdateUser() throws IOException {
SqlSession sqlSession = MybatisUtils.getSqlSession();
sqlSession.getMapper(UserMapper.class).updateUser(new User(3,"qijian","111"));
sqlSession.commit();
sqlSession.close();
}
@Test
public void testDeleteUser() throws IOException {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
userMapper.deleteUser(7);
sqlSession.commit();
sqlSession.close();
}
@Test
public void testAddByMap() throws IOException {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//空過Map可以很方便的插入資料
// 假設,我們的實體類,或者資料庫中的表,欄位或者引數過多,我們應當使用Map
Map<String,Object> map = new HashMap<String, Object>();
map.put("id",8);
map.put("name","wangwu");
map.put("pwd","1234");
userMapper.addUserByMap(map);
sqlSession.commit();
sqlSession.close();
}
// Map中傳遞引數,直接在SQL中取出key
// 物件傳遞引數,直接在SQL中取物件的屬性
// 只有一個基本型別引數的情況下,可以直接在SQL中取到
// 多引數用Map
}
在該專案的搭建中遇到的問題如下: