在Spring使用Mybatis的設定方法如下,本篇使用Maven來加入所需的jar
本篇所連線的資料庫為MySQL 5.x
首先在Maven的pom.xml
加入Spring MVC,Spring JDBC,Spring Transaction,Mybatis及JDBC driver(範例為MySQL Connector/J)的jar如下,本篇是使用SpringMVC,而連線的資料庫為MySQL 5.7
<!-- SpringMVC -->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.3.14.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.14.RELEASE</version>
</dependency>
<!-- Mybatis -->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!-- MySQL jdbc driver -->
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.40</version>
</dependency>
接著在Maven的pom.xml
加入mybatis-spring的jar如下,此為整合Spring及Mybatis所需要的jar。
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
以上是所需要的函式庫。
接著設定Spring的配置檔,注意<beans>
的shema命名空間及xsi schema位置設定。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mybatis="http://mybatis.org/schema/mybatis-spring"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://mybatis.org/schema/mybatis-spring
http://mybatis.org/schema/mybatis-spring.xsd">
<!-- MySQL jdbc dataSource config -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" /><!-- MySQL 8的driverClassName 為com.mysql.cj.jdbc.Driver -->
<property name="url" value="jdbc:mysql://localhost:3306/mydatabase" />
<property name="username" value="matthung" />
<property name="password" value="12345" />
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configuration">
<!-- MyBatis other config settings 設定其他MyBatis參數 (mybatis-spring 1.3以上)-->
<bean class="org.apache.ibatis.session.Configuration">
<property name="defaultStatementTimeout" value="3"/><!-- 設定等待資料庫回應的時間(單位:秒) -->
<property name="localCacheScope" value="STATEMENT"/><!-- 設定local cache作用範圍 -->
</bean>
</property>
</bean>
<mybatis:scan base-package="idv.matthung.mapper" factory-ref="sqlSessionFactory"/>
</beans>
若要設定MyBatis的其他參數,可在SqlSessionFactoryBean
的configuration
屬性設定(mybatis-spring 1.3版本以後才支援直接在Spring配置檔設定MyBatis的參數,在之前要另外指定mybatis-config.xml
)。
上面設定中利用<mybatis:scan base-package="idv.matthung.mapper">
將存取資料庫的Mybatis mapper介面位置設在idv.matthung.mapper
。
接著在idv.matthung.mapper
下新增Mapper介面,例如idv.matthung.mapper.UserInfoMapper
,與資料庫中的USER_INFO
資料表對應。Mapper介面用來定義存取資料庫的方法,而方法的實作(SQL查詢語句)會定義在Mapper的xml
檔。
package idv.matthung.mapper;
import java.util.List;
import idv.matthung.model.UserInfo;
public interface UserInfoMapper {
public List<UserInfo> getAll();
}
Mybatis Mapper的xml
檔預設會放在與介面同樣的classpath下,所以接著在idv.matthung.mapper
下新增對應UserInfoMapper
介面的xml
檔,檔案名稱與介面相同,所以是UserInfoMapper.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="idv.matthung.mapper.UserInfoMapper">
<resultMap id="userInfoResultMap" type="idv.matthung.model.UserInfo">
<id property="userId" column="USER_ID" javaType="Integer" jdbcType="INTEGER"/>
<result property="email" column="EMAIL" javaType="String" jdbcType="VARCHAR"/>
<result property="password" column="PASSWORD" javaType="String" jdbcType="VARCHAR"/>
<result property="name" column="NAME" javaType="String" jdbcType="VARCHAR"/>
</resultMap>
<select id="getAll" resultMap="userInfoResultMap">
SELECT * FROM USER_INFO
</select>
</mapper>
上面UserInfoMapper
介面getAll()
方法實際上會執行UserInfoMapper.xml
中對應的id名稱中的SQL,也就是<select id="getAll" ... >
,查詢後會根據resultMap
的設定將資料表的資料塞入model UserInfo
物件。
UserInfo
model類別
package idv.matthung.model;
public class UserInfo {
private Integer userId;
private String email;
private String password;
private String name;
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
以上即為Spring搭配Mybatis的設定,在程式中使用範例如下。
@Service
public class UserInfoServiceImpl implements UserInfoService{
@Autowired
UserInfoMapper userInfoMapper;
public void qetAllUserInfos() {
// ...
List<UserInfo> userInfoList = userInfoMapper.getAll(); // 呼叫UserInfoMapper.getAll()對應的SQL
// ...
}
}
如果要更改xml
的位置,則在Spring配置檔的SqlSessionFactoryBean
bean加入mapperLocations
屬性如下
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mapperLocations" value="classpath*:idv/matthung/mapper/xml/**/*.xml" />
</bean>
上面設定將會讀取idv.matthung.mapper.xml
package及其子目錄中的全部Mapper xml
檔。
除了用xml mapper,也可以直接在Mapper介面使用Mapper annotation來設定SQL,例如上面UserInfoMapper
可改為如下,如此就不需要xml的mapper檔了。不過xml mapper的功能比較完整,所以還是使用xml mapper來設定比較好。
package idv.matt.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import idv.matthung.model.UserInfo;
public interface UserInfoMapper {
@Results({
@Result(property = "userId", column = "USER_ID"),
@Result(property = "password", column = "PASSWORD"),
@Result(property = "email", column = "EMAIL"),
@Result(property = "name", column = "NAME")
})
@Select("SELECT * FROM USER_INFO")
public List getAll();
}
如果覺得文章有幫助的話還幫忙點個Google廣告,感恩。
參考:
沒有留言:
張貼留言