多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
相信有了前面的基础,对接C层就相对简单了吧。 编码前先画图,图画明白了,编码也就自然明白了。时序图如下: ![](https://box.kancloud.cn/c341554f86559602175467638c2895ec_797x513.png) ## 代码 ``` package teacher; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistryBuilder; import com.sun.xml.internal.txw2.TXW; public class Save { private String username; private String password; private String sex; private String name; private String email; 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; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } // 该execute方法将被自动调用, 方法的返回类型必须为String public String execute() { // 实例化并加载数据库配置文件 Configuration configuration = new Configuration().configure(); // 构造服务注册对象 ServiceRegistry serviceRegistry = new ServiceRegistryBuilder() .applySettings(configuration.getProperties()) .buildServiceRegistry(); // 创建会话工厂(session factory)) SessionFactory sessionFactory = configuration .buildSessionFactory(serviceRegistry); // 创建会话(这里的session也是会话的意思,我们以前接触的http中的session,处理的是用户与服务器的对话) Session session = sessionFactory.getCurrentSession(); // 开启事务(使用缓冲池进行数据库的连接) Transaction transaction = session.beginTransaction(); // 在这里,必须使用try catch finally语句。来确定会话正常关闭. // 否则,当操作数据库产生错误时,你可能需要重启mysql服务 try { // 初例化 赋值 entity.Teacher teacher = new entity.Teacher(); teacher.setName(name); teacher.setUsername(username); teacher.setEmail(email); teacher.setPassword(password); session.save(teacher); // 提交事务 transaction.commit(); // 捕获异常 } catch (HibernateException e) { } finally { // 如果session处于开启状态,则关闭session if (session.isOpen()) { // 关闭会话 session.close(); } } return "success"; // 返回字符串success } } ``` # 测试 对C层的测试,我们放在浏览器上进行。进行表单的填写后,点击提交。然后查看数据库中是否生成的新的记录。 在前期的实体开发中,我们还可以将hibernate中的hbm2ddl.auto一项,配置为create,这样每次数据表都会被重新建立,这会使得测试更加简单一些。 ![](https://box.kancloud.cn/dcd0e391a1809a8697ed938e35d8b766_549x222.gif) # 解决BUG 细心的你一定发现了,我们并没有设置sex的值,这是由于,我们在实体Teacher中,将字段sex的类型设置为布尔型,而在C层中,sex的类型却是String,下面,我们进行一个简单的处理,来解决这个小的问题。 ``` teacher.setPassword(password); // 由于sex的类型是String对象,所以需要使用equals()来判等 if (sex.equals("0")) { teacher.setSex(false); } else { teacher.setSex(true); } session.save(teacher); ``` 在这里,我们并没有使用 == 来进行判断。这是由于String并不是java的基本类型,而只有基本类型,才能够使用== 来进行判等 JAVA的基本类型为: byte:8位,最大存储数据量是255,存放的数据范围是-128~127之间。 short:16位,最大数据存储量是65536,数据范围是-32768~32767之间。 int:32位,最大数据存储容量是2的32次方减1,数据范围是负的2的31次方到正的2的31次方减1。 long:64位,最大数据存储容量是2的64次方减1,数据范围为负的2的63次方到正的2的63次方减1。 float:32位,数据范围在3.4e-45~1.4e38,直接赋值时必须在数字后加上f或F。 double:64位,数据范围在4.9e-324~1.8e308,赋值时可以加d或D也可以不加。 boolean:只有true和false两个取值。 char:16位,存储Unicode码,用单引号赋值。 加入了对sex的赋值后,再测试,发现性别的数据已经被成功写入到数据表中。