一直在学习Springboot
从开始的建立框架,然后用假数据,然后连接数据库。
算是把前台后台简单的传值和登录写出来了
记录一下。
首先创建数据库
因为做的比较简单
所以并没有做复杂的数据库
建了一个User的数据库
create Database orm
user orm
create table orm_user(
id integer primary key,
username NVARCHAR(200),
password NVARCHAR(200),
nicknme NVARCHAR(200)
)
创建一个表之后,直接可以生成对应的dao和xml也就是没有实现类了。
用一个软件就可以直接生成了
需要配置软件的xml
然后cmd生成语句,直接就可以生成相应的dao类文件和实体类User文件了
java -jar mybatis-generator-core-1.3.2.jar -configfile generator.xml -overwrite
自动生成User类如下
package com.yun.orm.pc.user.domain;
/**
* 用户
*
* Created by 周子淏 on 2018/4/9 17:11
*/
public class User {
/**
* 1.主键
*/
private Integer id;
/**
* 2.用户名
*/
private String username;
/**
* 3.密码
*/
private String password;
/**
* 4.昵称
*/
private String nickname;
public User(Integer id, String username, String password, String nickname) {
this.id = id;
this.username = username;
this.password = password;
this.nickname = nickname;
}
public User() {
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username == null ? null : username.trim();
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password == null ? null : password.trim();
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname == null ? null : nickname.trim();
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", nickname='" + nickname + '\'' +
'}';
}
}
然后xml中是会自动生成方法的。
但是因为要写增删改查 所以方法都自己删了重写了一下。
具体的DAO类如下
package com.yun.orm.pc.user.dao;
import com.yun.orm.pc.user.domain.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Component;
import java.util.List;
@Mapper
@Component
public interface IUserDao {
/**
* 1.插入
*/
int insert(User user);
/**
* 2.全部
*/
List list();
/**
* 3.修改
*/
int update(User user);
/**
* 4.删除
*/
int delete(User user);
/**
* 5.根据id查询
*/
User getById(int id);
/**
* 6.登录
*/
User loadByUsernameAndPassword(@Param("user") User user);
}
然后对应的xml如下
insert into orm_user
(username,
password,
nickname)
values (#{username,jdbcType=NVARCHAR},
#{password,jdbcType=NVARCHAR},
#{nickname,jdbcType=NVARCHAR})
update orm_user
set username = #{username,jdbcType=NVARCHAR},
password = #{password,jdbcType=NVARCHAR},
nickname = #{nickname,jdbcType=NVARCHAR}
where id = #{id,jdbcType=INTEGER}
delete from orm_user
where id = #{id,jdbcType=INTEGER}
需要配置几个文件 这是在config下的
MasterDataSourceConfig类
package com.yun.orm.config.ds;
import com.yun.orm.config.properties.MasterDataSourceProperties;
import com.yun.orm.config.utils.MyUtils;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import javax.annotation.Resource;
import javax.sql.DataSource;
/**
* 主数据源配置文件
*
* Created by 周子淏 on 2018/4/9 16:39
*/
@Configuration
// 扫描 Mapper 接口并容器管理
@MapperScan(basePackages = {MasterDataSourceConfig.PACKAGE1}, sqlSessionFactoryRef = MasterDataSourceConfig.NAME + "SqlSessionFactory")
public class MasterDataSourceConfig {
@Resource
private MasterDataSourceProperties masterDataSourceProperties;
// 精确到 master 目录,以便跟其他数据源隔离
//dao目录
static final String PACKAGE1 = "com.yun.orm.pc.*.dao";
//xml目录
private static final String mapperLocation1 = "classpath:com/yun/orm/pc/*/dao/*.xml";
private static final String[] mapperLocations = {mapperLocation1};
//全局名字前缀
static final String NAME = "master";
//数据源
@Bean(name = NAME + "DataSource")
@Primary
public DataSource dataSource() {
return MyUtils.getDruidDataSource(
masterDataSourceProperties.getDriverClassName(),
masterDataSourceProperties.getUrl(),
masterDataSourceProperties.getUsername(),
masterDataSourceProperties.getPassword());
}
//事务管理器
@Bean(name = NAME + "TransactionManager")
@Primary
public PlatformTransactionManager transactionManager() {
return new DataSourceTransactionManager(dataSource());
}
//工厂
@Bean(name = NAME + "SqlSessionFactory")
@Primary
public SqlSessionFactory sqlSessionFactory(@Qualifier(NAME + "DataSource") DataSource dataSource) throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
sessionFactory.setMapperLocations(MyUtils.resolveMapperLocations(mapperLocations));
return sessionFactory.getObject();
}
}
MasterDataSourceProperties类
package com.yun.orm.config.properties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* 主数据源属性文件-本地sql server
*
* Created by 周子淏 on 2018/4/9 16:32
*/
@Component
@ConfigurationProperties(prefix = "spring.datasource.master")
public class MasterDataSourceProperties {
private String driverClassName;
private String url;
private String username;
private String password;
public String getDriverClassName() {
return driverClassName;
}
public void setDriverClassName(String driverClassName) {
this.driverClassName = driverClassName;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
MyUtils类
package com.yun.orm.config.utils;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* 工具类
*
* Created by 周子淏 on 2018/4/9 16:41
*/
public class MyUtils {
public static DruidDataSource getDruidDataSource(String driverClassName, String url, String username, String password) {
DruidDataSource dataSource = new DruidDataSource();
//这一项可配可不配,如果不配置druid会根据url自动识别dbType,然后选择相应的driverClassName
dataSource.setDriverClassName(driverClassName);
//连接数据库的url
dataSource.setUrl(url);
//连接数据库的用户名
dataSource.setUsername(username);
//连接数据库的密码
dataSource.setPassword(password);
//初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时
dataSource.setInitialSize(1);
//最小连接池数量
dataSource.setMinIdle(1);
//最大连接池数量
dataSource.setMaxActive(20);
//获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。
dataSource.setMaxWait(1000);
return dataSource;
}
/**
* org.mybatis.spring.boot.autoconfigure包下MybatisProperties里面的方法直接拿来用
*
* @param mapperLocations xml路径数组
* @return 资源数组
*/
public static Resource[] resolveMapperLocations(String[] mapperLocations) {
ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();
List resources = new ArrayList();
if (mapperLocations != null) {
String[] var3 = mapperLocations;
int var4 = var3.length;
for (int var5 = 0; var5 < var4; ++var5) {
String mapperLocation = var3[var5];
try {
Resource[] mappers = resourceResolver.getResources(mapperLocation);
resources.addAll(Arrays.asList(mappers));
} catch (IOException var8) {
;
}
}
}
return resources.toArray(new Resource[resources.size()]);
}
}
新建一个application.yml
spring:
datasource:
master:
driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
url: jdbc:sqlserver://localhost:1433;DatabaseName=orm
username: sa
password: sqlserver
meavn中的配置如下,用的是阿里巴巴的数据源。
4.0.0
com.yun
orm
0.0.1-SNAPSHOT
jar
orm
orm project for Spring Boot
org.springframework.boot
spring-boot-starter-parent
2.0.1.RELEASE
UTF-8
UTF-8
1.8
org.springframework.boot
spring-boot-starter-thymeleaf
org.springframework.boot
spring-boot-starter-web
org.mybatis.spring.boot
mybatis-spring-boot-starter
1.3.2
com.microsoft.sqlserver
mssql-jdbc
runtime
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-configuration-processor
true
com.alibaba
druid
1.1.9
org.springframework.boot
spring-boot-maven-plugin
src/main/java
**/*.xml
true
我在dao中一共声明了6个方法。
package com.yun.orm.pc.user.dao;
import com.yun.orm.pc.user.domain.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Component;
import java.util.List;
@Mapper
@Component
public interface IUserDao {
/**
* 1.插入
*/
int insert(User user);
/**
* 2.全部
*/
List list();
/**
* 3.修改
*/
int update(User user);
/**
* 4.删除
*/
int delete(User user);
/**
* 5.根据id查询
*/
User getById(int id);
/**
* 6.登录
*/
User loadByUsernameAndPassword(@Param("user") User user);
}
具体作用已经备注了。
然后特别说一下第6个。
@Param这是传参的一种办法。
DAO层传参 不仅仅是单纯的String Int
需要加上@Param
这样参数才可以传到.xml文件中。
然后是xml中的方法
package com.yun.orm.pc.user.service;
import com.yun.orm.pc.user.domain.User;
import java.util.List;
/**
* Created by 周子淏 on 2018/4/10 8:56
*/
public interface IUserService {
/**
* 1.插入
*/
int insert(User user);
/**
* 2.全部
*/
List list();
/**
* 3.修改
*/
int update(User user);
/**
* 4.删除
*/
int delete(User user);
/**
* 5.根据id查询
*/
User getById(int id);
/**
* 6.登录
*/
Boolean isLogin(User user);
}
这里基本前边的方法和dao层调用的方法是一样的,只有最后一个判断登录的使用的是boolean的返回值,这里对于登录的判断是通过用户名和密码来查找用户是否存在,然后来判断登录是否成功。开始是想用根据用户名来查询密码这种方法,但是很明显时有弊端的,直接通过true false来对登录进行判断。
然后是service的实现类
package com.yun.orm.pc.user.service;
import com.yun.orm.pc.user.dao.IUserDao;
import com.yun.orm.pc.user.domain.User;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* Created by 周子淏 on 2018/4/10 8:57
*/
@Service
public class UserServiceImpl implements IUserService {
@Resource
private IUserDao userDao;
@Override
public int insert(User user) {
return userDao.insert(user);
}
@Override
public List list() {
return userDao.list();
}
@Override
public int update(User user) {
return userDao.update(user);
}
@Override
public int delete(User user) {
return userDao.delete(user);
}
@Override
public User getById(int id) {
return userDao.getById(id);
}
/**
* 6.登录
*/
@Override
public Boolean isLogin(User user) {
User user1 = userDao.loadByUsernameAndPassword(user);
if (user1 == null) {
return false;
}
return true;
}
}
这样后台的方法基本写完了 ,可以在test写几个测试类测试一下。
连接前台的话,就需要controller了。
package com.yun.orm.pc.user.web;
import com.yun.orm.pc.user.domain.User;
import com.yun.orm.pc.user.service.IUserService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.xml.ws.Response;
/**
* Created by 周子淏 on 2018/4/10 9:01
*/
@Controller
@RequestMapping("/user")
public class UserController {
@Resource
public IUserService userService;
@GetMapping("/index")
public String getUsers(Model model) {
/* List userList=new ArrayList<>();*/
model.addAttribute("userList", userService.list());
return "/user/index";
}
@GetMapping("/add")
public String addNetClasses(Model model) {
model.addAttribute("userList", new User());
return "/user/add";
}
@PostMapping("/add")
public String addNetClasses(User user) {
userService.insert(user);
return "redirect:index";
}
@GetMapping("/{id}/update")
public String update(@PathVariable("id") Integer id, Model model) {
model.addAttribute("user", userService.getById(id));
System.out.println(id);
return "/User/update";
}
@PostMapping("/update")
public String update(User user) {
userService.update(user);
return "redirect:/user/index";
}
@GetMapping("/{id}/delete")
public String delete(@PathVariable("id") Integer id, User user, Model model) {
userService.delete(user);
return "redirect:/user/index";
}
@GetMapping("/login")
public String login(Model model) {
model.addAttribute("userList", new User());
return "/user/login";
}
@PostMapping("/login")
public String login(User user) {
Boolean isLogin = userService.isLogin(user);
if (isLogin) {
return "redirect:/user/index";
} else {
return "redirect:/user/login";
}
}
/* @PostMapping("/login")
public String login(User user, HttpServletRequest request, HttpSession session){
String username = request.getParameter("username");
String password = request.getParameter("password");
user=userService.login(username,password);
if (user!=null){
return "/user/index";
}
else{
session.setAttribute("error","账号或者密码错误,请重新输入!");
}
return "/user/login";
}*/
}
controller的配置之前也写过很多了。对应着不同的方法。
controller写好后,在前台对应上就行了。
先写的是登录
要达到的效果是,首先登录,然后登录后到index界面可以看到所有信息,
点击新增可以添加信息。添加后返回主页,然后点击修改、删除都可以完成相应操作。
- login.html
具体的代码如下
Title
欢迎登录
修改
删除
*add.html
Title
update.html
Title
好的
delete.html
Title
这样整个的系统就完事了。