1.在service层提示Could not autowire. No beans of 'StudenDao

并不能引进Dao接口

spring扫描不到xml文件 spring扫描不到service_spring


在dao层加入@Repository注解即可

@Component:这将 java 类标记为 bean。它是任何 Spring 管理组件的通用构造型。spring 的组件扫描机制现在可以将其拾取并将其拉入应用程序环境中。

@Controller:这将一个类标记为 Spring Web MVC 控制器。标有它的 Bean 会自动导入到 IoC 容器中。

@Service:此注解是组件注解的特化。它不会对 @Component 注解提供任何其他行为。您可以在服务层类中使用 @Service 而不是 @Component,因为它以更好的方式指定了意图。

@Repository:这个注解是具有类似用途和功能的 @Component 注解的特化。它为 DAO 提供了额外的好处。它将 DAO 导入 IoC 容器,并使未经检查的异常有资格转换为 Spring DataAccessException。

2.使用springboot时发现Dao层查询出来的sql语句结果除了id外其余为空

这是项目整体结构

spring扫描不到xml文件 spring扫描不到service_System_02

这是数据库设计

spring扫描不到xml文件 spring扫描不到service_spring扫描不到xml文件_03


这是相应的实体类

spring扫描不到xml文件 spring扫描不到service_spring_04


在服务层打印Dao层查询结果

*/
@Service
public class BjServicesImpl implements BjServices {
    @Autowired
    BjDao bjDao;
    @Override
    public List<Zbqk> bj_info_lookall() {
        Map<String,Object> map=new HashMap<>();
        List<Zbqk> list= bjDao.zbqk_look_all();
        System.out.println(list);
        map.put("data",list);
        map.put("count",10000);
        return list;
    }
}

结果如下:

spring扫描不到xml文件 spring扫描不到service_spring扫描不到xml文件_05


原因:经过查资料发现mybatis配置文件中默认设置了驼峰转换,在实体类中也必须设置驼峰形式

修改后的实体类

spring扫描不到xml文件 spring扫描不到service_java_06

3.2023.4.25最近又碰到数据库映射不到实体类,发现其他更好的方法记录一下

这是实体类

spring扫描不到xml文件 spring扫描不到service_java_07


这是数据库表

spring扫描不到xml文件 spring扫描不到service_spring_08


这次用的是mybatis-plus,查询出来的数据赋值不到实体类上

这是因为mybatis默认开启驼峰命名法来映射

必须关掉它的默认驼峰转换,在application.yml文件中配置

map-underscore-to-camel-case: false即可

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    map-underscore-to-camel-case: false

4.spring-boot配置 mybatis-plus记录

1.pom.xml文件引用
记得删掉mybatis的配置,两者可能有冲突

<!--mybatis-plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>

2.MybatisPlusConfig配置
config文件夹下新建MybatisPlusConfig

package com.lmj.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@MapperScan("com.lmj.mapper")  //跟在mapper上用@Mapper注解一样
public class MybatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }

}

3.UserMapper 上配置 extends BaseMapper

spring扫描不到xml文件 spring扫描不到service_spring扫描不到xml文件_09

@Repository
public interface UserMapper extends BaseMapper<User> {

    @Select("select * from zb_user")
    List<User> FindAll();
    }

4.在UserServie上配置extends ServiceImpl<UserMapper,User>

@Service
public class UserService extends ServiceImpl<UserMapper,User> {

    @Autowired
    private UserMapper userMapper;

    public boolean saveUser(User user) {
        return saveOrUpdate(user);  //saveOrUpdate ,mybatis-plus提供的方法,表示插入或更新
    }
 }

5.当后台数据为Timestamp时间戳格式时layui表格时间显示错误

解决方法:自己写一个函数转换

,{field: 'zbBjTime', title: '时间', width:160,templet:function(row){return DateFormat(row.zbBjTime);}}

转换函数

function DateFormat(sjc) {
        var date = new Date(sjc);
        var y = date.getFullYear();
        var m = date.getMonth() + 1;
        m = m < 10 ? '0' + m : m;
        var d = date.getDate();
        d = d < 10 ? ("0" + d) : d;
        var h = date.getHours();
        h = h < 10 ? ("0" + h) : h;
        var min = date.getMinutes();
        min = min < 10 ? ("0" + min) : min;
        var s = date.getSeconds();
        s = s < 10 ? ("0" + s) : s;
        var str = y + "-" + m + "-" + d + " " + h + ":" + min + ":" + s;
        return str;
    }

Tips:之前使用layui自带的小工具layui.util转换时间是发现结果是现在时间并没有用数据库的时间进行转换

6.关于采用PageHelper后台分页

本项目结构直接采用controler——mapper——数据库
相比较之前controler——service——Dao——数据库代码更加简洁

分页的sql语句(本次可以直接查询全部)

select * from zb_bj limit 0,2
//0 表示第一页 2表示每页显示的数量

整体项目结构

spring扫描不到xml文件 spring扫描不到service_intellij-idea_10

分页插件

<dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.2.13</version>
        </dependency>

在controller层调用

try {
            PageHelper.startPage(page,limit);
            //list=bjServices.bj_info_lookall(page,limit);
            list= bjMapper.all_info();
            System.out.println(list);
            PageInfo pageInfo = new PageInfo<>(list);
            System.out.println(pageInfo.toString());
            map.put("data",list);
            map.put("code",0);
            map.put("msg","");
            map.put("count",(int)pageInfo.getTotal());

        }

注意:实体类中的属性必须要和数据库中的拼写一直,不然PageHelper查询的数据为null

7.用mapper查询时报找不到参数

控制层

@RequestMapping("/login")
    public @ResponseBody
    Map login(@RequestBody Map userInfo,HttpSession session){
        System.out.println("用户登录");
        Map<String,Object> map=new HashMap<>();
        int n=0;
        try
        {
            String username=userInfo.get("username").toString();
            String password=userInfo.get("password").toString();
           // String role=userInfo.get("role").toString();
            System.out.println("用户名:"+username+"   "+"密码:"+password+"");
            n=userMapper.userInfoByNameAndPwd(username,password).size();

            if(n>0){
                System.out.println("用户名和密码正确");
                session.setAttribute("username",username);
                session.setAttribute("role",1);
                map.put("code",0);
                //  map.put("username",username);
                map.put("msg","密码正确");
            }else{
                System.out.println("用户名或密码错误");
                map.put("code",1);
                map.put("msg","密码错误");
            }

        }
        catch (Exception ex)
        {
            System.out.println(ex.getMessage());
            map.put("code",1);
            map.put("msg","系统访问异常");
        }
        return map;
    }

UserMapper层

package com.zb_sys.mapper;

import com.zb_sys.entity.User;
import org.apache.ibatis.annotations.Select;
import org.beetl.sql.core.annotatoin.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
 * Created by Administrator on 2021/7/12 21:14
 */
@Repository
public interface UserMapper {
    @Select("select * from zb_user where zb_user_name=#{username} and zb_user_password=#{password}")
    List<User> userInfoByNameAndPwd(@Param("username") String username, @Param("password") String password);
}

报错

nested exception is org.apache.ibatis.binding.BindingException: Parameter 'username' not found. Available parameters are [arg1, arg0, param1, param2]

原因:参数类引用错误
正确参数类

import org.apache.ibatis.annotations.Param;

8.解决使用ifame后退出登录后再次点击相关按钮造成页面无限嵌套问题

解决方法:在login.html的js代码加上

<!-- 解决登录页面嵌套问题 -->
    if (window != top){
        top.location.href = location.href;
    }

7.在IE浏览器中layui日期时间显示NA-NA
IE下的new Date()函数有参数时,需要把时间参数中的“-”替换成“/”才能识别
layui表格代码

,{field: 'zb_bj_time', title: '时间',sort: true, width:180,templet:function(row){return DateFormat(row.zb_bj_time.substring(0,19).replace(/-/ig,"/"))}}

再格式化时间

//格式化时间 yyyy-mm-dd HH:MM:ss
    function DateFormat(d) {
        var date = new Date(d);
        var year = date.getFullYear();
        var mon = (date.getMonth()+1 < 10 ? '0'+(date.getMonth()+1) : date.getMonth()+1);
        var day = (date.getDate() < 10 ? '0'+(date.getDate()) : date.getDate());
        var hou = (date.getHours() < 10 ? '0'+(date.getHours()) : date.getHours());
        var min = (date.getMinutes() < 10 ? '0'+(date.getMinutes()) : date.getMinutes());
        var mils= (date.getSeconds() < 10 ? '0'+(date.getSeconds()) : date.getSeconds());
        return  year + "-" + mon + "-" + day +" "+ hou +":"+min+":"+mils;
    }

9.不同权限layui表格的操作按钮展示不一样

例如管理员:

spring扫描不到xml文件 spring扫描不到service_spring扫描不到xml文件_11


普通用户:

spring扫描不到xml文件 spring扫描不到service_java_12


先用view.addObject在控制层传入session

@RequestMapping("/index/bj_info_list")
    public @ResponseBody
    ModelAndView bj_info_list(HttpSession session){
        ModelAndView view=new ModelAndView("/bj_info/bj_info_list.html");
        view.addObject("role",session.getAttribute("role"));
        return view;
    }

在html页面获取

<script>
 var s_role='${role}';
 </script>

layui表格工具列

,{fixed: 'right', title: '操作',width:240, align:'center',toolbar: '#barDemo'}

工具列具体代码

<script type="text/html" id="barDemo">

    <a class="layui-btn layui-btn-xs" lay-event="look_bj">查看</a>

    {{#  if(s_role=='1'){ }}
    <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="check">处理</a>
    <a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
    <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
    {{#  } }}
</script>

10.layui编辑完成后自动刷新表格不显示提示

需在form.on最后面加入return false;
成功显示提示

form.on('submit(demo11)', function(data) {
        	var y_id=$("#y_id").val();  	
        	var y_name=$("#y_name").val();
        	var y_sort=$("#y_sort").val();
        	var y_num=$("#y_num").val();
        	var y_b_money=$("#y_b_money").val();	
               $.ajax({
                   url:'/work_last2/edit_user',
                   type:'POST',
                   data:{
                	   "id":y_id,
                	   "name":y_name,
                	   "phone_num":y_num,
                	   "sort":y_sort,
                	   "base_money":y_b_money
                  },
                   success:function (data) {
                	   if(data=="ok"){	   
                		   layer.closeAll();  
                		   layer.msg('编辑成功!',{icon:1,time:1000});
                		   table.reload('tableOne',{
                			 page:{
                				 curr:1
                			 }  
                		   });
                   	    	
       				  }else{
       					  layer.alert('编辑错误', {
       							icon: 5,
       							time:3000,
       							title: "提示"
       							});
       					  layer.close(index);
       				  }
                  }
                 })
        	return false;
           });

11.在js中调用layui里定义的函数

layui中定义函数:window.getTime = function (){}

<script>
 setInterval("getTime()", 30000); //隔30秒调用一次方法

    layui.use(['form','element','layer'], function(){
        var element = layui.element;
        function test(){
            layer.alert("用户名和密码不能为空!");
        }
        window.getTime = function (){
            layer.alert('签到', {
                icon: 5,
                title: "提示"
            });
        };
    });
</script>

12.springboot项目运行jar包在windows服务器上启动

pom.xml文件中最后添加

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

配置项目结构

Artifacts->+JAR->From modules with dependencies

spring扫描不到xml文件 spring扫描不到service_spring_13


配置Main Class 选择你的主启动程序

spring扫描不到xml文件 spring扫描不到service_intellij-idea_14


然后点右侧maven–>clean–>package

找到项目文件夹target的打包文件zb_sys-1.0-SNAPSHOT.jar

随便放到文件夹下,管理员进入该目录下的cmd

输入命令

启动jar包

java -jar zb_sys-1.0-SNAPSHOT.jar

13.让div居中显示

margin:0 auto;
第一个参数表示顶部的距离为0,而第二个auto表示的是自动。也就是说,设置这个之后,div会自动根据网页来居中

<div style="width: 1180px;margin:0 auto;"></div>

13layui表格自定义合计行

done: function(res, curr, count){
    //如果是异步请求数据方式,res即为你接口返回的信息。
    //如果是直接赋值的方式,res即为:{data: [], count: 99} data为当前页数据、count为数据总长度
    console.log(res.data);
    var v=parseFloat($('.layui-table-total table td:eq(-3) div').html());
    $('.layui-table-total table td:last div').html(100+v);
}

14.idea热部署

导入插件

<!--热部署-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>

勾选如下图所示

spring扫描不到xml文件 spring扫描不到service_spring_15

15.在@Component中用@Autowired注入mapper时报错为null

@Component注解标注的Bean中,通过@Autowired或@Resource注解注入Mapper接口时,会出现Mapper接口是null的情况
例如

@Slf4j
@Component
public class EPServerHandler extends ChannelInboundHandlerAdapter {
	@Autowired
    private MsgMapper msgMapper;
  }

在使用msgmapper.addmsg()方法时会报错为null,因为mapper没有注入进去
解决:
使用set方法注入

@Component
public class EPServerHandler extends ChannelInboundHandlerAdapter {

    private static MsgMapper msgMapper;
    @Autowired
    public void setMsgMapper(MsgMapper msgMapper){
        EPServerHandler.msgMapper=msgMapper;
    }

16数据库字段为json时,mybatis-plus映射实体类为null

实体类

package com.dhj.hj212.entity;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import lombok.Data;
import org.apache.ibatis.type.ObjectTypeHandler;
import org.springframework.stereotype.Repository;

import java.util.Map;

//开启自动生成 resultMap
@Data
@TableName(value = "t_data",autoResultMap = true)
public class Message {

    @TableId(type = IdType.AUTO)
    private Integer id;
    private String ST;
    private String MN;
    private String SIZE;
    private String PW;
    private String End;
    private String Flag;

    @TableField(typeHandler = JacksonTypeHandler.class)
    private Map<String,Object> CP_data_json;

}

数据库表

spring扫描不到xml文件 spring扫描不到service_System_16


原因 ,查出来了,但没有映射到Map上,将其改成String或者JSONObject 可映射到

@TableField(typeHandler = JacksonTypeHandler.class)
private String CP_data_json;
或者
@TableField(typeHandler = JacksonTypeHandler.class)
private JSONObject CP_data_json;

17数据库字段为datetime时,映射的实体类的正确格式

在实体类的属性上加上如下注解即可

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
      @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
      private Date alarm_time;

最后得出正确格式"alarm_time": “2023-06-20 19:46:08”,

18在静态工具类中使用mybatis的mapper对象为空

和15条类似
mapper对象的注入一般在controller层
但是数据库的操作不一定只限于controller类中,如果我在普通java工具类中需要操作数据库,那我们直接注入,会报空指针异常
原因是:当类加载器加载静态变量时,Spring上下文尚未加载。所以类加载器不会在bean中正确注入静态类,并且会失败
解决的方法:

@Component
public class TokenUtil {
 
    @Autowired
    private  LoginMapper loginMapper;
 
    private static TokenUtil tokenUtil;
 
    @PostConstruct
    public void init() {
        tokenUtil = this;
        tokenUtil.loginMapper = this.loginMapper;
    }
 
    public static boolean queryToken(String token){
        int queryToken = tokenUtil.loginMapper.queryToken(token);
        if (queryToken > 0)
            return true;
        else
            return false;
 
    }
}