1.在service层提示Could not autowire. No beans of 'StudenDao
并不能引进Dao接口
在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外其余为空
这是项目整体结构
这是数据库设计
这是相应的实体类
在服务层打印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;
}
}
结果如下:
原因:经过查资料发现mybatis配置文件中默认设置了驼峰转换,在实体类中也必须设置驼峰形式
修改后的实体类
3.2023.4.25最近又碰到数据库映射不到实体类,发现其他更好的方法记录一下
这是实体类
这是数据库表
这次用的是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
@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表示每页显示的数量
整体项目结构
分页插件
<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表格的操作按钮展示不一样
例如管理员:
普通用户:
先用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
配置Main Class 选择你的主启动程序
然后点右侧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>
勾选如下图所示
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;
}
数据库表
原因 ,查出来了,但没有映射到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;
}
}