Mybatis學習筆記(一)
標簽: web框架學習 mybatis sql threadlocal 線程安全的sqlSession
1、環境描述
- java版本:1.8
- 開發工具:idea 2018版
- mysql:8.x版本
- mybatis:3.4.6版本
- lombok
mybatis 在開發中最為關鍵的是其 SqlSession 的使用和 mapper 文件的配置。
本文將圍繞它來介紹Mybatis的入門案例。
2、項目結構
2.1 配置文件
在 idea 中,使用maven項目。在 resources 資源文件夾中創建文件夾。
2.1.1 mybatis/config/jdbc.properties
### 數據庫配置
### mysql8的驅動
jdbc.driver=com.mysql.cj.jdbc.Driver
### mysql8中必須加上時區
jdbc.url=jdbc:mysql://localhost:3306/springmvc?characterEncoding=utf-8&serverTimezone=UTC
jdbc.username=root
jdbc.password=root
2.1.2 mybatis/config/mybatis-config.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>
<!--外部引入屬性文件-->
<properties resource="mybatis/config/jdbc.properties"/>
<!--引入日志-->
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
<!--別名:在該包中,截取類名為簡單類名-->
<typeAliases>
<package name="org.feng.entity"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--映射mapper.xml文件-->
<mappers>
<mapper resource="mybatis/mappers/org/feng/mapper/MyMapper.xml"/>
</mappers>
</configuration>
2.1.3 mybatis/mappers/org/feng/mapper/MyMapper.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">
<!--
namespace 對應一個接口
-->
<mapper namespace="org.feng.mapper.MyMapper">
<!--
id 對應接口中的方法名
resultType 對應接口中方法的返回值類型
-->
<select id="listUser" resultType="User">
select userid, pwd from user
</select>
<!--
id 對應接口中的方法名
parameterType 對應接口中方法的參數類型
-->
<insert id="insertUser" parameterType="User">
insert into user (userid, pwd)
values (#{userid}, #{pwd})
</insert>
<select id="getById" resultType="string">
select userid, pwd from user where userid = #{userid}
</select>
<update id="updateUser" parameterType="User">
update user set pwd = #{pwd} where userid = #{userid}
</update>
<delete id="deleteById" parameterType="string">
delete from user where userid = #{userid}
</delete>
</mapper>
2.1.4 log4j.properties
# Global logging configuration
# MyBatis logging configuration...
log4j.rootLogger=Debug, stdout
# Console output...
log4j.logger.org.mybatis.example.BlogMapper=TRACE
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
2.1.5 數據庫的表
/*
Navicat Premium Data Transfer
Source Server : MySql
Source Server Type : MySQL
Source Server Version : 80018
Source Host : localhost:3306
Source Schema : springmvc
Target Server Type : MySQL
Target Server Version : 80018
File Encoding : 65001
Date: 20/12/2019 14:22:15
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`userid` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用戶編號',
`pwd` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '密碼',
UNIQUE INDEX `userid`(`userid`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1001', '123456');
SET FOREIGN_KEY_CHECKS = 1;
2.1.6 pom.xml
<?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">
<modelVersion>4.0.0</modelVersion>
<groupId>org.feng</groupId>
<artifactId>mybatis-demo-20191220</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
</project>
3、java類
3.1 實體類
package org.feng.entity;
import lombok.Data;
/**
* Created by Feng on 2019/12/20 10:28
* CurrentProject's name is mybatis-demo-20191220
* @author Feng
*/
@Data
public class User {
private String userid;
private String pwd;
}
3.2 mapper接口
package org.feng.mapper;
import org.feng.entity.User;
import java.util.List;
/**
* Created by Feng on 2019/12/20 10:14
* CurrentProject's name is mybatis-demo-20191220
* @author Feng
*/
public interface MyMapper {
/**
* 查詢所有用戶
* @return 用戶列表
*/
List<User> listUser();
/**
* 插入數據
* @param user 用戶對象
* @return 數據庫影響的行數
*/
int insertUser(User user);
/**
* 通過主鍵查詢單個用戶
* @param userid 用戶主鍵
* @return 用戶對象
*/
User getById(String userid);
/**
* 通過主鍵刪除單個用戶
* @param userid 用戶主鍵
* @return 數據庫影響的行數
*/
int deleteById(String userid);
/**
* 修改用戶信息
* @param user 用戶對象
* @return 數據庫影響的行數
*/
int updateUser(User user);
}
3.3 SqlSessionUtil
package org.feng.util;
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;
/**
* Created by Feng on 2019/12/20 11:32
* CurrentProject's name is mybatis-demo-20191220<br>
* {@link SqlSession} 的工具類:使用 {@link ThreadLocal} 提供獲取和關閉的方法
* @author Feng
*/
public class SqlSessionUtil {
/**本地線程池:存放 {@link SqlSession}*/
private final static ThreadLocal<SqlSession> SQL_SESSION_THREAD_LOCAL = new ThreadLocal<>();
/**
* sqlSession工廠:用來產生sqlSession,只創建一次。
* 使用靜態代碼塊實現。
* <p>官方原話:<br>
* 一旦被創建, {@link SqlSessionFactory} 實例應該在你的應用程序執行期間都存在。沒有理由來
* 處理或重新創建它。使用 {@link SqlSessionFactory} 的最佳實踐是在應用程序運行期間不要重復創建
* 多次。
* </p>
* */
private static SqlSessionFactory sqlSessionFactory;
/**
* 私有構造器
*/
private SqlSessionUtil(){}
static {
// mybatis 配置文件的路徑
String resource = "mybatis/config/mybatis-config.xml";
InputStream in;
try {
in = Resources.getResourceAsStream(resource);
// 根據加載到的配置文件創建會話工廠
// 通過工廠建造器建造 sqlSessionFactory 工廠
sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 獲取{@link SqlSession}:先從本地線程中獲取,當獲取的是{@code null}時
* 通過{@link SqlSessionFactory}來創建{@link SqlSession}并保存在本地線程中。
* <p>官方原話:<br>
* 每個線程都應該有它自己的 {@link SqlSession} 實例。 {@link SqlSession} 的實例不能共享使用, 它也是
* 線程不安全的。因此最佳的范圍是請求或方法范圍。
* </p>
* @return SqlSession 對象
*/
public static SqlSession getSqlSession(){
SqlSession sqlSession = SQL_SESSION_THREAD_LOCAL.get();
if(sqlSession == null){
/*
* 該 openSession 方法底層調用的是 DefaultSqlSessionFactory 類。
* 該類是 SqlSession 的默認實現。
*/
sqlSession = sqlSessionFactory.openSession();
SQL_SESSION_THREAD_LOCAL.set(sqlSession);
}
return sqlSession;
}
/**
* 關閉{@link SqlSession}并從{@link ThreadLocal}中移除
*/
public static void close(){
SqlSession sqlSession = SQL_SESSION_THREAD_LOCAL.get();
if(sqlSession != null){
sqlSession.close();
SQL_SESSION_THREAD_LOCAL.remove();
}
}
/**
* 提交事務,發生異常時會回滾
*/
public static void commit(){
SqlSession sqlSession = SQL_SESSION_THREAD_LOCAL.get();
if(sqlSession != null){
try {
sqlSession.commit();
} catch (Exception e){
sqlSession.rollback();
}
}
}
}
4、測試
package org.feng.test;
import org.apache.ibatis.session.SqlSession;
import org.feng.entity.User;
import org.feng.mapper.MyMapper;
import org.feng.util.SqlSessionUtil;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
/**
* Created by Feng on 2019/12/20 13:29
* CurrentProject's name is mybatis-demo-20191220
*/
public class MyMapperTest {
private MyMapper myMapper;
/**
* 從{@link SqlSessionUtil}中獲取{@link SqlSession}
*/
@Before
public void init(){
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
myMapper = sqlSession.getMapper(MyMapper.class);
}
@Test
public void testListUser(){
myMapper.listUser().forEach(System.out::println);
}
@Test
public void testInsertUser(){
User user = new User();
user.setUserid("1002");
user.setPwd("789123");
int rows = myMapper.insertUser(user);
System.out.println(rows > 0 ? "insert user success" : "fail to insert user");
}
@Test
public void testUpdateUser(){
User user = new User();
user.setUserid("1002");
user.setPwd("123123");
int rows = myMapper.updateUser(user);
System.out.println(rows > 0 ? "update user success" : "fail to update user");
}
@Test
public void testGetById(){
String userid = "1002";
System.out.println(myMapper.getById(userid));
}
@Test
public void testDeleteById(){
String userid = "1002";
int rows = myMapper.deleteById(userid);
System.out.println(rows > 0 ? "delete user success" : "fail to delete user");
}
@After
public void end(){
SqlSessionUtil.commit();
SqlSessionUtil.close();
}
}
智能推薦
Mybatis學習筆記(一)
1、環境描述 java版本:1.8 開發工具:idea 2018版 mysql:8.x版本 mybatis:3.4.6版本 lombok mybatis 在開發中最為關鍵的是其 SqlSession 的使用和 mapper 文件的配置。 本文將圍繞它來介紹Mybatis的入門案例。 2、項目結構 2.1 配置文件 在 idea 中,使用maven項目。在 resources 資源文件夾中創建文件夾...
MyBatis學習筆記(一)
一、MyBatis介紹 MyBatis 是一款優秀的持久層框架,它支持定制化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可以使用簡單的 XML 或注解來配置和映射原生信息,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記...
Mybatis學習筆記一
Mybatis學習筆記一 概述 Mybatis 是一個優秀的基于 java 的持久層框架,它內部封裝了 jdbc,使開發者只需要關注 sql 語句本身,而不需要花費精力去處理加載驅動、創建連接、創建 statement 等繁雜的過程。 mybatis 通過 xml 或注解的方式將要執行的各種 statement 配置起來,并通過 java 對象和 statement 中sql 的動態參數進行映射生...
MyBatis學習筆記(一)
1 、對原生態jdbc程序中問題總結 jdbc編程步驟: 1、 加載數據庫驅動 2、 創建并獲取數據庫鏈接 3、 創建jdbc statement對象 4、 設置sql語句 5、 設置sql語句中的參數(使用preparedStatement) 6、 通過statement執行sql并獲取結果 7、 對sql執行結...
Mybatis學習筆記(一)
嗷嗷 環境統一 JDK1.8 Mysql5.7 maven3.6.1 簡介 什么是mybatis MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,并且改名為MyBatis 。2013年11月遷移到Github。 iBATIS一詞來源于“internet”和...
猜你喜歡
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...