一、引入依賴
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.13</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
二、配置
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="jdbc.properties"/>
<settings>
<!--指定 MyBatis 所用日志的具體實現,未指定時將自動查找。-->
<!--SLF4J,LOG4J,LOG4J2,JDK_LOGGING,COMMONS_LOGGING,STDOUT_LOGGING,NO_LOGGING-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
<!--指定當結果集中值為 null 的時候是否調用映射對象的 setter(map 對象時為 put)方法,這對于有 Map.keySet() 依賴或 null 值初始化的時候是有用的。注意基本類型(int、boolean等)是不能設置成 null 的。-->
<setting name="callSettersOnNulls" value="true"/>
<!--該配置影響的所有映射器中配置的緩存的全局開關。-->
<setting name="cacheEnabled" value="true"/>
<!--延遲加載的全局開關。當開啟時,所有關聯對象都會延遲加載。 特定關聯關系中可通過設置fetchType屬性來覆蓋該項的開關狀態(tài)。-->
<setting name="lazyLoadingEnabled" value="true"/>
<!--當啟用時,對任意延遲屬性的調用會使帶有延遲加載屬性的對象完整加載;反之,每種屬性將會按需加載。-->
<setting name="aggressiveLazyLoading" value="true"/>
<!--是否允許單一語句返回多結果集(需要兼容驅動)-->
<setting name="multipleResultSetsEnabled" value="true"/>
<!--使用列標簽代替列名。不同的驅動在這方面會有不同的表現, 具體可參考相關驅動文檔或通過測試這兩種不同的模式來觀察所用驅動的結果。-->
<setting name="useColumnLabel" value="true"/>
<!--允許 JDBC 支持自動生成主鍵,需要驅動兼容。 如果設置為 true 則這個設置強制使用自動生成主鍵,盡管一些驅動不能兼容但仍可正常工作(比如 Derby)-->
<setting name="useGeneratedKeys" value="false"/>
<!--指定 MyBatis 應如何自動映射列到字段或屬性。 NONE 表示取消自動映射;
PARTIAL 只會自動映射沒有定義嵌套結果集映射的結果集。 FULL 會自動映射任意復雜的結果集(無論是否嵌套)-->
<setting name="autoMappingBehavior" value="PARTIAL"/>
<!--配置默認的執(zhí)行器。SIMPLE 就是普通的執(zhí)行器;REUSE 執(zhí)行器會重用預處理語句(prepared statements); BATCH 執(zhí)行器將重用語句并執(zhí)行批量更新。-->
<!--SIMPLE REUSE BATCH-->
<setting name="defaultExecutorType" value="SIMPLE"/>
<!--是否開啟自動駝峰命名規(guī)則(camel case)映射,即從經典數據庫列名 A_COLUMN 到經典 Java 屬性名 aColumn 的類似映射。-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!--MyBatis 利用本地緩存機制(Local Cache)防止循環(huán)引用(circular references)和加速重復嵌套查詢。
默認值為 SESSION,這種情況下會緩存一個會話中執(zhí)行的所有查詢。 若設置值為 STATEMENT,本地會話僅用在語句執(zhí)行上,
對相同 SqlSession 的不同調用將不會共享數據。-->
<setting name="localCacheScope" value="SESSION"/>
<!--當沒有為參數提供特定的 JDBC 類型時,為空值指定 JDBC 類型。 某些驅動需要指定列的 JDBC 類型,多數情況直接用一般類型即可,比如 NULL、VARCHAR 或 OTHER。-->
<setting name="jdbcTypeForNull" value="NULL"/>
</settings>
<typeAliases>
<!-- 別名方式1,一個一個的配置 type中放置的是類的全路徑,alias中放置的是類別名 -->
<!-- typeAlias alias="Employee" type="com.fzy.servlet.model.Employee"/>-->
<!--<typeAlias alias="UserInfo" type="com.fzy.servlet.model.UserInfo"/>-->
<!-- 別名方式2,自動掃描,將JAVA類的類名作為類的類別名 -->
<package name="com.fzy.servlet.model"/>
</typeAliases>
<!-- 配置mybatis運行環(huán)境 -->
<environments default="development">
<environment id="development">
<!-- type="JDBC" 代表使用JDBC的提交和回滾來管理事務 -->
<transactionManager type="JDBC"/>
<!-- mybatis提供了3種數據源類型,分別是:POOLED,UNPOOLED,JNDI -->
<!-- POOLED 表示支持JDBC數據源連接池 -->
<!-- UNPOOLED 表示不支持數據源連接池 -->
<!-- JNDI 表示支持外部數據源連接池 -->
<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>
<mappers>
<!-- 映射文件方式1,一個一個的配置-->
<mapper resource="mapper/EMapper.xml"/>
<mapper resource="mapper/UserInfoMapper.xml"/>
</mappers>
</configuration>
jdbc.properties
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/javastudy?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
jdbc.username=root
jdbc.password=wsfzywfses961015
三、使用
package com.fzy.servlet.controller;
import com.fzy.servlet.mapper.UserInfoMapper;
import com.fzy.servlet.model.UserInfo;
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 org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.util.List;
import java.util.Random;
import java.util.UUID;
public class TestMain {
private SqlSessionFactory sqlSessionFactory;
@Before
public void init() {
try {
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void insert() {
SqlSession sqlSession = sqlSessionFactory.openSession(true);
UserInfoMapper mapper = sqlSession.getMapper(UserInfoMapper.class);
for (int i = 0; i < 50; i++) {
UserInfo userInfo = new UserInfo();
userInfo.setUsername(UUID.randomUUID().toString().replace("-", ""));
userInfo.setPassword(UUID.randomUUID().toString().replace("-", ""));
userInfo.setNickname(userInfo.getUsername().substring(0, 9).toUpperCase());
userInfo.setMoney(new BigDecimal(new Random().nextInt(50000)));
userInfo.setType(new Random().nextInt(1));
Integer orderNO = mapper.selectMaxOrderNO();
userInfo.setOrderNO(orderNO + 1);
int j = mapper.insert(userInfo);
if (j > 0) {
System.out.println("插入成功");
} else {
System.out.println("插入失敗");
}
}
sqlSession.close();
}
@Test
public void selectList() {
SqlSession sqlSession = sqlSessionFactory.openSession(true);
UserInfoMapper mapper = sqlSession.getMapper(UserInfoMapper.class);
List<UserInfo> userInfoList = mapper.select();
System.out.println(userInfoList);
sqlSession.close();
}
@Test
public void delete() {
SqlSession sqlSession = sqlSessionFactory.openSession(true);
UserInfoMapper mapper = sqlSession.getMapper(UserInfoMapper.class);
int i = mapper.delete("fengzhiyuan");
if (i > 0) {
System.out.println("刪除成功");
} else {
System.out.println("刪除失敗");
}
}
}