Spring Cloud微服务实战---1.3.使用Mysql数据库

11 篇文章 1 订阅
11 篇文章 0 订阅

在本节中,我们将在前一节微服务的基础上,将数据库从内存数据库H2,转换为我们在项目中经常使用的Mysql,同时我们将采用普通的增删改操作采用JPA,复杂多表查询直接使用JDBC的方式。
我们首先来设置Mysql数据库,我们首先建立数据库和用户,如下所示:

create database MseDb default character set utf8 collate utf8_general_ci;
grant all privileges on MseDb.* to 'mse'@'localhost' identified by 'mse2018';
grant all privileges on MseDb.* to 'mse'@'%' identified by 'mse2018';

在这里我们创建两个表,一个是产品类别表,另一个是产品表。我们先来看产品类别表,如下所示:

create table t_product_category(
product_category_id int primary key auto_increment,
product_category_name varchar(200)
);
insert into t_product_category(product_category_name) values('类别1');

产品表如下所示:

create table t_product(
product_id bigint primary key auto_increment,
product_category_id int,
product_name varchar(200),
image_url varchar(200),
price double,
quantity int,
index fk_p_pc1(product_category_id),
foreign key (product_category_id )  
references t_product_category(product_category_id)
);

我们需要在项目中引入Mysql驱动程序,编辑项目根目录下的pom.xml文件,在依赖中添加如下代码:

......
		<dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
......

另外,我们还需要配置Mysql的字符集,修改Mysql的配置文件my.ini,添加:

character-set-server = utf8

在Windows平台下,其他项如果是gbk也不用更改,仅改这一项即可。
因为我们的类名和变量名都是采用驼峰命名法,而数据库中无论表名还是字段名,均是下划线开头,因此我们需要二者之间进行转换,如下所示:

public class StringUtils {
	/**
	 * 转换为下划线
	 * 
	 * @param camelCaseName
	 * @return
	 */
	public static String underscoreName(String camelCaseName) {
		StringBuilder result = new StringBuilder();
		if (camelCaseName != null && camelCaseName.length() > 0) {
			result.append(camelCaseName.substring(0, 1).toLowerCase());
			for (int i = 1; i < camelCaseName.length(); i++) {
				char ch = camelCaseName.charAt(i);
				if (Character.isUpperCase(ch)) {
					result.append("_");
					result.append(Character.toLowerCase(ch));
				} else {
					result.append(ch);
				}
			}
		}
		return result.toString();
	}
 
	/**
	 * 转换为驼峰
	 * 
	 * @param underscoreName
	 * @return
	 */
	public static String camelCaseName(String underscoreName) {
		StringBuilder result = new StringBuilder();
		if (underscoreName != null && underscoreName.length() > 0) {
			boolean flag = false;
			for (int i = 0; i < underscoreName.length(); i++) {
				char ch = underscoreName.charAt(i);
				if ("_".charAt(0) == ch) {
					flag = true;
				} else {
					if (flag) {
						result.append(Character.toUpperCase(ch));
						flag = false;
					} else {
						result.append(ch);
					}
				}
			}
		}
		return result.toString();
	}
}

同时我们在数据库中,希望用例如t_前缀来命名数据库表,因此我们需要定义一个数据库物理名称命名策略类,如下所示:

import com.wkyai.mse.utils.StringUtils;

public class MseJpaNamingStrategy extends PhysicalNamingStrategyStandardImpl {
	public final static String DB_PREFIX = "t_";

	@Override
	public Identifier toPhysicalCatalogName(Identifier name, JdbcEnvironment jdbcEnvironment) {
		// TODO Auto-generated method stub
		return super.toPhysicalCatalogName(name, jdbcEnvironment);
	}

	@Override
	public Identifier toPhysicalSchemaName(Identifier name, JdbcEnvironment jdbcEnvironment) {
		// TODO Auto-generated method stub
		return super.toPhysicalSchemaName(name, jdbcEnvironment);
	}

	@Override
	public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment jdbcEnvironment) {
		if (name != null) {
			return Identifier.toIdentifier(DB_PREFIX + name.toString().toUpperCase());
		}
		return null;
	}

	@Override
	public Identifier toPhysicalSequenceName(Identifier name, JdbcEnvironment jdbcEnvironment) {
		// TODO Auto-generated method stub
		return super.toPhysicalSequenceName(name, jdbcEnvironment);
	}

	@Override
	public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment jdbcEnvironment) {
		if (name.toString().equals("DTYPE")) {
			return super.toPhysicalColumnName(name, jdbcEnvironment);
		}
		if (name != null) {
			return Identifier.toIdentifier(StringUtils.underscoreName(name.toString()));
		}
		return null;
	}
}

在上面的代码中,toPhysicalTableName方法是将类名改为下划线命名后,再在其前加上数据库表名前缀。toPhysicalColumnName则是将属性名改为下划线命名方式,同时如果是DTYPE,则不作任何处理。
我们还需要在application.properties文件中配置命名策略,因此Mysql的配置如下所示:

spring.jpa.hibernate.ddl-auto=none
spring.datasource.url=jdbc:mysql://localhost:3306/MseDb?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&characterEncoding=utf-8
spring.datasource.username=mse
spring.datasource.password=mse2018
spring.jpa.hibernate.naming.physical-strategy=com.wkyai.mse.common.MseJpaNamingStrategy

经过上述配置之后,我们的Spring Boot服务就可以使用Mysql数据库了。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值