CheaSim Blog

[hdoj6387]AraBellaC

AraBellaC

题意

一段序列中只有$A,B,C$三种字母,这段序列是一段周期序列,并且他的重复序列是这样子的。

  • AAAABBBBCCCCC

他的重复序列由$a$个A,$b$个B,$c$个C组成,并且是有顺序的。

给定以下规则。

  • 给你$m$个位置的值。
  • 其余的位置

问你生成一个序列,使得$a,b,c$的字典序最小,如果没有输出$NO$

题解

二分。

枚举重复序列的长度,那么我们要检验的就是$a,b,c$满足不满足要求。下面就可以用二分来解决。

感觉复杂度有点高。。

我们分别用三个数组存放A,B,C的位置。那么在搜索每个区间内的最后面的一个A,B,C和最前面的一个A,B,C。

之后比较复杂的就是,将一些不对的答案剔除。

因为我们得到了每个字母第一次出现和最后一次出现的位置,我们就可以得到$a,b,c$并且把一些值给剔除。

定义$a_{max},a_{min},b_{max},b_{min},c_{max},c_{min}$分别为他们出现的位置。

  • $a_{max} < b_{min}$ 并且$b_{max} < c_{min}$
  • 可能会存在没有b和c的情况,这种都要舍去。
  • 因为要字典序最小,所以$a$要尽可能的小。

$a=a_{max}-begin+1,b = b_{max}-a_{max}+1,c = len-a-b$

ac代码

[hdoj5881]Tea

Tea

题意

题意有点复杂。给你一壶茶,容量范围为$[L,R]$。之后给你两个杯子。让你从茶壶中往杯子里加茶。结果有以下要求。

  • 经过$ans$次加水,$ans$最小
  • 两个杯子的茶水量相差不超过$1$
  • 茶壶中茶水量最终不超过$1$

题解

贪心。

贪心很好想,就是细节很多。

记录茶杯1为a,茶杯2为b。

  1. 我们首先向a添加$L/2+0.5$的茶水,之后茶壶中还剩下的范围为$[L/2-0.5,R-L/2-0.5]$。如果满足要求,那么$ans$就是$1$。

  2. 之后我们往b添加$L/2-0.5$的茶水,之后茶壶中剩下的范围为$[0,R-L-2]$。如果满足要求,$ans$就是$2$。

  3. 之后我们循环往每个茶杯中加入$2$的水,直到满足要求。

需要注意的是,如果$L=0$的话要特判,还有如果$R<=1$那么就直接满足条件,如果$R<=2$的话只要添加一次。

ac代码

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
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for(int i=(a);i<(n);i++)
#define per(i,a,n) for(int i=(n-1);i>=(a);i--)
#define fi first
#define se second
typedef pair <int,int> pII;
typedef long long ll;
const int INF = 0x3f3f3f3f;
//head

ll l,r;
int main(){
#ifdef LOCAL
freopen("3.in","r",stdin);
#endif
std::ios::sync_with_stdio(false);
cin.tie(0);
while(cin>>l>>r){
if(r<=1) puts("0");
else if(r<=2) puts("1");
else if(l==0) printf("%lld\n",(r-1)/2+1);
else {
ll temp = r-l-3;
temp = max(0ll,temp);
ll ans = temp/2;
if(ans*2<temp) ans++;
printf("%lld\n",ans+2);
}
}

return 0;
}

[cf-767b]The Queue

The Queue

题意

题意有点复杂,懒得写了。

题解

贪心。

注意的点就是,可以在还没有开始就进入队列进行排队,所以计算的时候虽然是一样的,但还是要注意一下。

特殊情况就是对于在ed以后的人来说,他们就不算了,不算人。

+1 p数组 忘记开long long了。

+1 如果加入时间超过进入时间了就不行了。

ac代码

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
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for(int i=(a);i<(n);i++)
#define per(i,a,n) for(int i=(n-1);i>=(a);i--)
#define fi first
#define se second
typedef pair <int,int> pII;
typedef long long ll;
const int INF = 0x3f3f3f3f;
//head
ll st,ed,t;
int n;
const int maxn = 1e5+10;
ll p[maxn];
int main(){
#ifdef LOCAL
freopen("4.in","r",stdin);
#endif
scanf("%lld%lld%lld",&st,&ed,&t);
scanf("%d",&n);
rep(i,0,n) scanf("%lld",p+i),p[i]-=st;
ed -= st;
ll ans = 1e13;
ll wait = 1e14;
int cnt = 0;
rep(i,0,n){
if( (ll)(i+1)*t>ed || p[i]+t>ed) break;
cnt++;
if(p[i] > (ll)(i)*t && p[i]+t<=ed){
ans = p[i]-1;
cout<<ans+st<<'\n';
return 0;
}else{
ll temp = (ll)(i)*t - p[i];
if(wait > temp){
wait = temp;
ans = p[i]-1ll;
}
}
}
ll temp = (ll)(cnt+1)*t; if(temp<=ed) ans = temp-t;
printf("%lld\n",ans+st);

return 0;
}

[cf-767D]Cartons of milk

Cartons of milk

题意

每天喝$k$瓶牛奶,每瓶牛奶都有$s$的保质日期,现在我有$n$瓶牛奶,去商场最多可以买多少瓶牛奶。

条件是每天都要喝$k$瓶牛奶,在最有情况下所有牛奶都不会过期。

题解

贪心,反正所有牛奶的贡献都是1,所以保质期越后面的越好。

计算能买多少瓶就是从第一天开始遍历,能买到就买对应的期限的牛奶。

+1: 中间一个变量爆了int

+1: 有两个变量$n,m$,sort的时候用了$n$,应该用$m$。

ac代码

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
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for(int i=(a);i<(n);i++)
#define per(i,a,n) for(int i=(n-1);i>=(a);i--)
#define fi first
#define se second
typedef pair <int,int> pII;
typedef long long ll;
const int INF = 0x3f3f3f3f;
//head
int n,m,k;
const int maxn = 1e6+10;
const int maxm = 1e7+10;
int vis[maxm];
int mx[maxm];
struct node{
int id;
int val;
bool operator<(const node &x)const{
return val>x.val;
}
}a[maxn];
int main(){
#ifdef LOCAL
freopen("3.in","r",stdin);
#endif
scanf("%d%d%d",&n,&m,&k);
bool flag = false;
rep(i,0,n){
int x;scanf("%d",&x);
vis[x]++;
}
rep(i,0,m){
int x;scanf("%d",&x);
mx[x]++;
a[i].val = x; a[i].id = i+1;
}
sort(a,a+m);
int ans = 0;
ll now = k;
rep(i,0,maxm){
if(vis[i] > now){
flag = true;
break;
}else{
int temp = min(now-vis[i],(ll)mx[i]);
int t = vis[i] + temp;
ans += temp;
now += k-t;
}
}
if(flag) puts("-1");
else{
printf("%d\n",ans);
rep(i,0,ans){
printf("%d ",a[i].id);
}
puts("");
}

return 0;
}

[uva10479]The Hendrie Sqquence

The Hendrie Sequence

题意

给定一段序列的生成方式,问第$n$个元素是多少。 $0<n<2^{63}$。

  • $H(1) = 0$
  • $H(n) = H(n-1)$中的每个元素$a_i$,那么每个元素就生成一个小子序列$0,0,0,0,0,a_i+1$其中$0$的个数是$a_i$。
  • 除了第一个元素之外的所有元素都要进行这种变化

举个例子,

$H(1) = 0$

$H(2) =0,1$ //$0$变成了$0,1$

$H(4) = 0,1,0,2$ //$0$ 变成了$0,1$, $1$变成了$0,2$

$H(8) = 0,1,0,2,1,0,0,3$ //$0$ 变成了$0,1$, $1$变成了$0,2$ ,$2$变成了$0,0,3$

题解

找规律,我们可以发现每次都变化之后序列的长度都翻了一倍。所以我们单独把他增长的序列拿出来看。可以用心去发现这样一个规律。

  • 定义增长的序列为$b_i$
  • $b_i$是由$1$个$b_{i-1}$,$2$个$b_{i-2}$,$3$个$b_{i-3}$,$4$个$b_{i-4}$…$i$个$b_{0}$ ,再加上一个单独的数字$i$。以此类推出来的。

那么我们就可以从第$n$个元素表示在它属于的那次增长中,它排第几个递归到最初的那几个元素中去,要判断一下范围。

由于题目中的数据比较极限,所以能用unsigned long long 还是用unsigned long long 吧。

如果用unsigned long long。一般数据量输入很小 可以用cin很靠谱。但是要把endl换成’\n’还有输入

1
2
std::ios::sync_with_stdio(false);
cin.tie(0);

或者判断他是$2$的几次幂的时候可以这样子判断最高位的$1$在哪里。

1
2
3
4
ll n; int dep=0;
ll temp = n;
while(temp) temp>>=1,dep++;
dep--;

ac代码

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
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for(int i=(a);i<(n);i++)
#define per(i,a,n) for(int i=(n-1);i>=(a);i--)
#define fi first
#define se second
typedef pair <int,int> pII;
typedef long long ll;
const int INF = 0x3f3f3f3f;
//head
ll n;
ll lie[10][20] ={ {0}, {1}, {0,2}, {1,0,0,3},{0,2,1,1,0,0,0,4}};
ll solve(ll x,int dep){
if(dep<5){
return lie[dep][x];
}
ll st = 0;
rep(i,2,dep+1){
ll temp = pow(2,dep-i-1);
if(i==dep) temp = 1;
if(x<temp*(1ll*i-1ll)+st) return solve((x-st)%temp,dep-i);
st += temp*(ll)(i-1);
}
return dep;
}
int main(){
#ifdef LOCAL
freopen("4.in","r",stdin);
#endif
std::ios::sync_with_stdio(false);
cin.tie(0);
while(cin>>n && n){
int dep = 0;ll temp = 1;
n--;
ll tn = n;
while(tn) tn/=2,dep++;
temp<<=(dep-1);
n = n - temp;
cout<<solve(n,dep);
cout<<'\n';
}

return 0;
}

[hdoj5505]GT and numbers

GT and numbers

题意

题目意思比较绕,就是给定一个$N$和$M$问至少要多少次下列的操作可以使得$N$等于$M$。

  • 将N乘上一个它的因子(注意$N$也会变)。

题解

由于我们要求$N$转化成$M$,那么其实就是他们的素因子变成相同。

$N = 2^{a_1} * 3^{a_2}5^{a_3}…$

$M = 2^{b_1}*3^{b_2}5^{b_3}…$

那么我们就可以看出 如果要让$a_1=b_1,a_2=b_2,a_3=b_3…$我们需要在他们差距最大的那个素因子中他们相差的倍数的。

$log_2(倍数)$

tip 由于2e63 爆了long long 。所以要用unsigned long long。

ac代码

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
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for(int i=(a);i<(n);i++)
#define per(i,a,n) for(int i=(n-1);i>=(a);i--)
#define fi first
#define se second
typedef pair <int,int> pII;
typedef unsigned long long ll;
const int INF = 0x3f3f3f3f;
//head
ll n,m;

int prime[1100000],primesize,phi[11000000];
bool isprime[11000000];
void getlist(int listsize)
{
memset(isprime,1,sizeof(isprime));
isprime[1]=false;
for(int i=2;i<=listsize;i++)
{
if(isprime[i])prime[++primesize]=i;
for(int j=1;j<=primesize&&i*prime[j]<=listsize;j++)
{
isprime[i*prime[j]]=false;
if(i%prime[j]==0)break;
}
}
}
int main(){
#ifdef LOCAL
freopen("1.in","r",stdin);
#endif
int T; scanf("%d",&T);
getlist(4000000);
while(T--){
scanf("%llu%llu",&n,&m);
ll ans = 0;
bool flag = false;
for(ll i=1;prime[i]<=n;i++){
ll cnt1= 0,cnt2 = 0;
ll t = prime[i];
while(n%t==0) n/=t,cnt1++;
while(m%t==0 && m) m/=t,cnt2++;
if(cnt1>cnt2 ||(cnt1==0 && cnt2>0)){
flag = true;
break;
}
if(cnt1 == 0) continue;
ll temp = cnt2/cnt1;
if(temp*cnt1<cnt2) temp++;
ans = max(temp,ans);
}
if(m>1) flag = true;
if((n==1 && n!=m) || flag){
puts("-1");
}else{
if(ans==0){
puts("0");
continue;
}
ll temp = 1;
int res = 0;
while(temp<ans) temp<<=1,res++;
printf("%d\n",res);
}
}
return 0;
}

[77c Beavermuncher-0xFF树形dp+贪心

C. Beavermuncher-0xFF

题意

给你一颗树,树上的每个节点有$n$个海狸。现在你在节点$root$上你前往下一个节点的条件是下一个节点上面至少有一个海狸,之后你到这个节点之后,你就会吃掉这个海狸。问最多能吃掉多少只海狸。

题解

贪心+树形dp

ac代码

jsp作业

jsp第五次上机

题目1

实现Hibernate的增加数据功能

题目2

实现Hibernate的查找数据功能

项目构成

image-20181111155849991

DAO是项目的功能接口类,DAOImpl是DAO功能接口的实现类。AddStudent是主要的Action类,有两个方法,一个是增加学生数据一个是显示学生数据。Student和hbm由IDE自动根据数据库生成。

java类函数代码

接口类

1
2
3
4
5
6
7
8
package njtech.edu.DAO;
import java.util.List;
import njtech.edu.model.Student;

public interface StudentDAO {
public void saveStudent(Student student);
public List<Student> getAll();
}

实现类

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
package njtech.edu.DAO.impl;


import njtech.edu.model.Student;
import njtech.edu.DAO.StudentDAO;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

import java.util.Iterator;
import java.util.List;

public class StudentDAOImpl extends BaseDAOImpl implements StudentDAO{
SessionFactory sessionFactory = null;
Session session = null;
Transaction tx = null;
public StudentDAOImpl(){}
public void init() {
sessionFactory = new Configuration().
configure("hibernate.cfg.xml").
buildSessionFactory();
session = sessionFactory.openSession();
tx = session.beginTransaction();
}
@Override
public void saveStudent(Student student) {
init();
session.save(student);
tx.commit();
}

@Override
public List<Student> getAll() {
init();
List<Student> students = session.createQuery("from Student").list();
return students;
}
}

Action类

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
package com.listAction;

import java.util.ArrayList;
import java.util.List;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import njtech.edu.DAO.StudentDAO;
import njtech.edu.DAO.impl.StudentDAOImpl;
import njtech.edu.model.Student;

public class AddStudent extends ActionSupport implements ModelDriven {
private Student student = new Student();
private List<Student> students = new ArrayList<Student>();
private StudentDAO dao = new StudentDAOImpl();
public Object getModel() {
return student;
}
public String execute()
{
dao.saveStudent(student);
return "success";
}
public String listStudents()
{
students = dao.getAll();
return "success";
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
public List<Student> getStudents() {
return students;
}
public void setStudents(List<Student> students) {
this.students = students;
}
}

model类

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
package njtech.edu.model;

import javax.persistence.*;
import java.util.Objects;
public class Student {
private int id;
private String name;
private String address;
public Student(){}
public Student(int id, String name, String address){
this.id = id;
this.name = name;
this.address = address;
}
public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getAddress() {
return address;
}

public void setAddress(String address) {
this.address = address;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student that = (Student) o;
return id == that.id &&
Objects.equals(name, that.name) &&
Objects.equals(address, that.address);
}

@Override
public int hashCode() {
return Objects.hash(id, name, address);
}
}

对应的数据库mapping

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

<class name="njtech.edu.model.Student" table="student" schema="test">
<id name="id">
<column name="id" sql-type="int(11)"/>
</id>
<property name="name">
<column name="name" sql-type="varchar(100)" length="100" not-null="true"/>
</property>
<property name="address">
<column name="address" sql-type="varchar(100)" length="100" not-null="true"/>
</property>
</class>
</hibernate-mapping>

Hibernate配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.url">jdbc:mysql://localhost:3306/test?useSSL=false</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.username">root</property>
<property name="connection.password">123456</property>
<property name="current_session_context_class">thread</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">update</property>


<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<mapping class="njtech.edu.model.Student"/>
<mapping resource="njtech/edu/model/Student.hbm.xml"/>
</session-factory>
</hibernate-configuration>

struts2配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
<package name="default" extends="struts-default">
<action name="addStudent" method="execute"
class="com.listAction.AddStudent">
<result name="success" type="redirect">
listStudents.action
</result>
</action>
<action name="listStudents" method="listStudents"
class="com.listAction.AddStudent">
<result name="success">index.jsp</result>
</action>
</package>
</struts>

测试类,可以用来测试Hibernate是否运行

需要加载对应的Junit的jar包。

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
import njtech.edu.model.Student;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Before;
import org.junit.Test;

import java.util.Iterator;
import java.util.List;

public class DAOtest {
SessionFactory sessionFactory = null;
Session session = null;
Transaction tx = null;
@Before
public void init() {
sessionFactory = new Configuration().
configure("hibernate.cfg.xml").
buildSessionFactory();
session = sessionFactory.openSession();
tx = session.beginTransaction();
}
//增加
@Test
public void insert() {
Student ue = new Student();
ue.setName("Anny");
ue.setId(7777);
ue.setAddress("wodediercichangshi");
session.save(ue);
tx.commit();
}
//修改
@Test
public void update() {
Student user = (Student) session.get(Student.class, new Integer(2));
user.setName("Penny");
session.update(user);
tx.commit();
session.close();
}
//查找
@Test
public void getById() {
Student user = (Student) session.get(Student.class, new Integer(8));
tx.commit();
session.close();
System.out.println("ID号:" + user.getId() + ";用户名:" + user.getName() +
";密码:" + user.getAddress() );
}
//删除
@Test
public void delete() {
Student user = (Student) session.get(Student.class, new Integer(6));
if(user != null){
session.delete(user);
}
tx.commit();
session.close();
}

@Test
public void gogogo(){
List<Student> students = students = session.createQuery("from Student").list();
for (Iterator iter = students.iterator(); iter.hasNext();) {
Object[] o = (Object[])iter.next();
System.out.println(o[0]+","+o[1]);
}
}
}

显示页面

写了两种显示方式

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
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>Hello World</title>
<s:head />
</head>
<body>
<s:form action="addStudent">
<s:textfield name="student.id" label="ID"/>
<s:textfield name="student.name" label="Name"/>
<s:textfield name="student.address" label="Address"/>
<s:submit/>
<hr/>
<table>
<tr>
<td>ID</td>
<td>Name</td>
<td>Address</td>
</tr>
<s:iterator value="students">
<tr>
<td><s:property value="id"/></td>
<td><s:property value="name"/></td>
<td><s:property value="address"/></td>
</tr>
</s:iterator>
</table>
</s:form>
<s:if test="students.size() > 0">
<table border="1px" cellpadding="8px">
<tr>
<th>Student Id</th>
<th>Name</th>
<th>Address</th>
</tr>
<s:iterator value="students">
<tr>
<td><s:property value="id" /></td>
<td><s:property value="name" /></td>
<td><s:property value="address" /></td></td>
</tr>
</s:iterator>
</table>
</s:if>
</body>
</html>

运行界面

image-20181111160639164

image-20181111160757748

输入信息之后submit加载到数据库中,并显示数据库中所有数据。

image-20181111160739052

JavaBean和Hibernate

javabean学习笔记

参考https://www.cnblogs.com/Qian123/p/5277425.html

JavaBean简介

javabeans就是符合某种特定规范的Java类,功能区分很明确,并且有如下设计原则

公有类,无参的共有构造方法,属性私有,有getter和setter。

Jsp联动

JavaBean和JSP有关的动作标签有

1
2
3
<jsp:useBean></jsp:useBean>
<jsp:setProperty></jsp:setProperty>
<jsp:getProperty></jsp:getProperty>

如何使用

普通的使用

可以当做一个普通的java类在jsp中插入java代码来使用。

具体分析就是:

1、创建一个web project项目。
2、在src文件下,创建一个包,在包中创建一个类,满足设计原则即可
3、在index.jsp页面中通过import导入之前创建的类(import=”包名.类名”)
4、通过使用new创建Javabean实例(创建对象)
5、使用set方法赋值
6、使用get方法取值

使用jsp动作标签

useBean

1
2
3
<body>
<jsp:useBean id="myUsers" class="com.Users" scope="page"/>
</body>

其中java类名是java类的全名要有package

setProperty

Hibernate

ORM

对象关系映射

当我们工作在一个面向对象的系统中时,存在一个对象模型和关系数据库不匹配的时候,在java中他有一个对象关联图。

hibernate将java类映射到数据表中,

Session

Session用于获取与数据库的物理连接,由于Session对象是轻量级的,并且每次与数据库进行交互都要实例化,持久太对象被保存,并通过Session对象检索找回。

因为Session对象不是线程安全的,应该根据需求被创建或者销毁。他的主要功能是映射实体类的实例提供创建,读取和删除操作。

典型的事务语法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Session session = factory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
// do some work
...
tx.commit();
}
catch (Exception e) {
if (tx!=null) tx.rollback();
e.printStackTrace();
}finally {
session.close();
}

个人认为比较重要的方法

1
2
3
4
5
6
7
8
9
10
11
Transaction beginTransaction()
//开始工作单位,并返回关联事务对象。

Connection close()
//通过释放和清理 JDBC 连接以结束该会话。

Query createQuery(String queryString)
//为给定的 HQL 查询字符创建查询的新实例。

SessionFactory getSessionFactory()
//获取创建该会话的 session 工厂。

持久化类

在 Hibernate 中,其对象或实例将会被存储在数据库表单中的 Java 类被称为持久化类。若该类遵循一些简单的规则或者被大家所熟知的 Plain Old Java Object (POJO) 编程模型,Hibernate 将会处于其最佳运行状态。以下所列就是持久化类的主要规则,然而,在这些规则中,没有一条是硬性要求。

  • 所有将被持久化的 Java 类都需要一个默认的构造函数。
  • 为了使对象能够在 Hibernate 和数据库中容易识别,所有类都需要包含一个 ID。此属性映射到数据库表的主键列。
  • 所有将被持久化的属性都应该声明为 private,并具有由 JavaBean 风格定义的 getXXXsetXXX 方法。
  • Hibernate 的一个重要特征为代理,它取决于该持久化类是处于非 final 的,还是处于一个所有方法都声明为 public 的接口。
  • 所有的类是不可扩展或按 EJB 要求实现的一些特殊的类和接口。

POJO 的名称用于强调一个给定的对象是普通的 Java 对象,而不是特殊的对象,尤其不是一个 Enterprise JavaBean。

他并不是一个javabean

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
public class Employee {
private int id;
private String firstName;
private String lastName;
private int salary;

public Employee() {}
public Employee(String fname, String lname, int salary) {
this.firstName = fname;
this.lastName = lname;
this.salary = salary;
}
public int getId() {
return id;
}
public void setId( int id ) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName( String first_name ) {
this.firstName = first_name;
}
public String getLastName() {
return lastName;
}
public void setLastName( String last_name ) {
this.lastName = last_name;
}
public int getSalary() {
return salary;
}
public void setSalary( int salary ) {
this.salary = salary;
}
}

关键点 对于s: jstl标签中 查询不能用createSQLquery得用createquery 获得的查询才是正确的查询。属于可以直接放到上面去的。

个人理解

hibernate把数据读入 之后将数据传输给javabean,之后依靠javabean将数据显示在jsp页面上,

上课笔记

Hibernate就是实现ORM的一个框架

1
2
3
4
5
6
7
<id name="id" type="long">
<column name="id" />
<generator class="increment" />
</id>
<property name="xxx" type="string">
<column name="xxxx" length="30"/>
</property>

xxx 是成员中的成员变量 xxxx 是列在数据库中的名字。

id 是主键的意思。

看xml文件要采用剥皮的方式,一层一层看进去。

链接一种数据库的时候只需要一个SessionFactory。但是如果你要进行数据迁移的时候,就需要两个会话工厂。

  • 如果对象是和数据库一直是一样的,那就是持久态。Persistent
  • 如果对象是还没有提交到数据库中,就是临时态,Transient
  • 如果是对象不和数据库一致 就是游离态 Detached
  • 把对象删除了 Removed

可以使用save()函数将Transient状态转化为Persistent

当session.close()以后你再设置对象的状态就是Detached状态了。

通过Criteria查询 QBC Query By Criteria

1
2
3
Criteria criteria = 
session.createCriteria(Student.class).add(Restrictions.like("id",new Integer(1)))

新建一个约束(查询条件) id=1

(Student.class)强制类型转换 把他变成了Student。

HQL Hibernate Query Language

可以通过HQL来查询。

HQL使用了类来查询

1
String hql = "from Student";

因为Hibernate框架的支持所以只需发要这样写就可以直接查询了。

字段操作

基于Hibernate的操作有几种操作

  • Session
  • HQL
  • Criteria
  • SQL

解释函数的意义。

1
2
Query query = session.createQuery(hql);

query 是流数据,是二进制数据,所以要强制类型转化。

带参数的HQL语句

1
2
3
4
5
6
String hql = "select * from Employee emp where emp.id=:id and emp.name=:name";
Query query = session.createQuery(hql).addEntity(Employee.class);
query.setParameter("id",1);
query.setParameter("name","fff");
this.dataObject = (List<Employee>) query.list();

SSH中的SH配置

IDEA+Hibernate+Struts2

笔者能力有限,只能用老版Hibernate和老版Struts2.

我们在IDEA中选择Struts2中的2.3版本我是直接下了jar包加入进去的,还有自动下载Hibernate3.6中的。之后进行配置。

之后再加入connector我用的是Mysql5.7版本所以用了对应的connector。

之后选择左下角的persistence,右键下面的一个文件之后generate Mapping。

之后选择链接服务器 记得?useSSL=false。之后配置一下hibernate.cfg.xml中的文件,其中username和password和前面四个是自己设置的。

还要选择mapping的class和resource

1
2
3
4
5
6
7
8
9
10
11
12
<property name="connection.url">jdbc:mysql://localhost:3306/test?useSSL=false</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.username">root</property>
<property name="connection.password">123456</property>
<property name="current_session_context_class">thread</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">update</property>
<!-- DB schema will be updated if needed -->
<!-- <property name="hbm2ddl.auto">update</property> -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<mapping class="hibernate.StudentEntity"/>
<mapping resource="hibernate/StudentEntity.hbm.xml"/>

之后把jstl中的jar包加入到tomcat文件夹中。这样就不用每次配置了。

之后在preference中搜索dtds

1
http://java.sun.com/jsp/jstl/core

url填写这个 之后再搜索你下载好的jstl中的c.tld文件 慢慢找就在里面

下载链接

http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/

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
package hibernate;

import javax.persistence.*;
import java.util.Objects;
@Entity
@Table(name="student")
public class StudentEntity {
@Id
@GeneratedValue
private int id;
@Column(name="name")
private String name;
@Column(name="address")
private String address;
public StudentEntity(){}
public StudentEntity(int id,String name,String address){
this.id = id;
this.name = name;
this.address = address;
}
public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getAddress() {
return address;
}

public void setAddress(String address) {
this.address = address;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
StudentEntity that = (StudentEntity) o;
return id == that.id &&
Objects.equals(name, that.name) &&
Objects.equals(address, that.address);
}

@Override
public int hashCode() {
return Objects.hash(id, name, address);
}
}

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
package com.listAction;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import hibernate.Student;
import com.googlecode.s2hibernate.struts2.plugin.annotations.SessionTarget;
import com.googlecode.s2hibernate.struts2.plugin.annotations.TransactionTarget;
import org.hibernate.Session;
import org.hibernate.Transaction;

public class StudentDAO {
@SessionTarget
Session session;
@TransactionTarget
Transaction transaction;
@SuppressWarnings("unchecked")
public List<Student> getStudents()
{

List<Student> students = new ArrayList<Student>();
try
{
students = session.createQuery("from student").list();
for (Iterator iter = students.iterator(); iter.hasNext();) {
Object[] o = (Object[])iter.next();
System.out.println(o[0]+","+o[1]);
}
}
catch(Exception e)
{
e.printStackTrace();
}
return students;
}
public void addStudent(Student student)
{
session.save(student);
}
}
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
package com.listAction;

import java.util.ArrayList;
import java.util.List;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import hibernate.Student;

public class AddStudent extends ActionSupport
implements ModelDriven<Student>{
Student student = new Student();
List<Student> students = new ArrayList<Student>();
StudentDAO dao = new StudentDAO();
@Override
public Student getModel() {
return student;
}
public String execute()
{
dao.addStudent(student);
return "success";
}
public String listStudents()
{
students = dao.getStudents();
return "success";
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
public List<Student> getStudents() {
return students;
}
public void setStudents(List<Student> students) {
this.students = students;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
<package name="default" extends="hibernate-default">
<!--defaultStackHibernate里面的拦截器会识别出@SessionTarget@TransactionTarget等标注,
然后将hibernate注入进去-->
<action name="addStudent" method="execute"
class="com.listAction.AddStudent">
<result name="success" type="redirect">
listStudents
</result>
</action>
<action name="listStudents" method="listStudents"
class="com.listAction.AddStudent">
<result name="success">index.jsp</result>
</action>
</package>
</struts>
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

import hibernate.Student;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Before;
import org.junit.Test;

import java.util.Iterator;
import java.util.List;

public class DAOtest {
SessionFactory sessionFactory = null;
Session session = null;
Transaction tx = null;
@Before
public void init() {
sessionFactory = new Configuration().
configure("hibernate.cfg.xml").
buildSessionFactory();
session = sessionFactory.openSession();
tx = session.beginTransaction();
}
//增加
@Test
public void insert() {
Student ue = new Student();
ue.setName("Anny");
ue.setId(123321);
ue.setAddress("wodediercichangshi");
session.save(ue);
tx.commit();
}
//修改
@Test
public void update() {
Student user = (Student) session.get(Student.class, new Integer(2));
user.setName("Penny");
session.update(user);
tx.commit();
session.close();
}
//查找
@Test
public void getById() {
Student user = (Student) session.get(Student.class, new Integer(8));
tx.commit();
session.close();
System.out.println("ID号:" + user.getId() + ";用户名:" + user.getName() +
";密码:" + user.getAddress() );
}
//删除
@Test
public void delete() {
Student user = (Student) session.get(Student.class, new Integer(6));
if(user != null){
session.delete(user);
}
tx.commit();
session.close();
}

@Test
public void gogogo(){
List<Student> students = session.createSQLQuery("select *from student").list();
for (Iterator iter = students.iterator(); iter.hasNext();) {
Object[] o = (Object[])iter.next();
System.out.println(o[0]+","+o[1]);
}
}
}