pom.xml引入模块:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency>
application.properties配置数据库:
spring.datasource.url=jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=111111 spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.jpa.properties.hibernate.hbm2ddl.auto=update spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect spring.jpa.show-sql= true
hibernate.hbm2ddl.auto
值对比:
create:每次加载 hibernate 时都会删除上一次的生成的表,然后根据你的 model 类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。
create-drop :每次加载 hibernate 时根据 model 类生成表,但是 sessionFactory 一关闭,表就自动删除。
update:最常用的属性,第一次加载 hibernate 时根据 model 类会自动建立起表的结构(前提是先建立好数据库),以后加载 hibernate 时根据 model 类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等 应用第一次运行起来后才会。
validate :每次加载 hibernate 时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。
dialect
主要是指定生成表名的存储引擎为 InnoDBD;show-sql
是否打印出自动生成的 SQL;
新建数据库demo,建表语句:
DROP TABLE IF EXISTS `tb_user`; CREATE TABLE `tb_user` ( `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, `age` int(11) NULL DEFAULT NULL, `email` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, `nick_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `pass_word` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, `reg_time` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, `user_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, PRIMARY KEY (`id`) USING BTREE, UNIQUE INDEX `UK_mx7woyv2wwr462kfnpdhsfvxa`(`email`) USING BTREE, UNIQUE INDEX `UK_obbnmq5l56ghtreq7gj2ixt10`(`user_name`) USING BTREE, UNIQUE INDEX `UK_qsfr3pppdg879a7n2nfjuyf7h`(`nick_name`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
添加实体类:
package com.example.demo.model; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import java.io.Serializable; @Entity public class UserBean implements Serializable { @Id @GeneratedValue private Long id; //用户名 @Column(nullable = false, unique = true) private String userName; //密码 @Column(nullable = false) private String passWord; //邮箱 @Column(nullable = false, unique = true) private String email; //昵称 @Column(nullable = true, unique = true) private String nickName; //年龄 @Column private int age; //注册时间 @Column(nullable = false) private String regTime; //省略getter settet方法、构造方法 }
编写dao
package com.example.demo.model; import org.springframework.data.jpa.repository.JpaRepository; public interface UserBeanRepository extends JpaRepository<UserBean, Long> { /** * 根据用户名查询用户 * @param userName * @return */ UserBean findByUserName(String userName); /** * 根据用户名或邮箱查询用户 * @param username * @param email * @return */ UserBean findByUserNameOrEmail(String username, String email); }
Entity 中不映射成列的字段得加 @Transient 注解,不加注解也会映射成列!
测试类,切换目录至test/java
package com.example.demo.repository; import com.example.demo.model.UserBean; import com.example.demo.model.UserBeanRepository; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import java.text.DateFormat; import java.util.Date; @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest public class UserRepositoryTests { @Autowired private UserBeanRepository userBeanRepository; @Test public void testSave() throws Exception { Date date = new Date(); DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG); String formattedDate = dateFormat.format(date); userBeanRepository.save(new UserBean("张亮", "13128600812", "1796969389@qq.com", "zhangl", 29, formattedDate)); } @Test public void testFindAll() throws Exception { Assert.assertEquals(1, userBeanRepository.findAll().size()); } @Test public void testFindByUserNameOrEmail() throws Exception { Assert.assertEquals("zhangl", userBeanRepository.findByUserNameOrEmail("张亮", "cc@126.com").getNickName()); } @Test public void testDelete() throws Exception { userBeanRepository.delete(userBeanRepository.findByUserName("aa1")); } }
Springboot 推荐使用 Thymeleaf 来代替 Jsp。Thymeleaf 是一款用于渲染 XML/XHTML/HTML5 内容的模板引擎。类似 JSP,Velocity,FreeMaker 等,它也可以轻易的与 Spring MVC 等 Web 框架进行集成作为 Web 应用的模板引擎。与其它模板引擎相比,Thymeleaf 最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个 Web 应用。
pom.xml引入模块:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
在resources/templates新建index.html页面:
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"></meta> <title>Hello</title> </head> <body> <h1 th:text="${message}">Hello World</h1> </body> </html>
controller跳转到页面:
package com.example.demo.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @Controller public class IndexController { @GetMapping("/index") public String index(Model model){ model.addAttribute("message","张亮"); return "index"; } }
application.properties配置:
spring.thymeleaf.cache=false
测试,启动主程序,浏览器访问http://localhost:8080/index
WebJars 是将客户端(浏览器)资源(JavaScript,Css等)打成 Jar 包文件,以对资源进行统一依赖管理。WebJars 的 Jar 包部署在 Maven 中央仓库上。
pom.xml引入相关模块,WebJars主官网 查找对于的组件,比如 Vuejs
<dependency> <groupId>org.webjars</groupId> <artifactId>vue</artifactId> <version>2.5.16</version> </dependency>
页面引入
<link th:href="@{/webjars/bootstrap/3.3.6/dist/css/bootstrap.css}" rel="stylesheet"></link>