NetBeans使用实体类以及实体类的会话bean对数据库进行操作

上一篇博文中,我已经带领大家在Netbeans创建了实体类以及实体类的会话bean。

所以,在这篇博文中将为大家展示在使用这些对数据库进行操作中我遇到的一些问题。


下图是上次创建的实体类以及实体类的会话bean。



可能细心的猿友已经注意到在com.show.entity这个包下有个叫LendPK.java的实体类显得有些与众不同,其他的类都是正常的名字,为什么这个实体类偏偏多了一个PK的后缀呢?


我来给大家解释一下吧,想必大家都清楚这些实体类都分别对应着我们数据库中schema下的一个表,每个实体的实例对应了表里的一条记录。每个实体类的名字都和我们表名相同,每个实体类中的属性都分别对应着我们表中的列名。


而这个多了个PK后缀的LendPK.java是复合主码组成的类。(我的这个lend表的主码是stuId和bookId),这个LendPK就是这两个属性的实体类。



这个LendPK就涉及到了我们使用LendFacadeLocal的find方法对数据库进行查找时要注意的一个问题,这个find方法的形式参数必须是这个表的主码,也就是说我们在这个LendFacadeLocal使用find方法的时候传入的参数得是LendPK的一个实例化对象,并且这个对象的两个属性stuId和bookId不能为空。


举个栗子,如果我们想查找一条stuId为1,bookId为1的借书记录,可以这么写:

LendFacadeLocal lfl = new LendFacade();  //这里不太确定,一般是使用注入EJB的方法得到
LendPK lendPK = new LendPK(1,1);   //使用set方法也可以
Lend lend = lfl.find(lendPK);    //返回的Lend实例也就是我们要查询的那条借书记录了


至于,如果我们想要不根据主码从数据库查询我们想要的值的话,就得手动的在LendFacadeLocal.java和LendFacade.java中编写函数来查询,这个我稍后会说。



②我们再来看看这些实体类的属性和方法,下面展示的是我的User实体类。





我们可以看到这个user表(主码为id,类型为INT)对应到实体类User时id的数据类型便成了Integer,这样有什么好处呢?

我们可以看到id被设置为AI,也就是我们在数据库中创建一行时是不知道主码id的值的,这时我们就得传入参数null来代替,这样如果id数据类型为int的话,很明显就会产生错误,使用Integer就能避免这个错误。


我们以在数据库里的user表中新创建一行为例:

UserFacadeLocal ufl = new UserFacade();    //这里不太确定,一般都是用注入的方式得到的,即@EJB UserFacadeLocal ufl; 
User user = new User(null, "张三", "123", "12561256");   //这里参数的顺序得参照User实体类的构造方法,不能写叉劈了,当然这里也可以全部使用set方法
user.setEmail("[email protected]");  //我们注意到表中的email属性不是非空的,因此在构造函数里并没有对应的形参,得用set方法设置值(如果有的话)
ufl.create(user);
该说的,注释里都说了。这样,我们就可以在数据库里新建一行数据。


以上解决的问题包含如何解决AI属性,以及如何解决可以为空的属性。


③自定义数据库操作。

在上面这个图中的前面四个方法对应着数据库的增改删查,最后的int count()方法返回的是该表中元组的个数,也就是这个表的记录的个数。但是这个find方法具有局限性,只能通过主码来查。如果我们通过其他条件查询,就得自己写方法了,步骤如下(我以LendFacadeLocal为例):

(1)首先在接口LendFacadeLocal写出函数的名称返回值类型参数等。

比如说我想写个查询某人的借书记录,就得在这个LendFacadeLocal.java中增添如下语句。


(2)然后在实现这个接口的LendFacade.java中实现增加的这个方法,最好不要在那个AbstractFacade这里编写:


注意,这里使用的是JPQL进行查询。其中的:

select c from Lend c where c.stuName=:userName
中Lend是实体类的名字,也就是你想要操作表对应的实体类的名字,在我的这个栗子中,这些实体类都被放在了com.show.entity包下。

以后我们调用这个方法的时候就可以像这样调用:

LendFacadeLocal lfl = new LendFacade();  //这里不太确定,一般是通过注入EJB的方式得到
List<Lend> lendList = lfl.findByUserName;


以上只是个人愚见,如有不足,欢迎大家多多指教。


猜你喜欢

转载自blog.csdn.net/sinat_41104353/article/details/80551185