Sptingboot+Mybatis+thymeleaf的登录和增删改查

一直在学习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下的


image.png

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




这样整个的系统就完事了。

你可能感兴趣的:(Sptingboot+Mybatis+thymeleaf的登录和增删改查)