使用Mybatis在Spring中操作MySQL数据库
创建Mybatis配置文件:
<?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>
<typeAliases>
<typeAlias type="com.qunhe.scm.daemon.consisthash.DaemonNode" alias="DaemonNode"/>
<package name="com.qunhe.scm.data"/>
</typeAliases>
</configuration>
修改Spring的配置文件:
主要是添加SqlSession的制作工厂类的bean:SqlSessionFactoryBean,(在mybatis.spring包中)。需要指定配置文件位置和dataSource。
和数据访问接口对应的实现bean。通过MapperFactoryBean创建出来。需要执行接口类全称和SqlSession工厂bean的引用。
<!-- 导入属性配置文件 -->
<context:property-placeholder location="classpath:mysql.properties" />
<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="root"/>
<property name="password" value="××××××××"/>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<property name="mapperLocations">
<list>
<value>classpath:*.xml</value>
</list>
</property>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="path.to.mapper"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
之后创建实体类:
public class DaemonNode {
private String mHostName;
private String mIp;
public String getIp() {
return mIp;
}
public void setIp(final String ip) {
mIp = ip;
}
public String getHostName() {
return mHostName;
}
public void setHostName(final String hostName) {
mHostName = hostName;
}
}
创建数据访问接口:
public interface BackendNodeMapper {
/**
* produce a heartbeat
*
* @param daemonNode
* @return
*/
int insertBackendNode(DaemonNode daemonNode);
/**
* Query if host is alive
*
* @return
*/
List<Integer> queryAliveHost();
/**
* Query all host
*
* @return
*/
List<DaemonNode> queryAllHost();
}
创建数据访问的XML文件:
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.1//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace=".BackendNodeMapper">
<insert id="insertBackendNode" parameterType="DaemonNode"
useGeneratedKeys="true" keyColumn="id" keyProperty="id">
INSERT INTO BackendNode (
hostname,
ip,
lastheartbeat
) VALUES (
#{hostName},
#{ip},
NOW()
) ON DUPLICATE KEY UPDATE lastheartbeat = NOW()
</insert>
<select id="queryAliveHost" resultType="java.lang.Integer">
SELECT TIMESTAMPDIFF(SECOND, lastheartbeat, NOW()) FROM BackendNode
WHERE TIMESTAMPDIFF(SECOND, lastheartbeat, NOW()) < 10
</select>
<select id="queryAllHost" resultType="DaemonNode">
SELECT
hostname AS hostName,
ip AS ip
FROM BackendNode
ORDER BY id
</select>
</mapper>
接下来只需要在程序中使用@Autowired
注解声明接口BackendNode的成员变量,mybatis会实现该接口,直接调用该对象即可完成对MySQL的操作
有一点需要注意的是:@Autowired操作在装载类,即执行类的构造函数之后,因此不能在构造函数中调用接口对象,会产生NullPoint异常。