一盛末、引入依賴
<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 所用日志的具體實(shí)現(xiàn)矿卑,未指定時將自動查找。-->
<!--SLF4J,LOG4J,LOG4J2,JDK_LOGGING,COMMONS_LOGGING,STDOUT_LOGGING,NO_LOGGING-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
<!--指定當(dāng)結(jié)果集中值為 null 的時候是否調(diào)用映射對象的 setter(map 對象時為 put)方法沃饶,這對于有 Map.keySet() 依賴或 null 值初始化的時候是有用的母廷。注意基本類型(int、boolean等)是不能設(shè)置成 null 的糊肤。-->
<setting name="callSettersOnNulls" value="true"/>
<!--該配置影響的所有映射器中配置的緩存的全局開關(guān)琴昆。-->
<setting name="cacheEnabled" value="true"/>
<!--延遲加載的全局開關(guān)。當(dāng)開啟時馆揉,所有關(guān)聯(lián)對象都會延遲加載椎咧。 特定關(guān)聯(lián)關(guān)系中可通過設(shè)置fetchType屬性來覆蓋該項(xiàng)的開關(guān)狀態(tài)。-->
<setting name="lazyLoadingEnabled" value="true"/>
<!--當(dāng)啟用時把介,對任意延遲屬性的調(diào)用會使帶有延遲加載屬性的對象完整加載;反之蟋座,每種屬性將會按需加載拗踢。-->
<setting name="aggressiveLazyLoading" value="true"/>
<!--是否允許單一語句返回多結(jié)果集(需要兼容驅(qū)動)-->
<setting name="multipleResultSetsEnabled" value="true"/>
<!--使用列標(biāo)簽代替列名。不同的驅(qū)動在這方面會有不同的表現(xiàn)向臀, 具體可參考相關(guān)驅(qū)動文檔或通過測試這兩種不同的模式來觀察所用驅(qū)動的結(jié)果巢墅。-->
<setting name="useColumnLabel" value="true"/>
<!--允許 JDBC 支持自動生成主鍵,需要驅(qū)動兼容券膀。 如果設(shè)置為 true 則這個設(shè)置強(qiáng)制使用自動生成主鍵君纫,盡管一些驅(qū)動不能兼容但仍可正常工作(比如 Derby)-->
<setting name="useGeneratedKeys" value="false"/>
<!--指定 MyBatis 應(yīng)如何自動映射列到字段或?qū)傩浴?NONE 表示取消自動映射;
PARTIAL 只會自動映射沒有定義嵌套結(jié)果集映射的結(jié)果集芹彬。 FULL 會自動映射任意復(fù)雜的結(jié)果集(無論是否嵌套)-->
<setting name="autoMappingBehavior" value="PARTIAL"/>
<!--配置默認(rèn)的執(zhí)行器蓄髓。SIMPLE 就是普通的執(zhí)行器;REUSE 執(zhí)行器會重用預(yù)處理語句(prepared statements)舒帮; BATCH 執(zhí)行器將重用語句并執(zhí)行批量更新会喝。-->
<!--SIMPLE REUSE BATCH-->
<setting name="defaultExecutorType" value="SIMPLE"/>
<!--是否開啟自動駝峰命名規(guī)則(camel case)映射,即從經(jīng)典數(shù)據(jù)庫列名 A_COLUMN 到經(jīng)典 Java 屬性名 aColumn 的類似映射玩郊。-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!--MyBatis 利用本地緩存機(jī)制(Local Cache)防止循環(huán)引用(circular references)和加速重復(fù)嵌套查詢肢执。
默認(rèn)值為 SESSION,這種情況下會緩存一個會話中執(zhí)行的所有查詢译红。 若設(shè)置值為 STATEMENT预茄,本地會話僅用在語句執(zhí)行上,
對相同 SqlSession 的不同調(diào)用將不會共享數(shù)據(jù)侦厚。-->
<setting name="localCacheScope" value="SESSION"/>
<!--當(dāng)沒有為參數(shù)提供特定的 JDBC 類型時耻陕,為空值指定 JDBC 類型拙徽。 某些驅(qū)動需要指定列的 JDBC 類型,多數(shù)情況直接用一般類型即可淮蜈,比如 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運(yùn)行環(huán)境 -->
<environments default="development">
<environment id="development">
<!-- type="JDBC" 代表使用JDBC的提交和回滾來管理事務(wù) -->
<transactionManager type="JDBC"/>
<!-- mybatis提供了3種數(shù)據(jù)源類型鹉梨,分別是:POOLED,UNPOOLED,JNDI -->
<!-- POOLED 表示支持JDBC數(shù)據(jù)源連接池 -->
<!-- UNPOOLED 表示不支持?jǐn)?shù)據(jù)源連接池 -->
<!-- JNDI 表示支持外部數(shù)據(jù)源連接池 -->
<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("刪除失敗");
}
}
}