阿里巴巴校招

开放式问题

  • 1、请介绍一项你最热爱、最擅长的专业领域,并且介绍你在这个领域的学习经历和未来的学习规划。
    Please introduce to us the academic field that you like most and are best at. Please include your past experience and future plan in this area.

  • 2、请介绍你参与的印象最深刻的一个项目,为什么?并且介绍你在项目中的角色和发挥的作用。
    Please tell us the most impressive project you participated in the past, and why? Please include your role during the project in detail.

  • 3、你最期望在阿里巴巴工作(或实习)的部门或项目是什么?请介绍下你对该部门的了解和希望加入的原因。
    Which department or project do you prefer most?Please tell us what you know about this department or project and why you want to be a part of this department or project.

安卓考试重点整理

登录界面实现

  • 示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/uNameTv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="用户名:"/>
<EditText
android:id="@+id/uNameEdt"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/uPWDTv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="密码:"/>
<EditText
android:id="@+id/uPWDEdt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPassword" />
<Button
android:id="@+id/uLoginBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="登录"/>
</LinearLayout>
  • 知识点
    • LinearLayout(线性布局),使用 android:orientation 属性指定布局方向,vertical(垂直)、horizontal(水平)
    • fill_parent:设置一个构件的布局为fill_parent将强制性地使构件扩展,以填充布局单元内尽可能多的空间。这跟Windows控件的dockstyle属性大体一致。设置一个顶部布局或控件为fill_parent将强制性让它布满整个屏幕。
    • wrap_content:设置一个视图的尺寸为wrap_content将强制性地使视图扩展以显示全部内容。以TextView和ImageView控件为例,设置为wrap_content将完整显示其内部的文本和图像。布局元素将根据内容更改大小。设置一个视图的尺寸为wrap_content大体等同于设置Windows控件的Autosize属性为True。
    • match_parent: Android2.2中match_parent和fill_parent是一个意思 .两个参数意思一样,match_parent更贴切,于是从2.2开始两个词都可以用。那么如果考虑低版本的使用情况你就需要用fill_parent了
    • android:inputType=”textPassword”:密码框需要加入的属性
  • 实现
    D8017116-34B8-4244-B4B6-A9B6F5F91B74

数组

  • 示例
1
2
3
4
5
6
7
8
9
<resources>
<string-array name="inType">
<item>工资</item>
<item>兼职</item>
<item>股票</item>
<item>基金</item>
<item>利息</item>
</string-array>
</resources>

保存在 res/values/strings.xml 的 XML 文件

  • 元素
1
2
3
4
5
6
7
8
9
10
11
12
<resources>
必备。此元素必须是根节点。
无属性。
<string-array>
定义一个字符串数组。包含一个或多个 <item> 元素。
属性:
name:String。数组的名称。该名称将用作资源 ID 来引用数组。
<item>
一个字符串,可包括样式设置标记。其值可以是对另一字符串资源的引用。 必须是 <string-array> 元素的子项。
无属性。

实例化

  • 示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//定义
TextView uNameTv,uPWDTv;
EditText uNameEdt,uPWDEdt;
Button uLoginBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// TextView 实例化(一般不用)
uNameTV=(TextView)findViewById(R.id.uNameTV);
uPWDTV=(TextView)findViewById(R.id.uPWDTV);
//实例化 用户名输入框
uNameEdt= (EditText) findViewById(R.id.uNameEdt);
//实例化 密码输入框
uPWDEdt= (EditText) findViewById(R.id.uPWDEdt);
//实例化登录按钮
uLoginBtn = (Button) findViewById(R.id.uLoginBtn);
//设置登录按钮的监听事件
uLoginBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//提示信息
Toast.makeText(MainActivity.this,"登录操作",Toast.LENGTH_LONG).show();
}
});
}
  • 知识点
    • findViewById方法通过定义的id获取控件,需要进行强制转换才能使用。
    • 按钮可能需要进行监听操作。

SharedPreferences的使用

  • 写入示例
1
2
3
4
5
6
7
8
9
//1、打开SharedPreferences,名称为login,如果存在则打开它,否则创建新的
SharedPreferences sp =getSharedPreferences("login", MODE_PRIVATE);
//2、让sp处于编辑状态
Editor editor=sp.edit();
//3、存放数据(通过获取EditText控件的数据)
editor.putString("username", uNameEdt.getText().toString());
editor.putString("password", uPWDEdt.getText().toString());
//4、完成提交
editor.commit();
  • 读取示例
1
2
3
4
5
6
7
8
//1、获取SharedPreferences
SharedPreferences sp=getSharedPreferences("login",MODE_PRIVATE);
//2、取出数据
String uName=sp.getString("username", "默认值");
String uPWD=sp.getString("password", "000");
//设置TextView中的数据
uNameTv.setText("用戶名:"+uName);
uPWDTv.setText("密码:"+uPWD);

Intent 传值

  • 数据存放示例
1
2
3
4
5
6
7
8
9
10
11
12
13
//1.创建并实例化一个Intent对象
Intent intent=new Intent();
//2.创建并实例化一个Bundle对象
Bundle bundle=new Bundle();
//3.存放数据(通过获取EditText控件的数据)
bundle.putString("username", uNameEdt.getText().toString());
bundle.putString("password", uPWDEdt.getText().toString());
//4.将Bundle对象添加到Intent对象中
intent.putExtras(bundle);
//5.设置Intent需要打开的新Activity
intent.setClass(MainActivity.this, NewActivity.class);
//启动新的Activity
startActivity(intent);
  • 数据读取示例
1
2
3
4
5
6
7
8
9
10
//1. 获取Intent对象
Intent intent=getIntent();
//2.获取传递的数据包
Bundle bundle=intent.getExtras();
//3、取出数据
String uName=bundle.getString("username");
String uPWD=bundle.getString("password");
//4.设置TextView中的数据
uNameTv.setText("用戶名:"+uName);
uPWDTv.setText("密码:"+uPWD);

学校项目整理

恒丰人才库管理系统(企业内部项目)

  • 简介:
    系统采用B/S三层架构设计思想,根据集团需要,对该系统进行开发,实现了通知公告、在职人员管理、离职人员管理、培训管理、多条件查找及综合查询、图表展示等功能,采用图表的形式对人员进行汇总,形成表格,配合扇形图、折线图来更加直观的展示了公司人员的情况。采用数据字段的形式来对所有下拉框进行动态管理,并且可以随时导出最新的hta文件来采集有关人员的信息。
  • 开发周期:2016/05-2016/07
  • 责任描述:参与需求调研、系统设计、数据库设计、代码编写、程序调试、项目上线。
  • 服务器部署地址:恒丰集团人才库管理系统,测试用用户名:admin,密码:admin

柳州市党外代表人士信息管理系统(政府内部系统)

  • 简介:系统采用MVC开发模式、B/S三层架构,综合运用SSH以及Ajax技术,以Java为开发工具、MySQL为数据库管理系统,采用了DWZ前台框架,加入了Ztree、Echarts、kindeditor等插件,界面友好,操作方便。该系统对全市各领域的党外代表人士、各级别的党外干部、各层次的党外人大代表和党外政协委员的各类信息进行全面收集、综合分析、归类入档、定期更新,形成分类分层人才库,可以使统战部门全面、有效地管理复杂繁琐的人员信息,实时跟踪人员变动,节省工作时间,大幅提高管理效能和服务质量,从而投入更多的精力致力于战略规划和催动其战略目标的实现。由于DWZ框架样式集成度高,集成其他插件导致了不兼容等情况,深究DWZ的源码和其他组件的源码使其达到了较好的兼容。同时实现了必填项设置,下拉菜单形成数据字典,避免了因为小改动而改动源码的麻烦。
  • 开发周期:2016/07-2016/08
  • 责任描述:参与需求调研、系统设计、数据库设计、代码编写、程序调试、项目上线。
  • 服务器部署地址:柳州市党外代表人士信息管理系统,测试用用户名:admin,密码:admin888

恒丰集团经营指标管理系统(企业内部项目)

  • 简介:系统遵循MVC设计思想,以SSH为基础框架、jQuery等其他技术手段,按照“智能查询、分类汇总、综合分析”的建设要求,来实现总公司对全国27家分公司的效益指标管理。针对多表映射关系,系统采用Hibernate这一对象关系映射框架进行多表关系映射,进而通过表格和Echarts图形插件及表格展示了各个分公司的数据。其中所有指标均可动态添加,动态修改,充分体现了系统的通用性。为了阅读的方便性,自己通过js和jqury代码实现了table同时固定行和列,滚动时只有数据滚动,提高了指标数据的可读性。
  • 责任描述:后期功能添加、服务器维护。

基于 Spring MVC+Spring+Mybatis+Apache Shiro的后台管理系统(练习项目)

  • 简介:系统采用Spring MVC开发,集成Apache Shiro实现精确到按钮的权限控制,采用Maven架构,使用IDEA开发,前端采用基于Bootstrap的H-UI。拥有角色管理、组织机构管理、权限管理、菜单管理、用户管理等功能。系统模块化开发,可作为脚手架进行后续系统开发。
  • 开发周期:2017/01-2017/03
  • 责任描述:参与系统设计、数据库设计、代码编写、程序调试、服务器部署。
  • Github开源地址:lmy_admin
  • 服务器部署地址:后台管理系统,测试用用户名:admin,密码:admin

约学约行APP开发(参赛项目)

  • 简介:系统采用新型技术架构,利用最新H5技术+安卓WebView快速开发完成,服务端和后台采用Java主流框架 Spring+Spring MVC+Mybatis整合开发,数据库采用MySql进行数据存储。
  • 主要功能介绍:安卓、微信、Web端同步更新。微信端通过对微信公众号进行二次服务端开发Web端采用H5+Zepto进行开发。使用了高德地图的API进行附近信息展示。集成阿里百川即时通讯服务,方便预约前用户之间交流,保证预约质量。学生可绑定学校教务系统账号,获取学生课程信息,通过上课地点和上课时间、时长进行学生上课签到、平时成绩统计和约束学生学习功能。引入云之迅手机验证平台,注册、找回密码均采用手机验证。引入七牛云存储,存储用户图片信息,保障图片数据安全。引入图灵机器人API,在微信端可直接发送消息与其进行聊天,也可以在后台配置其微信回复内容。软件后台使用SSM主流开发框架。后台集成Apache Shiro实现精确到按钮的权限管理,并且拥有完善的组织机构和灵活的角色管理,基于阿里Druid连接池的数据分析,可以直接通过后台配置微信、图灵、云之迅等接口信息,方便平台接口更换。后台前端采用基于Bootstrap的H-UI,增加后台管理人员的使用体验。
  • 开发周期:2017/05-2017/06
  • 责任描述:参与系统设计、数据库设计、代码编写、程序调试、服务器部署。
  • 服务器部署地址:后台地址,测试用户名:admin,密码admin手机端地址,测试用户名:17853481294,密码123456
  • 微信端二维码:simple_learn_wechat

德州经信工作交流群微信开发(政府内部项目)

  • 简介:系统后端主要采用Spring MVC+Spring+Mybatis,前端使用weui进行开发,托管微信服务端到本地服务器,拦截微信发送的事件和信息进行相应的处理。并且对权限不完整的订阅号进行功能扩展。系统主要功能是通知公告列表,管理员可以发布通知公告,并且可以对公告进行无限次的循环叠加评论,普通用户只能查看到自己的评论内容。
  • 开发周期:2017/05-2017/06
  • 责任描述:参与需求调研、系统设计、数据库设计、代码编写、程序调试、项目上线。
  • 服务器部署地址:接口
  • 微信端二维码:qrcode_for_gh_56499b6b7fe3_258

德州学院教学工作量管理系统(学校内部)

  • 简介:系统采用Spring MVC开发,Mybatis进行数据操作,使用Apache Shiro进行单角色的权限控制,前台使用了layui前端框架和DataTables等组件。系统采用Excel的模式,对教学工作量进行导入导出和后台信息的统计。
  • 开发周期:2017/05-2017/06
  • 责任描述:参与需求调研、系统设计、数据库设计、代码编写、程序调试、项目上线。
  • 服务器部署地址:教学工作量管理系统测试用户名:admin,密码admin

一本日记(安卓练习性项目)

  • 简介:本软件安卓端采用Google Material Design设计风格,Android Studio作为开发工具,集成okhttp、easy permission、CompactCalendarViewToolbar、BGAPhotoPicker-Android、Glide等开源组件。后台采用PHP语言使用TinkPHP框架进行开发,数据之间的交互使用JSON进行数据传输。
  • 主要功能描述:(1)注册登录。用户进行注册登录,注销登录。(2)日记管理。用户对日记的添加、删除、编辑、查看,图片上传。(3)个人信息修改。用户修改昵称,个人简介,修改密码。(4)分类管理。分类添加,分类删除,分类查看。
  • 开发周期:2017/06-2017/07
  • 责任描述:参与系统设计、数据库设计、安卓端代码编写、程序调试、服务器部署。
  • Github开源地址:一本日记
  • APP下载地址:一本日记APP

Mac-OS-X下Maven的安装与配置

Mac

下载Maven

到Maven官网下载安装包,选择下载Binary zip archive。下载完了之后,解压到一个目录,比如Users/lmy/maven。

设置Maven环境变量

打开终端,输入以下命令,编辑bash_profile
$ nano ~/.bash_profile
添加以下代码在最后,保存并退出:

1
2
3
# maven
export M2_HOME=/Users/lmy/maven
export PATH=$PATH:$M2_HOME/bin

输入命令使bash_profile生效

$ source ~/.bash_profile

查看Maven是否安装成功

$ mvn -v
如果输出以下信息,说明maven安装成功了

1
2
3
4
5
6
7
$ mvn -v
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00)
Maven home: /Users/yerl/maven
Java version: 1.8.0_45, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre
Default locale: zh_CN, platform encoding: UTF-8
OS name: "mac os x", version: "10.11.5", arch: "x86_64", family: "mac"

Java利用Zxing生成二维码

Maven 依赖

1
2
3
4
5
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>2.0</version>
</dependency>

二维码的生成

  • 利用Maven将Zxing-core.jar 包加入到项目中。
  • 二维码的生成需要借助MatrixToImageWriter类,该类是由Google提供的,可以将该类拷贝到源码中,这里我将该类的源码贴上,可以直接使用。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import com.google.zxing.common.BitMatrix;
import javax.imageio.ImageIO;
import java.io.File;
import java.io.OutputStream;
import java.io.IOException;
import java.awt.image.BufferedImage;
public final class MatrixToImageWriter {
private static final int BLACK = 0xFF000000;
private static final int WHITE = 0xFFFFFFFF;
private MatrixToImageWriter() {}
public static BufferedImage toBufferedImage(BitMatrix matrix) {
int width = matrix.getWidth();
int height = matrix.getHeight();
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
image.setRGB(x, y, matrix.get(x, y) ? BLACK : WHITE);
}
}
return image;
}
public static void writeToFile(BitMatrix matrix, String format, File file)
throws IOException {
BufferedImage image = toBufferedImage(matrix);
if (!ImageIO.write(image, format, file)) {
throw new IOException("Could not write an image of format " + format + " to " + file);
}
}
public static void writeToStream(BitMatrix matrix, String format, OutputStream stream)
throws IOException {
BufferedImage image = toBufferedImage(matrix);
if (!ImageIO.write(image, format, stream)) {
throw new IOException("Could not write an image of format " + format);
}
}
}

编写生成二维码的实现代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
try {
String content = "http://www.baidu.com";
String path = "C:/Users/Administrator/Desktop/testImage";
MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
Map hints = new HashMap();
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
BitMatrix bitMatrix = multiFormatWriter.encode(content, BarcodeFormat.QR_CODE, 400, 400,hints);
File file1 = new File(path,"测试打开百度.jpg");
MatrixToImageWriter.writeToFile(bitMatrix, "jpg", file1);
} catch (Exception e) {
e.printStackTrace();
}

现在运行后即可生成一张二维码图片

二维码的解析

  • 利用Maven将Zxing-core.jar 包加入到项目中。
  • 和生成一样,我们需要一个辅助类( BufferedImageLuminanceSource),同样该类Google也提供了,这里我同样将该类的源码贴出来,可以直接拷贝使用个,省去查找的麻烦
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
BufferedImageLuminanceSource
import com.google.zxing.LuminanceSource;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
public final class BufferedImageLuminanceSource extends LuminanceSource {
private final BufferedImage image;
private final int left;
private final int top;
public BufferedImageLuminanceSource(BufferedImage image) {
this(image, 0, 0, image.getWidth(), image.getHeight());
}
public BufferedImageLuminanceSource(BufferedImage image, int left, int top, int width, int height) {
super(width, height);
int sourceWidth = image.getWidth();
int sourceHeight = image.getHeight();
if (left + width > sourceWidth || top + height > sourceHeight) {
throw new IllegalArgumentException("Crop rectangle does not fit within image data.");
}
for (int y = top; y < top + height; y++) {
for (int x = left; x < left + width; x++) {
if ((image.getRGB(x, y) & 0xFF000000) == 0) {
image.setRGB(x, y, 0xFFFFFFFF); // = white
}
}
}
this.image = new BufferedImage(sourceWidth, sourceHeight, BufferedImage.TYPE_BYTE_GRAY);
this.image.getGraphics().drawImage(image, 0, 0, null);
this.left = left;
this.top = top;
}
@Override
public byte[] getRow(int y, byte[] row) {
if (y < 0 || y >= getHeight()) {
throw new IllegalArgumentException("Requested row is outside the image: " + y);
}
int width = getWidth();
if (row == null || row.length < width) {
row = new byte[width];
}
image.getRaster().getDataElements(left, top + y, width, 1, row);
return row;
}
@Override
public byte[] getMatrix() {
int width = getWidth();
int height = getHeight();
int area = width * height;
byte[] matrix = new byte[area];
image.getRaster().getDataElements(left, top, width, height, matrix);
return matrix;
}
@Override
public boolean isCropSupported() {
return true;
}
@Override
public LuminanceSource crop(int left, int top, int width, int height) {
return new BufferedImageLuminanceSource(image, this.left + left, this.top + top, width, height);
}
@Override
public boolean isRotateSupported() {
return true;
}
@Override
public LuminanceSource rotateCounterClockwise() {
int sourceWidth = image.getWidth();
int sourceHeight = image.getHeight();
AffineTransform transform = new AffineTransform(0.0, -1.0, 1.0, 0.0, 0.0, sourceWidth);
BufferedImage rotatedImage = new BufferedImage(sourceHeight, sourceWidth, BufferedImage.TYPE_BYTE_GRAY);
Graphics2D g = rotatedImage.createGraphics();
g.drawImage(image, transform, null);
g.dispose();
int width = getWidth();
return new BufferedImageLuminanceSource(rotatedImage, top, sourceWidth - (left + width), getHeight(), width);
}
}

编写解析二维码的实现代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
try {
MultiFormatReader formatReader = new MultiFormatReader();
String filePath = "C:/Users/Administrator/Desktop/testImage/test.jpg";
File file = new File(filePath);
BufferedImage image = ImageIO.read(file);;
LuminanceSource source = new BufferedImageLuminanceSource(image);
Binarizer binarizer = new HybridBinarizer(source);
BinaryBitmap binaryBitmap = new BinaryBitmap(binarizer);
Map hints = new HashMap();
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
Result result = formatReader.decode(binaryBitmap,hints);
System.out.println("result = "+ result.toString());
System.out.println("resultFormat = "+ result.getBarcodeFormat());
System.out.println("resultText = "+ result.getText());
} catch (Exception e) {
e.printStackTrace();
}

现在运行后可以看到控制台打印出了二维码的内容

hibernate-configuration

1
2
3
4
5
6
7
8
9
10
11
12
13
<hibernate-configuration>
<session-factory>
<propertyname="connection.driver_class">com.mysql.jdbc.Driver</property>
<propertyname="connection.url">jdbc:mysql://localhost:3306/hibernate-1</property>
<propertyname="connection.username">root</property>
<propertyname="connection.password">root</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<propertyname="show_sql">true</property>
<propertyname="format_sql">true</property>
<propertyname="hbm2ddl.auto">create</property>
<mappingresource="com/yuan/model/Customer.hbm.xml"/>
</session-factory>
</hibernate-configuration>

hibernate级联操作

1
2
3
4
5
6
7
8
9
<many-to-one name="category" class="Category" cascade="save-update">
<!-- 映射的字段 -->
<column name="categoryId"/>
</many-to-one>
cascade
none;//默认
save-update;
delete;
all;

Hibernate关系映射

多对一单向映射 –> hibernate=-4

1
2
3
4
<many-to-onename="category"class="com.yuan.hibernate.Category"fetch="join">
<columnname="CATEGORYID"/>
</many-to-one>
privateCategorycategory;

多对一双向映射 –> hibernate-5

1
2
3
<many-to-onename="category"class="com.yuan.hibernate.Category"fetch="join">
<columnname="CATEGORY"/>
</many-to-one>

1
2
3
4
5
6
7
<setname="book"table="BOOK"inverse="false"lazy="true">
<key>
<columnname="ID"/>
</key>
<one-to-manyclass="com.yuan.hibernate.Book"/>
</set>
privateSet<Book>book;

一对一主键关系映射 –> hibernate-6

1
2
3
4
<one-to-onename="user"class="com.yuan.model.User"></one-to-one>
<one-to-onename="idCard"class="com.yuan.model.IdCard"></one-to-one>
privateUseruser;
privateIdCardidCard;

一对一主键外键关系映射 – > hibernate-7

1
2
<many-to-onename="idCard"update="true"/>
privateIdCardidCard;

多对多关系映射 – > hibernate-8

1
2
3
4
5
6
7
<setname="students"table="STUDENT_COURSE"inverse="false"lazy="true">
<key>
<columnname="COURSEID"/>
</key>
<many-to-manyclass="com.yuan.model.Student"column="STUDENTID"/>
</set>
```







privateSetstudents;
privateSetcourses;
```

HibernateUtil.save

1
2
3
4
5
6
7
8
9
10
11
12
Sessionsession=null;
try{
session=HibernateUtil.getSession();
session.beginTransaction();
session.save(customer);
session.getTransaction().commit();
}catch(Exceptione){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtil.closeSession();
}