全部 文章 问答 分享 共找到27个相关内容
[问答] MyBatis / Spring Data JPA



Spring Data JPA 、是看康师傅的博客系统才知道的


Mybatis plus 看到好像好多人用,我也不知道好在哪

2022-03-28 09:43 · JDBC / JPA / Mybatis
[文章] jdbcTemplate 与 JPA 混合事务的尝试
jdbcTemplate与JPA混合事务问题阐述简单的场景示例如下:需求:修改学生的姓名和年龄。
2022-09-27 11:09 · Java / Spring / JPA / 事务
[文章] JPA返回自定义对象
jpa执行原生sql,返回自定义对象我之前是用mybatis-plus的,虽然看了康师傅的博客系统的课程,学到了JPA,但是视频中康师傅没有怎么讲到自定义对象返回前端,视频中只讲到一个表字段的返回。
2021-09-17 19:14 · java / jpa
[问答] 后端系统课程中遇到的问题,使用Springboot jpa后无法访问数据库

开始跟着学习的时候一切正常,能够访问数据库,也可以使用课程中提到的测试工具等等,但是在第二十课时添加了jpa后,连接数据库失败,显示报错Access denied for user: 'root@

2021-09-02 20:28 · 后端
[问答] SpringDate jpa 查询部分字段,报错Modifying method must not ...
atorg.springframework.util.Assert.isTrue(Assert.java:121)atorg.springframework.data.jpa.repository.query.JpaQueryMethod
2020-11-22 16:36 · 阳光沙滩博客 / SpringDateJpa
[文章] JavaWeb博客系统后端-创建对应的DAO
创建各个数据表的dao我们前面添加的依赖是spring的jpa,但是同学们在学校里学的应该是myBatis,SSM嘛,springmvc、spring、mybatis。
2020-01-25 17:29 · dao / 数据库 / web / 博客系统 / 后台
[问答] 怎么封装一个返回对象呢?

jpa联表查询时,自定义返回vo对象报org.springframework.core.convert.ConverterNotFoundException: No converter

2021-09-17 15:21 · jpa / java
[文章] 阳光沙滩博客系统连接Mysql数据库
gt;<groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa
2020-06-17 15:32 · mysql / jpa / spring / 数据库 / 配置
[问答] 阳光沙滩博客系统第二课用脚本生成bean类后运行后出现错误
Errorcreatingbeanwithname'entityManagerFactory'definedinclasspathresource[org/springframework/boot/autoconfigure/orm/jpa
2020-06-23 23:59 · 阳光沙滩博客系统
[问答] @Query(nativeQuery = true 报错
]incontextwithpath[]threwexception[Requestprocessingfailed;nestedexceptionisorg.springframework.orm.jpa.JpaSystemException
2020-08-10 20:31 · springboot / jpa报错
[问答] userdao遇到问题
packagenet.sunofbeach.blog.dao;importnet.sunofbeach.blog.pojo.SobUser;importorg.springframework.data.jpa.repository.JpaRepository
2020-07-18 14:26 · spring
[文章] spring data jpa 多表操作之多对多
springdatajpa多表操作之多对多前面我们学习了多表操作之一对多SpringDataJPA多表关系之一对多接下来我们看看多对多什么情况下有多对多关系呢?比如说用户和角色一个用户可以有多个角色吧,比如说你是管理员,又是审查员,又是VIP用户,又是讲师,对吧。一个角色也可以对应多个用户,比如说讲师,可以是张三,也可以是赵四呀!创建表CREATETABLE`tb_user`(`user_id`INTEGERPRIMARYKEYAUTO_INCREMENT,`user_name`VARCHAR(32)NOTNULL,`user_gender`CHAR(1)NOTNULL,`user_age`INTEGERNOTNULL,`user_password`VARCHAR(32)NOTNULL);CREATETABLE`tb_role`(`role_id`INTEGERPRIMARYKEYAUTO_INCREMENT,`role_name`VARCHAR(32)UNIQUENOTNULL,`role_description`VARCHAR(32)NOTNULL);CREATETABLE`tb_user_role`(`role_id`INTEGERNOTNULL,`user_id`INTEGERNOTNULL,CONSTRAINT`fk_tb_user_id`FOREIGNKEY(`user_id`)REFERENCES`tb_user`(`user_id`),CONSTRAINT`fk_tb_role_id`FOREIGNKEY(`role_id`)REFERENCES`tb_role`(`role_id`));三张表吧,一个是用户表,一个是角色表还有一张是中间表创建bean类User.javapackagenet.sunofbeach.security.domain;importjavax.persistence.*;importjava.util.HashSet;importjava.util.Set;@Entity@Table(name="tb_user")publicclassUser{@Id@Column(name="user_id")@GeneratedValue(strategy=GenerationType.IDENTITY)privateIntegeruserId;@Column(name="user_name")privateStringuserName;@Column(name="user_gender")privateStringgender;@Column(name="user_password")privateStringpassword;@Column(name="user_age")privateIntegerage;/***1、声明表关系,多对多*2、配置中间表*/@ManyToMany(targetEntity=Role.class,fetch=FetchType.EAGER)@JoinTable(name="tb_user_role",//current对象在中间表里的外键,name指的是中间表的字段,referencedColumnName指的是当前表的字段joinColumns={@JoinColumn(name="user_id",referencedColumnName="user_id")},//target对象在中间表的外键,name指的是中间表的字段,referencedColumnName指的是当前表的字段inverseJoinColumns={@JoinColumn(name="role_id",referencedColumnName="role_id")})privateSet<Role>roles=newHashSet<>();publicSet<Role>getRoles(){returnroles;}publicvoidsetRoles(Set<Role>roles){this.roles=roles;}publicIntegergetUserId(){returnuserId;}publicvoidsetUserId(IntegeruserId){this.userId=userId;}publicStringgetUserName(){returnuserName;}publicvoidsetUserName(StringuserName){this.userName=userName;}publicStringgetGender(){returngender;}publicvoidsetGender(Stringgender){this.gender=gender;}publicStringgetPassword(){returnpassword;}publicvoidsetPassword(Stringpassword){this.password=password;}publicIntegergetAge(){returnage;}publicvoidsetAge(Integerage){this.age=age;}}Role.javapackagenet.sunofbeach.security.domain;importjavax.persistence.*;importjava.util.HashSet;importjava.util.Set;@Entity@Table(name="tb_role")publicclassRole{@Id@Column(name="role_id")@GeneratedValue(strategy=GenerationType.IDENTITY)privateIntegerid;@Column(name="role_name")privateStringroleName;@Column(name="role_description")privateStringroleDescription;/***不需要维护外键,否则容易冲突*/@ManyToMany(mappedBy="roles")privateSet<User>users=newHashSet<>();publicSet<User>getUsers(){returnusers;}publicvoidsetUsers(Set<User>users){this.users=users;}publicStringgetRoleDescription(){returnroleDescription;}publicvoidsetRoleDescription(StringroleDescription){this.roleDescription=roleDescription;}publicIntegergetId(){returnid;}publicvoidsetId(Integerid){this.id=id;}publicStringgetRoleName(){returnroleName;}publicvoidsetRoleName(StringroleName){this.roleName=roleName;}}DAO自行创建啦,接下来我们就进行测试一下测试测试添加角色我在实际使用的时候,也是单独添加角色的,最好不要级联操作。删除数据容易出错。/***添加角色*/@TestpublicvoidaddRole(){Rolerole=newRole();role.setRoleName("admin");role.setRoleDescription("管理员用户");roleDao.save(role);}添加结果:添加用户在添加用户的时候,我们先是查询到现有的角色,然后在创建用户的时候,关联起来。@TestpublicvoidtestAdd(){Useruser=newUser();user.setPassword("123456");user.setAge(15);user.setUserName("president");user.setGender("1");Roleadmin=roleDao.findOneByRoleName("admin");user.getRoles().add(admin);Roleteacher=roleDao.findOneByRoleName("teacher");user.getRoles().add(teacher);userDao.save(user);}我多添加几个用户的结果:用户表中间表查询测试通常来说,我们要知道某一个用户,ta对应的角色或者我们在后台编辑的时候,查看这个角色都有哪些用户@TestpublicvoidtestListUser(){List<User>all=userDao.findAll();for(Useruser:all){StringuserName=user.getUserName();StringBuffersb=newStringBuffer("[");for(Rolerole:user.getRoles()){StringroleName=role.getRoleName();sb.append(roleName+",");}sb.replace(sb.length()-1,sb.length(),"");sb.append("]");System.out.println("user-->"+userName+"role-->"+sb.toString());}}执行结果:user-->presidentrole-->[teacher,admin]user-->BillGatesrole-->[register,teacher]user-->LarryPagerole-->[register]查询角色,把对应的用户也弄出来@TestpublicvoidtestListRole(){List<Role>all=roleDao.findAll();for(Rolerole:all){StringroleName=role.getRoleName();StringBuffersb=newStringBuffer("[");for(Useruser:role.getUsers()){sb.append(user.getUserName());sb.append(",");}sb.replace(sb.length()-1,sb.length(),"");sb.append("]");System.out.println("role-->"+roleName+"uses-->"+sb.toString());}}执行结果role-->registeruses-->[LarryPage,BillGates]role-->teacheruses-->[BillGates,president]role-->adminuses-->[president]通常来说,我们是在登录的时候,需要知道用户是什么角色。所以,一般是前面的查询方式,不过呢,只是查一个用户罢了。对应的角色也出来了,根据角色跟权限的关系,再决定这个用户是否要以访问该接口。后期我们可以通过springSecurity的例子来说明一下。
2020-03-19 15:28 · 多对多 / SpringData / JPA / 后台 / 数据库
[问答] SpringBoot后端课程中如何设置多个数据库源?
characterEncoding=utf-8&useSSL=falsedriver-class-name:com.mysql.cj.jdbc.Driverusername:rootpassword:123456#jpa
2020-12-11 21:02 · 后端 / 数据库
[文章] Spring Data JPA多表关系之一对多
SpringDataJPA多表关系之一对多我们使用Springdata操作数据库特别方便,增删改查基本的方法都有了。对于单表来说,结合sql语句,基本上可以满足项目单表操作需求。那么多表怎么操作呢?比如一对多,举个例子一个员工在一家公司上班,一个公司有很多员工。这里面我们涉及到公司表,员工表那么我们就看看怎么实现一对多吧。员工里有属于哪一家公司的关系,有一个外键约束。创建数据表公司表CREATETABLEtb_company(`id`INTEGERPRIMARYKEYauto_increment,`name`varchar(50)NOTNULL,`address`VARCHAR(128)NOTnull);工人表CREATETABLEtb_employee(`id`integerPRIMARYKEYauto_increment,`name`varchar(32)NOTNULL,`age`INTEGER,`gender`CHAR(1)NOTNULL,`company_id`INTEGERNOTNULL,CONSTRAINT`fk_tb_employee_company_id`FOREIGNKEY(`company_id`)REFERENCES`tb_company`(`id`));对应的实体类创建公司实体类packagecom.sunofbeach.security.domain;importjavax.persistence.*;importjava.util.HashSet;importjava.util.Set;@Entity@Table(name="tb_company")publicclassCompany{@Id@GeneratedValue(strategy=GenerationType.IDENTITY)privateIntegerid;@Column(name="name")privateStringname;@Column(name="address")privateStringaddress;/***一个公司有很多员工吧,所以可以使用一个集合来保存*///配置关系@OneToMany(targetEntity=Employee.class,fetch=FetchType.EAGER)//company_id表示的是外键名称,referencedColumnName表示的是参照主表主键字段@JoinColumn(name="company_id",referencedColumnName="id")privateSet<Employee>employees=newHashSet<>();publicSet<Employee>getEmployees(){returnemployees;}publicvoidsetEmployees(Set<Employee>employees){this.employees=employees;}publicIntegergetId(){returnid;}publicvoidsetId(Integerid){this.id=id;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicStringgetAddress(){returnaddress;}publicvoidsetAddress(Stringaddress){this.address=address;}@OverridepublicStringtoString(){return"Company{"+"id="+id+"\n,name='"+name+'\''+"\n,address='"+address+'\''+'}';}}员工表packagecom.sunofbeach.security.domain;importjavax.persistence.*;@Entity@Table(name="tb_employee")publicclassEmployee{@Id@GeneratedValue(strategy=GenerationType.IDENTITY)privateIntegerid;@Column(name="name")privateStringname;@Column(name="age")privateIntegerage;@Column(name="gender")privateStringgender;@Column(name="company_id")privateIntegercompanyId;@ManyToOne(targetEntity=Company.class)@JoinColumn(name="company_id",referencedColumnName="id",insertable=false,updatable=false)privateCompanycompany;publicCompanygetCompany(){returncompany;}publicvoidsetCompany(Companycompany){this.company=company;}publicIntegergetCompanyId(){returncompanyId;}publicvoidsetCompanyId(IntegercompanyId){this.companyId=companyId;}publicintgetId(){returnid;}publicvoidsetId(intid){this.id=id;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicIntegergetAge(){returnage;}publicvoidsetAge(Integerage){this.age=age;}publicStringgetGender(){returngender;}publicvoidsetGender(Stringgender){this.gender=gender;}}测试CRUD添加公司packagenet.sunofbeach.test;importcom.sunofbeach.security.SecurityApplication;importcom.sunofbeach.security.dao.CompanyDao;importcom.sunofbeach.security.domain.Company;importorg.junit.Test;importorg.junit.runner.RunWith;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.boot.test.context.SpringBootTest;importorg.springframework.test.context.junit4.SpringRunner;@RunWith(SpringRunner.class)@SpringBootTest(classes=SecurityApplication.class)publicclassTestDao{@AutowiredprivateCompanyDaocompanyDao;@TestpublicvoidtestAddCompany(){Companycompany=newCompany();company.setAddress("Shenzhen");company.setName("sunofbeachInc");companyDao.save(company);}}后面的话只写方法部分啦添加员工@TestpublicvoidtestAddEmployee(){Companycompany=companyDao.findOneByName("AlibabaInc");Employeeemployee=newEmployee();employee.setAge(28);employee.setCompanyId(company.getId());employee.setGender("m");employee.setName("Jack");employeeDao.save(employee);}这里的结果如下,我使用sql查询一下,然后再使用java代码去查询公司加了这么几个工人加了这些:代码进行查询查询一个工人@TestpublicvoidtestFindEmployee(){Employeejack=employeeDao.findOneByName("jack");System.out.println("jack-->"+jack);}结果如下:jack-->Employee{id=5,name='Jack',age=28,gender='m',companyId=6,company=Company{id=6,name='AlibabaInc',address='HangZhou'}}查找公司@TestpublicvoidtestFindCompany(){Companycompany=companyDao.findOneByName("sunofbeachInc");System.out.println("company-->"+company);Set<Employee>employees=company.getEmployees();for(Employeeemployee:employees){System.out.println("employee-->"+employee);}}测试结果company-->Company{id=4,name='sunofbeachInc',address='Shenzhen'}employee-->Employee{id=1,name='Lisi',age=28,gender='m',companyId=4,company=Company{id=4,name='sunofbeachInc',address='Shenzhen'}}employee-->Employee{id=2,name='Zhangsan',age=28,gender='f',companyId=4,company=Company{id=4,name='sunofbeachInc',address='Shenzhen'}}到这里我们就不删除了哈,一对多的关系就搞定了,后面我们再去看看多对多的怎么整吧。这些都不用记,用得上的时候,看看。写着写着就会了。
2020-03-17 00:02 · 多对多 / 数据库 / Spring / Data / JPA
[问答] org.springframework.beans.factory.BeanCreationException
Errorcreatingbeanwithname'entityManagerFactory'definedinclasspathresource[org/springframework/boot/autoconfigure/orm/jpa
2020-07-11 11:55 · spring
[文章] JavaWeb博客系统后端-连接数据库
gt;<groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa
2020-01-24 21:06 · 数据库 / datasouces / mysql / 数据 / web
[文章] 阳光沙滩博客插入emoji表情的小问题
我转念一想,数据库是支持emoji,那只能是JPA配置问题了吧。。。。然后改了一下果然啊。终于可以了。。。3.总结总结下来还是自身知识太少。不过遇到问题,上网找资料也挺重要。
2020-08-25 12:08 · sql / jpa / emoji / 阳光沙滩
[文章] JPA使用同一个实体类映射多张结构相同的表
背景最近学习后端有一个需求,在设计聊天系统的数据库时需要将聊天记录以某种方式进行分表存储以提高性能。通过学习康师傅的后台教学视频,掌握了单实体对应单表的Dao写法,案例如下pojo实体类@Entity@Table(name="table")publicclassTestEntity{@Id@Column(name="id")privateStringid;@Column(name="attr")privateStringattr;//其他属性以及getters和setters}如此,我们的Dao也许是下面这个样子的DaopublicinterfaceTestDaoextendsJpaRepository<TestEntity,String>,JpaSpecificationExecutor<TestEntity>{@Query(nativeQuery=true,value="select*fromtablewhereid=?")List<TestEntity>findAllById(Stringid);@Query(nativeQuery=true,value="select*fromtablewhereattr=?")TestEntityfindOneByAttr(Stringattr);}单实体单表实现了那多表当然可以像下面的方式实现,假设我要分10表那就是需要10个Entity,这样的话我的Dao也要一一对应,经过~~熟练的~~复制粘贴操作,区区10张表完全不在话下但是看看(~~算了懒得贴图了,想象一下就好了~~)这些类里面的惨状,所有的代码一模一样,因为所有的表结构一模一样,接口也一模一样,实现也一模一样……然后分析前面的需求,这时候你需要按照用户id计算哈希取模分表存放这些聊天记录,然后你的代码将会是这样的@AutowiredprivateMessageDao0dao0;@AutowiredprivateMessageDao1dao1;@AutowiredprivateMessageDao2dao2;@AutowiredprivateMessageDao3dao3;@AutowiredprivateMessageDao4dao4;@AutowiredprivateMessageDao5dao5;@AutowiredprivateMessageDao6dao6;@AutowiredprivateMessageDao7dao7;@AutowiredprivateMessageDao8dao8;@AutowiredprivateMessageDao9dao9;@OverridepublicResponseResultsaveOfflineMessage(StringuserID,Messagemessage){inthashCode=userID.hashCode();switch(hashCode%10){case0:returndao0.saveOfflineMessage(userID,message);case1:returndao1.saveOfflineMessage(userID,message);case2:returndao2.saveOfflineMessage(userID,message);case3:returndao3.saveOfflineMessage(userID,message);case4:returndao4.saveOfflineMessage(userID,message);case5:returndao5.saveOfflineMessage(userID,message);case6:returndao6.saveOfflineMessage(userID,message);case7:returndao7.saveOfflineMessage(userID,message);case8:returndao8.saveOfflineMessage(userID,message);case9:returndao9.saveOfflineMessage(userID,message);default:returnResponseResult.Failed();}}~~硬生生将写代码这样神圣的智力劳动变成了体力劳动~~复制粘贴这样的活再多也难不倒我们~~社畜~~但是仅仅调用了一个接口就写了70行代码,也就是说如果我要调用其他接口也要一个个判断过去,虽然整齐划一的代码看着害挺舒服但是它影响了我的拔刀速度并且,如果有更特殊的需求,要分20、30张表,或者,需要自动生成表来存放不同日期的,那这样的解决方案必须被pass掉了解决方案我们可以使用@SecondaryTable注解实体类来指定其他结构完全相同的表修改后的pojo实体类@Entity@Table(name="table0")@SecondaryTables({@SecondaryTable(name="table1"),@SecondaryTable(name="table2"),@SecondaryTable(name="table3"),@SecondaryTable(name="table4"),@SecondaryTable(name="table5"),@SecondaryTable(name="table6"),@SecondaryTable(name="table7"),@SecondaryTable(name="table8"),@SecondaryTable(name="table9")})publicclassTestEntity{@Id@Column(name="id")privateStringid;@Column(name="attr")privateStringattr;//其他属性以及getters和setters}这时候的Dao也只需要一个类即可修改后的DaopublicinterfaceTestDaoextendsJpaRepository<TestEntity,String>,JpaSpecificationExecutor<TestEntity>{@Query(value="select*fromtable?1whereid=?2",nativeQuery=true)TestEntitygetOneById(inttableNum,Stringid);@Query(value="select*fromtable?1whereattr=?2",nativeQuery=true)List<TestEntity>getAllByAttr(inttableNum,Stringattr);}以上的?1和?2代表的是接口参数的占位符,后面的数字是几代表就是第几个参数,例如当传入的tableNum为0时即代表将在table0中进行查询操作,tableNum为9时代表将在table9中进行查询操作然后再来看我们的接口调用@AutowiredprivateMessageDaomessageDao;@OverridepublicResponseResultsaveOfflineMessage(StringuserID,Messagemessage){returnmessageDao.saveOfflineMessage(userID.hashCode()%10,message);}~~从此告别复制粘贴的传统艺能,一劳永逸!~~后端小白,如有错误,恳请各路大佬斧正
2020-12-15 19:25 · pojo / dao / springboot / jpa
[问答] 康师傅的JavaWeb博客系统后端的最后一步出了问题
gt;<groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa
2020-05-31 20:25 · 求解BUG / 后端博客
[文章] 记录一下MySQL出现max_allowed_packet太小的问题
]incontextwithpath[]threwexception[Requestprocessingfailed;nestedexceptionisorg.springframework.orm.jpa.JpaSystemException
2022-03-16 12:30 · mysql
[文章] Gson的使用?Json如何转成集合?
employeesJson,newTypeToken<List<Employee>>(){}.getType());gson还可以用于复制对象我们有些时间需要复制对象,比如说我们使用JPA
2020-05-05 11:47 · json / gson / 集合 / 泛型 / 对象
[文章] SpringSecurity跟SpringBoot的整合-项目创建
gt;<groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa
[问答] 部署博客门户出现的错误
com.zaxxer.hikari.HikariDataSource]:HikariPool-1-Startcompleted.[2020/10/18-19:41:38][main][INFO][org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean
2020-10-19 10:20 · 门户
[问答] 博客教程第62P 保存新的文章分类出错SQLSyntaxErrorException
atorg.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:101)~[hibernate-core-5.4.18.Final.jar:5.4.18.Final]atorg.springframework.orm.jpa.JpaTransactionManager.doCommit
2020-08-06 14:09 · 博客
[文章] Java学习之Mybatis-plus与Security的简单整合
writeValueAsString("注销登陆成功"));//注销成功out.flush();out.close();});}}4.写在最后这是MyBatis-plus与security的整合,还有JPA
2021-02-23 11:05 · Security
[文章] 博客前后端留言模块
importorg.springframework.data.domain.Pageable;importorg.springframework.data.domain.Sort;importorg.springframework.data.jpa.domain.Specification
2020-10-16 00:32 · 博客
  • 1