Java遊戲伺服器開發之十二--資料庫連線整合mybatis
應該比較讓人關心的還有一個就是資料儲存的問題了。
下面將會介紹連線資料庫的相關內容
使用的是mysql資料庫,框架中將使用mybatis
這裡介紹時假設各位都使用或者瞭解過mysql。
1.在pom中新增相關包
2.建立資料庫和表
3.建立對映實體類entity與資料庫操作物件Dao
4.建立對映檔案mapper.xml
5.在spring中配置mybatis
6.呼叫Dao進行測試
1.在pom中新增相關包
<!-- mybatis orm包 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.3.0</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>org.mybatis.caches</groupId> <artifactId>mybatis-ehcache</artifactId> <version>1.0.3</version> </dependency> <dependency> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.1-api</artifactId> <version>1.0.0.Final</version> </dependency> <!-- mysql資料庫驅動包 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.38</version> </dependency> <!-- 資料庫連線池druid包 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.16</version> </dependency>
2.建立資料庫和表
建立jg_server,選擇utf8的編碼
建立user表,裡面就是個欄位,id/name/account/password
插入一條測試資料
具體的sql語句如下
/*
SQLyog 企業版 - MySQL GUI v8.14
MySQL - 5.6.26-log : Database - jg_server
*********************************************************************
*/
/*!40101 SET NAMES utf8 */;
/*!40101 SET SQL_MODE=''*/;
/*!40014 SET @ [email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @[email protected]@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @[email protected]@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`jg_server` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `jg_server`;
/*Table structure for table `user` */
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(128) DEFAULT '-',
`account` varchar(32) DEFAULT '-',
`password` varchar(32) DEFAULT '-',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 CHECKSUM=1 ROW_FORMAT=DYNAMIC;
/*Data for the table `user` */
insert into `user`(`id`,`name`,`account`,`password`) values (1,'2','3','4');
/*!40101 SET [email protected]_SQL_MODE */;
/*!40014 SET [email protected]_FOREIGN_KEY_CHECKS */;
/*!40014 SET [email protected]_UNIQUE_CHECKS */;
/*!40111 SET [email protected]_SQL_NOTES */;
3.建立對映實體類entity與資料庫操作物件Dao
與user表對應,類名使用User,別名也使用這個
UserDao裡面就寫一個方法,獲取全部的表資料
User
/*
* Copyright (C), 2015-2018
* FileName: User
* Author: zhao
* Date: 2018/6/28 14:31
* Description: 使用者表
* History:
* <author> <time> <version> <desc>
* 作者姓名 修改時間 版本號 描述
*/
package com.lizhaoblog.server.biz.entity;
import org.apache.ibatis.type.Alias;
import javax.persistence.Column;
import javax.persistence.Id;
import javax.persistence.Table;
/**
* 〈一句話功能簡述〉<br>
* 〈使用者表對應的實體類〉
*
* @author zhao
* @date 2018/6/28 14:31
* @since 1.0.0
*/
@Table(name = "user")
@Alias("User")
public class User {
@Id
@Column(name = "id")
private Integer id;
@Column(name = "name")
private String name;
@Column(name = "account")
private String account;
@Column(name = "password")
private String password;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
UserDao
/*
* Copyright (C), 2015-2018
* FileName: UserDao
* Author: zhao
* Date: 2018/6/28 14:37
* Description: User表資料處理
* History:
* <author> <time> <version> <desc>
* 作者姓名 修改時間 版本號 描述
*/
package com.lizhaoblog.server.biz.dao.mysql;
import com.lizhaoblog.server.biz.entity.User;
import org.apache.ibatis.annotations.CacheNamespaceRef;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.ResultMap;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* 〈一句話功能簡述〉<br>
* 〈User表資料處理 〉
*
* @author zhao
* @date 2018/6/28 14:37
* @since 1.0.0
*/
@CacheNamespaceRef(UserDao.class)
public interface UserDao {
@Select("SELECT * FROM user")
@ResultMap("resultMap")
@Options(useCache = false)
List<User> listUser();
}
5.建立對映檔案mapper.xml
我們直接使用 類名.xml的方式,然後寫一個resultMap
resources--mybatis--jpa中新增User.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.lizhaoblog.server.biz.dao.mysql.UserDao">
<cache type="org.mybatis.caches.ehcache.LoggingEhcache"/>
<resultMap type="com.lizhaoblog.server.biz.entity.User" id="resultMap">
<result property="id" column="id"/>
<result property="name" column="name"/>
<result property="account" column="account"/>
<result property="password" column="password"/>
</resultMap>
</mapper>
4.spring中配置mybatis
在resources--mybatis中新增一個mybatis-config.xml
資料庫連線池的配置,在resources--properties新增db-config-dev.properties
在ApplicationContext.xml的同級目錄新增一個ApplicationContext-mysql.xml
修改ApplicationContext.xml
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD SQL Map Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<!--<setting name="cacheEnabled" value="true"/><!– 全域性對映器啟用快取 –>-->
<setting name="defaultExecutorType" value="REUSE"/>
</settings>
</configuration>
db-config-dev.properties
mysql.url:jdbc:mysql://localhost:3306/jg_server?useUnicode=true&characterEncoding=UTF-8
mysql.driverClassName:com.mysql.jdbc.Driver
#mysql.username:root
#mysql.password:admin
mysql.username:adminjg
mysql.password:admin666
filters:stat
maxActive:20
initialSize:1
maxWait:60000
minIdle:10
maxIdle:15
timeBetweenEvictionRunsMillis:60000
minEvictableIdleTimeMillis:300000
validationQuery:SELECT 'x'
testWhileIdle:true
testOnBorrow:false
testOnReturn:false
maxOpenPreparedStatements:20
removeAbandoned:true
removeAbandonedTimeout:1800
logAbandoned:true
ApplicationContext-mysql.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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-4.2.xsd">
<bean name="mysqlTransactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="mysqlDs"></property>
<qualifier value="mysql"/>
</bean>
<!-- 阿里 druid資料庫連線池 -->
<bean id="mysqlDs" class="com.alibaba.druid.pool.DruidDataSource"
destroy-method="close">
<!-- 資料庫基本資訊配置 -->
<property name="url" value="${mysql.url}"/>
<property name="username" value="${mysql.username}"/>
<property name="password" value="${mysql.password}"/>
<property name="driverClassName" value="${mysql.driverClassName}"/>
<property name="filters" value="${filters}"/>
<!-- 最大併發連線數 -->
<property name="maxActive" value="${maxActive}"/>
<!-- 初始化連線數量 -->
<property name="initialSize" value="${initialSize}"/>
<!-- 配置獲取連線等待超時的時間 -->
<property name="maxWait" value="${maxWait}"/>
<!-- 最小空閒連線數 -->
<property name="minIdle" value="${minIdle}"/>
<!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閒連線,單位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="${timeBetweenEvictionRunsMillis}"/>
<!-- 配置一個連線在池中最小生存的時間,單位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="${minEvictableIdleTimeMillis}"/>
<property name="validationQuery" value="${validationQuery}"/>
<property name="testWhileIdle" value="${testWhileIdle}"/>
<property name="testOnBorrow" value="${testOnBorrow}"/>
<property name="testOnReturn" value="${testOnReturn}"/>
<property name="maxOpenPreparedStatements" value="${maxOpenPreparedStatements}"/>
<!-- 開啟removeAbandoned功能 -->
<property name="removeAbandoned" value="${removeAbandoned}"/>
<!-- 1800秒,也就是30分鐘 -->
<property name="removeAbandonedTimeout" value="${removeAbandonedTimeout}"/>
<!-- 關閉abanded連線時輸出錯誤日誌 -->
<property name="logAbandoned" value="${logAbandoned}"/>
</bean>
<!-- 配置mybatis -->
<bean id="mysqlSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="mysqlDs"/>
<property name="configLocation" value="classpath:mybatis/mybatis-config.xml"></property>
<property name="typeAliasesPackage" value="com.lizhaoblog"></property>
<!--<property name="typeAliasesSuperType" value="com.lizhaoblog.server.biz.Entity"></property>-->
<!-- mapper掃描 -->
<property name="mapperLocations" value="classpath:mybatis/*/*.xml"></property>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.lizhaoblog.server.biz.dao.mysql"></property>
<property name="sqlSessionFactoryBeanName" value="mysqlSqlSessionFactory"></property>
</bean>
</beans>
修改ApplicationContext.xml
<import resource="ApplicationContext-mysql.xml"/>
<!--指向的配置檔案-->
<bean id="cfgProps" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="locations">
<list>
<value>classpath:properties/server-config-dev.properties</value>
<value>classpath:properties/db-config-dev.properties</value>
</list>
</property>
</bean>
6.呼叫Dao進行測試
在handler裡面注入UserDao,然後呼叫list方法
@Autowired
private UserDao userDao;
List<User> myAll = userDao.listUser();
上面的程式碼在碼雲上 https://gitee.com/lizhaoandroid/JgServer
可以加qq群一起探討Java遊戲伺服器開發的相關知識 676231564