環境:
- 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="https://www.cnblogs.com/cnqijian/p/com.mysql.jdbc.Driver"/>
<property name="url" value="https://www.cnblogs.com/cnqijian/p/jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="https://www.cnblogs.com/cnqijian/p/root"/>
<property name="password" value="https://www.cnblogs.com/cnqijian/p/****"/>
</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
}
在該專案的搭建中遇到的問題如下:
- mybatis 出錯java.lang.ExceptionInInitializerError
- mybatis 出現org.apache.ibatis.exceptions.PersistenceException: ### Error querying database.例外
- mybatis maven資源匯出失敗的問題
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/242304.html
標籤:MySQL
