一睦袖、MyBatis簡介
??MyBatis 是一款優(yōu)秀的持久層框架蜒程,它支持定制化 SQL绘迁、存儲過程以及高級映射嘴秸。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集毁欣。MyBatis 可以使用簡單的 XML 或注解來配置和映射原生類型、接口和 Java 的 POJO(Plain Old Java Objects岳掐,普通老式 Java 對象)為數據庫中的記錄凭疮。
二、Maven依賴
<!-- SpringJDBC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- mybatis-spring整合包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<!-- mybatis 配置 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<!-- mysql配置 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.44</version>
</dependency>
<!--數據庫連接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.19</version>
</dependency>
三串述、配置
- db.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/member_manage?characterEncoding=utf-8&useSSL=false
jdbc.username=root
jdbc.password=1234
- applicationContext.xml
<!--包掃描-->
<context:component-scan base-package="com.neuedu"/>
<!--Mybatis配置-->
<context:property-placeholder location="classpath:db.properties"/>
<!--數據源配置-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="driverClassName">
<value>${jdbc.driver}</value>
</property>
<property name="url">
<value>${jdbc.url}</value>
</property>
<property name="username">
<value>${jdbc.username}</value>
</property>
<property name="password">
<value>${jdbc.password}</value>
</property>
<!-- 配置初始化大小执解、最小、最大 -->
<property name="initialSize" value="1"/>
<property name="minIdle" value="1"/>
<property name="maxActive" value="10"/>
<!-- 配置獲取連接等待超時的時間 -->
<property name="maxWait" value="10000"/>
<!-- 配置間隔多久才進行一次檢測纲酗,檢測需要關閉的空閑連接衰腌,單位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="60000"/>
<!-- 配置一個連接在池中最小生存的時間,單位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="300000"/>
<property name="testWhileIdle" value="true"/>
<!-- 這里建議配置為TRUE觅赊,防止取到的連接不可用 -->
<property name="testOnBorrow" value="true"/>
<property name="testOnReturn" value="false"/>
<!-- 打開PSCache右蕊,并且指定每個連接上PSCache的大小 -->
<property name="poolPreparedStatements" value="true"/>
<property name="maxPoolPreparedStatementPerConnectionSize" value="20"/>
<!-- 這里配置提交方式,默認就是TRUE吮螺,可以不用配置 -->
<property name="defaultAutoCommit" value="true"/>
<!-- 驗證連接有效與否的SQL饶囚,不同的數據配置不同 -->
<property name="validationQuery" value="select 1 "/>
<property name="filters" value="stat"/>
</bean>
<!-- sqlSession 工廠 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="typeAliasesPackage" value="com.neuedu.entity"></property>
<!--Mapper配置文件路徑-->
<property name="mapperLocations" value="classpath:mapper/*.xml" />
<!--MyBatis全局配置-->
<property name="configLocation" value="classpath:mybatis/mybitas-config.xml" />
</bean>
<!-- mapper批量掃描,從mapper包中掃描出mapper接口规脸, 自動創(chuàng)建代理對象并且在spring容器中注冊 遵循規(guī)范:將mapper.java和mapper.xml映射文件名稱保持一致坯约,且在一個目錄
中自動掃描出來的mapper的bean的id為mapper類名(首字母小寫) -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--指定掃描的包名 如果掃描多個包,每個包中間使用半角逗號分隔 -->
<property name="basePackage" value="com.neuedu.mapper" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>
說明:
也可使用以下進行接口包掃描:
<mybatis:scan base-package="com.neuedu.mapper"/>
注解方式(SpringBoot常用方式):
@Configuration
@MapperScan("com.neuedu.mapper")
- Mapper配置文件
\resources\mapper\UserMapper.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" >
<mapper namespace="com.neuedu.mapper.UserMapper">
<insert id="insertUser" parameterType="com.neuedu.entity.User">
INSERT INTO user (id,username,password)values(#{id},#{username},#{password});
</insert>
</mapper>
- Mapper接口
@Repository
public interface UserMapper {
void insertUser(User user);
}
- 測試
@Slf4j
public class UserMapperTest extends AppTest {
@Autowired
private UserMapper userMapper;
@Test
public void insert() {
log.info(userMapper+"");
User user=new User();
user.setId(2L);
user.setUsername("lisi");
user.setPassword("123456");
userMapper.insertUser(user);
}
}
附:
Druid連接池配置
??DRUID是阿里巴巴開源平臺上一個數據庫連接池實現莫鸭,它結合了C3P0闹丐、DBCP、PROXOOL等DB池的優(yōu)點被因,同時加入了日志監(jiān)控卿拴,可以很好的監(jiān)控DB池連接和SQL的執(zhí)行情況衫仑,可以說是針對監(jiān)控而生的DB連接池(據說是目前最好的連接池)。
配置 | 缺省值 | 說明 |
---|---|---|
name | 配置這個屬性的意義在于堕花,如果存在多個數據源文狱,監(jiān)控的時候可以通過名字來區(qū)分開來。如果沒有配置缘挽,將會生成一個名字瞄崇,格式是:"DataSource-" + System.identityHashCode(this) | |
jdbcUrl | 連接數據庫的url,不同數據庫不一樣壕曼。例如:mysql : jdbc:mysql://10.20.153.104:3306/druid2 oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto |
|
username | 連接數據庫的用戶名 | |
password | 連接數據庫的密碼苏研。如果你不希望密碼直接寫在配置文件中,可以使用ConfigFilter腮郊。詳細看這里:https://github.com/alibaba/druid/wiki/%E4%BD%BF%E7%94%A8ConfigFilter | |
driverClassName | 根據url自動識別 這一項可配可不配摹蘑,如果不配置druid會根據url自動識別dbType,然后選擇相應的driverClassName(建議配置下) | |
initialSize | 0 | 初始化時建立物理連接的個數轧飞。初始化發(fā)生在顯示調用init方法衅鹿,或者第一次getConnection時 |
maxActive | 8 | 最大連接池數量 |
maxIdle | 8 | 已經不再使用,配置了也沒效果 |
minIdle | 最小連接池數量 | |
maxWait | 獲取連接時最大等待時間过咬,單位毫秒大渤。配置了maxWait之后,缺省啟用公平鎖掸绞,并發(fā)效率會有所下降兼犯,如果需要可以通過配置useUnfairLock屬性為true使用非公平鎖。 | |
poolPreparedStatements | false | 是否緩存preparedStatement集漾,也就是PSCache切黔。PSCache對支持游標的數據庫性能提升巨大,比如說oracle具篇。在mysql下建議關閉纬霞。 |
maxOpenPreparedStatements | -1 | 要啟用PSCache,必須配置大于0驱显,當大于0時诗芜,poolPreparedStatements自動觸發(fā)修改為true。在Druid中埃疫,不會存在Oracle下PSCache占用內存過多的問題伏恐,可以把這個數值配置大一些,比如說100 |
validationQuery | 用來檢測連接是否有效的sql栓霜,要求是一個查詢語句翠桦。如果validationQuery為null,testOnBorrow、testOnReturn销凑、testWhileIdle都不會其作用丛晌。 | |
testOnBorrow | true | 申請連接時執(zhí)行validationQuery檢測連接是否有效,做了這個配置會降低性能斗幼。 |
testOnReturn | false | 歸還連接時執(zhí)行validationQuery檢測連接是否有效澎蛛,做了這個配置會降低性能 |
testWhileIdle | false | 建議配置為true,不影響性能蜕窿,并且保證安全性谋逻。申請連接的時候檢測,如果空閑時間大于timeBetweenEvictionRunsMillis桐经,執(zhí)行validationQuery檢測連接是否有效斤贰。 |
timeBetweenEvictionRunsMillis | 有兩個含義: 1) Destroy線程會檢測連接的間隔時間 2) testWhileIdle的判斷依據,詳細看testWhileIdle屬性的說明 |
|
numTestsPerEvictionRun | 不再使用次询,一個DruidDataSource只支持一個EvictionRun | |
minEvictableIdleTimeMillis | ||
connectionInitSqls | 物理連接初始化的時候執(zhí)行的sql | |
exceptionSorter | 根據dbType自動識別 | 當數據庫拋出一些不可恢復的異常時,拋棄連接 |
filters | 屬性類型是字符串瓷叫,通過別名的方式配置擴展插件屯吊,常用的插件有: 監(jiān)控統(tǒng)計用的filter:stat日志用的filter:log4j防御sql注入的filter:wall |
|
proxyFilters | 類型是List<com.alibaba.druid.filter.Filter>,如果同時配置了filters和proxyFilters摹菠,是組合關系盒卸,并非替換關系 |
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<!-- 配置初始化大小、最小次氨、最大 -->
<property name="initialSize" value="1" />
<property name="minIdle" value="1" />
<property name="maxActive" value="10" />
<!-- 配置獲取連接等待超時的時間 -->
<property name="maxWait" value="10000" />
<!-- 配置間隔多久才進行一次檢測蔽介,檢測需要關閉的空閑連接,單位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="60000" />
<!-- 配置一個連接在池中最小生存的時間煮寡,單位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="300000" />
<property name="testWhileIdle" value="true" />
<!-- 這里建議配置為TRUE虹蓄,防止取到的連接不可用 -->
<property name="testOnBorrow" value="true" />
<property name="testOnReturn" value="false" />
<!-- 打開PSCache,并且指定每個連接上PSCache的大小 -->
<property name="poolPreparedStatements" value="true" />
<property name="maxPoolPreparedStatementPerConnectionSize" value="20" />
<!-- 這里配置提交方式幸撕,默認就是TRUE薇组,可以不用配置 -->
<property name="defaultAutoCommit" value="true" />
<!-- 驗證連接有效與否的SQL,不同的數據配置不同 -->
<property name="validationQuery" value="select 1 " />
<property name="filters" value="stat" />
<property name="proxyFilters">
<list>
<ref bean="logFilter" />
</list>
</property>
</bean>
<bean id="logFilter" class="com.alibaba.druid.filter.logging.Slf4jLogFilter">
<property name="statementExecutableSqlLogEnable" value="false" />
</bean>