日常小计,springboot以及mybatis(1)

原因

最近帮助一名同学做一个简单的后台,决定把它写下来。对于mybatis以及spring相关,以后会专门开专题进行描述,也能够帮助我再回顾一遍

准备

数据库:mysql
数据库可视化工具:navicat
开发工具 :eclipse

数据库建表,以及模拟数据

新建数据库

CREATE DATABASE program1;

需求分析

目前的需求是App要显示温度,地址,滞留时间三个数据。那么我们来进行模拟。

idtemperatureaddressleave_time
126.3xx省xx市xx镇3

表的分析

是否满足第一范式

第一范式是列不可分,我们来逐个分析。id是主键,我这里选择的是没有业务含义的主键,不可分满足。temperature 同样不可分,同样的leave_time也不可分,对于address虽然是可分的,分为省市镇,但是个人感觉目前没必要。到后续在调整。

是否满足第二范式

第二范式是每一个字段都必须完全依赖于主码。可以消除部分依赖。根据id,我们可以确定唯一的温度,地址以及时间,所以满足第二范式。

是否满足第三范式

第三范式是当前表中,不能包含其他表中中已经包含的非主键字段信息。即消除传递依赖。因为只有一张表,所以满足第三范式

建表

CREATE TABLE info(
  id INT(11) AUTO_INCREMENT,
	temperature FLOAT(4,2) NOT NULL,
	address VARCHAR(255) NOT NULL,
	leave_time VARCHAR(255),
	CONSTRAINT PK_id PRIMARY KEY(id)
)

查看表结构

在这里插入图片描述

写入模拟数据

INSERT INTO info(temperature,address,leave_time) VALUES (36.2,'一省一市三县','1');
INSERT INTO info(temperature,address,leave_time) VALUES (36.3,'一省二市三县','2');
INSERT INTO info(temperature,address,leave_time) VALUES (36.4,'一省三市三县','3');

查看模拟数据

在这里插入图片描述

mybatis编写

新建maven项目

在这里插入图片描述

书写mybatis配置文件

pom.xml引入依赖

可以参考mybatis官网:链接: mybatis

<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>3.8.1</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<version>1.18.2</version>
			<scope>provided</scope>
		</dependency>
		<!-- mybatis依赖 -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.4.6</version>
		</dependency>
		<!-- mysql数据库依赖 -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.47</version>
		</dependency>
		<!-- 日志依赖包 -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>1.7.12</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>1.7.12</version>
		</dependency>
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.17</version>
		</dependency>
	</dependencies>

新建mybatis配置文件

在这里插入图片描述

修改配置文件

<configuration>
	<properties resource="db.properties" />
	<settings>
		<!-- 设置日志 -->
		<setting value="LOG4J" name="logImpl" />
		<!-- 设置驼峰转换 -->
		<setting value="true" name="mapUnderscoreToCamelCase" />
	</settings>
	<typeAliases >
		<package name="entity"/>
	</typeAliases>
	<environments default="e1">
		<environment id="e1">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="${jdbc.driver}" />
				<property name="url" value="${jdbc.url}" />
				<property name="username" value="${jdbc.username}" />
				<property name="password" value="${jdbc.password}" />
			</dataSource>
		</environment>
	</environments>
	<mappers>
		<package name="mapper"/>
	</mappers>
</configuration>

db.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/program1?useUnicode=true&characterEncoding=utf-8&useSSL=false
jdbc.username=root
jdbc.password=qiao683586890

在这里插入图片描述
Log4j.properties

#全局配置
log4j.rootLogger=DEBUG, stdout
#mybatis日志配置
log4j.logger.mapper=TRACE
#控制台输出配置
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

在这里插入图片描述

新建entity

entity属性名应该与数据库字段名保持一致

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString
public class Info {
	//没用过lombok的可以用工具生成getter以及setter效果是一样的
	private long id;
	private float temperature;
	private String address;
	private String leaveTime;
}

在这里插入图片描述

新建mapper

public interface InfoMapper {
	public List<Info> getAllInfo();
}

在这里插入图片描述

编写sql

两者名称要保持一致,id应该是对应的方法名称,resultType因为设置了别名就写别名,否则应该写类的全限定名称
在这里插入图片描述

为什么需要工具类

为什么需要工具类?我们来看看官方文档
SqlSessionFactoryBuilder
这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。 因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。 你可以重用 SqlSessionFactoryBuilder 来创建多个 SqlSessionFactory 实例,但最好还是不要一直保留着它,以保证所有的 XML 解析资源可以被释放给更重要的事情。

SqlSessionFactory
SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次,多次重建 SqlSessionFactory 被视为一种代码“坏习惯”。因此 SqlSessionFactory 的最佳作用域是应用作用域。 有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。

SqlSession
每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。 绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。 也绝不能将 SqlSession 实例的引用放在任何类型的托管作用域中,比如 Servlet 框架中的 HttpSession。 如果你现在正在使用一种 Web 框架,考虑将 SqlSession 放在一个和 HTTP 请求相似的作用域中。 换句话说,每次收到 HTTP 请求,就可以打开一个 SqlSession,返回一个响应后,就关闭它。 这个关闭操作很重要,为了确保每次都能执行关闭操作,你应该把这个关闭操作放到 finally 块中。 下面的示例就是一个确保 SqlSession 关闭的标准模式:
我们可以看到 sqlsessionfactorybuilder应该设置为局部变量,SQLsessionfactory整个过程只需要用一个

工具类编写

public class MapperUtil {
	private static SqlSessionFactory factory = null;//整个过程只需要一个
	static {
		InputStream inputStream;
		try {
			inputStream = Resources.getResourceAsStream("mybatis-config.xml");
			//SqlSessionFactoryBuilder应该是局部变量
			factory = new SqlSessionFactoryBuilder()
					.build(inputStream);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	public static SqlSession getSession() {
		return factory.openSession();
	}
}

工具类使用

这里使用了自动资源关闭,如果报错可以修改为更高的java版本,不会的也可以使用try catch finally

 @Test
	  public void test(){
	        try(SqlSession openSession = MapperUtil.getSession())
	        {
	        	InfoMapper infoMapper = openSession.getMapper(InfoMapper.class);
	        	List<Info> list =  infoMapper.getAllInfo();
	        	for (Info info : list) {
					System.out.println(info);
				}
	        }
	    }

结果

在这里插入图片描述
可以看到日志以及数据都返回过来了

总结

下一遍日常小计记录springboot的编写

源码

链接: 源码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值