1. 程式人生 > >Java遊戲伺服器開發之十二--資料庫連線整合mybatis

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