一个套用hibernate框架编写的增删改查小范例,此处分享一下,经过多次修改,从代码规范和后期维护,以及简洁程度上说:算是很标准的书写格式;
package www.csdn.net.bookhome.daoimpl; import java.util.List; import org.hibernate.Session; import org.hibernate.Transaction; import www.csdn.net.bookhome.dao.AdminDao; import www.csdn.net.bookhome.dao.BaseHibernateDao; import www.csdn.net.bookhome.domain.Admin; import www.csdn.net.bookhome.utils.HibernateSessionFactory; public class AdminDaoImpl extends BaseHibernateDao implements AdminDao { public void deleteObject(Admin entity) { Transaction tx = null; try { Session session = getSession(); tx = session.beginTransaction(); session.delete(entity); tx.commit(); } catch (Exception e) { tx.rollback(); throw new RuntimeException("删除所有错误"+e); } finally { HibernateSessionFactory.closeSession(); } } public void deleteObjectById(Integer id) { Transaction tx = null; try { Session session = getSession(); tx = session.beginTransaction(); session.save(id); tx.commit(); } catch (Exception e) { tx.rollback(); throw new RuntimeException("根据id错误"+e); } finally { HibernateSessionFactory.closeSession(); } } public List getAllObjects(Class entityClass) { try { return getSession().createQuery("from Admin").list(); } catch (Exception e) { throw new RuntimeException("查找错误"+e); } finally { HibernateSessionFactory.closeSession(); } } public Admin getObjectById(Class className, Integer id) { try { return (Admin) getSession().get(className, id); } catch (Exception e) { throw new RuntimeException("根据id查找错误"+e); } finally { HibernateSessionFactory.closeSession(); } } public List getObjects(Class clazz, int from, int size, String orderName) { try { return getSession().createQuery("from Admin").setFirstResult((from-1)*size).setMaxResults(size).list(); } catch (Exception e) { throw new RuntimeException("分页查询错误"+e); } finally { HibernateSessionFactory.closeSession(); } } public Admin loadObjectById(Class className, Integer id) { try { return (Admin) getSession().load(className, id); } catch (Exception e) { throw new RuntimeException("load查询错误"+e); } finally { HibernateSessionFactory.closeSession(); } } public void saveObject(Admin entity) { Transaction tx = null; try { Session session = getSession(); tx = session.beginTransaction(); session.save(entity); tx.commit(); } catch (Exception e) { tx.rollback(); throw new RuntimeException("保存错误"+e); } finally { HibernateSessionFactory.closeSession(); } } public void updateObject(Admin entity) { Transaction tx = null; try { Session session = getSession(); tx = session.beginTransaction(); session.update(entity); tx.commit(); } catch (Exception e) { tx.rollback(); throw new RuntimeException("更新错误"+e); } finally { HibernateSessionFactory.closeSession(); } } public Admin getAllObjects(String name) { try { return (Admin) getSession().createQuery("from Admin a where a.adminName = :name") .setParameter("name", name).uniqueResult(); } catch (Exception e) { throw new RuntimeException("根据用户查询有错误"+e); } finally { HibernateSessionFactory.closeSession(); } } public Admin login(Admin entity) { try { return (Admin) getSession().createQuery("from Admin a where a.adminName = :name and a.adminPassword = :pass ").setString("name",entity.getAdminName()).setString("pass", entity.getAdminPassword()).uniqueResult(); } catch (Exception e) { throw new RuntimeException("登录错误"+e); } finally { HibernateSessionFactory.closeSession(); } } }
这个是语言基础,包含基本语法、关键字。这个阶段如果你有其他语言的基础,会学的很快,用不了一周就可以完成,当然不包含你对它的深入理解。这就像英文字母一样,你认识了不代表你就可以用它去表达你的思想,这只代表你可以进行下一阶段的学习了。
学习这些知识可以买一些相关的书籍(其实免费下载一些电子书籍就可以了,而且还环保),也可以直接上msdn C# 语言入门 查看相关的资料,这些东西都差不多,只要系统的学习就可以了。
2.C#编程实践在对语法有了一些了解后,应该通过一些实例进行操作验证你的学习成果,同时也验证你的理解是否正确。这个阶段我感觉一个月就足够了,还是那句话如果你有其他任何一种语言的基础(是计算机语言,不是鸟语),这个应该更快。这个阶段就相当于你会用单个的字母去组词了。
这个阶段就是要多练习,不要从网上COPY一些东西直接去运行,最好是能够手动的敲一些代码,这样你可能会发现大量的问题,有助于你的提高,msdn上编程指南就可以了,也足够了。特别应该注意不要专门去追求一些华丽的技巧,在没有很好的基础时去理解这些技巧会浪费大量的时间,稳扎稳打,那些技巧会在以后的开发中很快就掌握的。
在完成组词后,下一步应该就是造句了,模拟几个虚拟的场景,实现几个比较完整的功能。接下来你就可以写作文了(帮老奶奶过马路、捡到钱包交给警察叔叔。。。)。
3.学习CLR在打算学习C#.Net之前你可能已经对托管应用程序有了一定的了解,在你学习完如何写“作文”时是不是也在考虑我的“作文”是如何运行的呢!在“作文”中创建的很多对象(老奶奶、警察...)在没有进行显示管理的情况下,如何保证内存不泄露呢!如有这样的疑问,那是时候学习CLR了,CLR被作为.NET的发动机、灵魂,反正就是重中之重,学习好它就对了。在学习的时候会碰到很多新的名词,托管模块、程序集、中间语言、通用类型系统、通用类型规范。。。有些很难理解,这个阶段就要花费大量的时间了,三个月,甚至更长,还是那句话因人而异(好像都不一样啊,呵呵),还要根据你学习的深度。
在大部分的情况下我们编写的都是宿主应用程序,程序在编译完成后会在程序集所在的清单的文件中包含CLR表头信息,它指明了托管应用程序在启动时去初始化那个版本的CLR,CLR初始化后我们的程序就由它来托管运行(CLR寄宿,应用程序时宿主),它负责的东西很多,像内存的分配、垃圾的回收、运行时类型安全检查等。每个知识点都很重要,要反复的推敲,直到你感觉你可以把它讲述给其他人,其他人也能够听懂为止。
这个阶段的学习我是建议买些书看的,毕竟msdn上的片段不具有连续性,虽然知识点都能讲到,但完整性不好。讲述CLR的书也挺多,但经典中的经典那就是 CLR via C# 第三版,不过第四版的英文版也出来了(感觉挺不好意思的,第三版我才买来看,我以前看过第二版-.net Framework 框架程序设计),知识更新的太快,郁闷,没办法,谁叫ms知识更新的快呢。
4.学习FCL在理解CLR的运行原理后,下一步自然是FCL。框架类库包含的类型有上万个,以后还会不停的扩充,要完全的了解所有的类型是不可能的,我们可以有针对性的学习,在学习前可能先问下自己要从事哪个方面的开发工作,然后针对你的目标有选择的学习。
这些类型库由不同的程序集组成,在逻辑上又进行了划分,把相关的类型放在同一个命名空间里。借助这些类型库我们可以快速的构建我们的系统,简化开发流程,也简化了测试时间(这些类型不需要在测试了)。
这个阶段的学习没有必要买书,msdn上的类库系统太好了,每个都很详细(大公司就是牛@),而且还有大量的实例,但是要学好这些东西就没有明确的时间概念了,只能实践中见真理,在做项目时,如有时间就进行整理下,好记性不如烂笔头。
CLR和FCL是dotNet的核心,也就是我们的学习重点,虽然内容很多,但是因为和语言没有关系,所以你以后变换了开发语言(依然是.net 平台),你的所学一点都不会浪费,这些都是通用的(鼓掌)。
5.设计模式在上面的基础都打好后,现在就应该转移一下注意力到设计模式上了。这个也是和语言无关的,你要写个记叙文“作文”,就应该包括时间、地点、人物和事件,这个就是个模式,通过这个类似模板的东西我们只要在合适的时候去“填空”就好了,这些都是前辈们经验的积累,要善于利用。
这个学习的过程就是理论和实践的有机结合,书推荐 大话设计模式 看着不累,Head First 设计模式都是不错的(以前看过,不过没有实践也就忘记了)。
6.专题学习还没想好,就到这儿吧!有空在聊,一点建议。
多年前写的时钟控件,发布出来,供大家参考。
先看效果:
首先,制作一个从UserControl继承的时钟控件,使用双缓冲绘制。由于是几年前的水平,一些代码写到了属性中,也懒得再改了,感兴趣的,可以改得更规范些。
//ClockControl.cs
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
namespace BrawDraw.Com.PhotoFrame.Net.PublicFunctions
{
public class ClockControl: UserControl
{
DateTime dt;
Pen pen = new Pen(Color.Black, 1);
Pen penSecond = new Pen(Color.Black, 6);
Brush brush = new SolidBrush(Color.Black);
Bitmap m_Bitmap = null;
Graphics g = null;
private Font ClockFont = new Font("Arial", 48, FontStyle.Bold);
public ClockControl()
{
SetStyle(ControlStyles.UserPaint | ControlStyles.DoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.ResizeRedraw, true);
this.UpdateStyles();
Enabled = false;
m_Bitmap = new Bitmap(100, 100);
}
public DateTime Time
{
get
{
return dt;
}
set
{
m_Bitmap = new Bitmap(this.ClientRectangle.Width, this.ClientRectangle.Height);
g = Graphics.FromImage(m_Bitmap);
g.Clear(Color.White);
InitializeCoordinates(g);
DrawDots(g, brush);
DrawHourHand(g, pen);
DrawMinuteHand(g, pen);
DrawNumbers(g);
// DrawSecondHand(g, pen);
// if(g != null) g.Dispose();
if (dt.Hour != value.Hour)
{
DrawHourHand(g, pen);
}
if (dt.Minute != value.Minute)
{
DrawHourHand(g, pen);
DrawMinuteHand(g, pen);
}
if (dt.Second != value.Second)
{
DrawMinuteHand(g, pen);
DrawSecondHand(g, pen);
}
if (dt.Millisecond != value.Millisecond)
{
DrawSecondHand(g, pen);
}
dt = value;
Graphics grfx = CreateGraphics();
grfx.DrawImage(m_Bitmap, 0, 0);
this.Validate();
if(grfx != null) grfx.Dispose();
}
}
protected override void OnPaint(PaintEventArgs pea)
{
g = pea.Graphics;
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit;
DrawClock(g);
base.OnPaint (pea);
}
private void DrawClock(Graphics gg)
{
m_Bitmap = new Bitmap(this.Width, this.Height);
Graphics grfx = Graphics.FromImage(m_Bitmap);
grfx.Clear(Color.White);
InitializeCoordinates(grfx);
DrawDots(grfx, brush);
DrawHourHand(grfx, pen);
DrawMinuteHand(grfx, pen);
DrawSecondHand(grfx, pen);
DrawNumbers(grfx);
gg.DrawImage(m_Bitmap, 0, 0);
grfx.Dispose();
}
void InitializeCoordinates(Graphics grfx)
{
if (Width == 0 || Height == 0) return;
grfx.TranslateTransform(Width / 2, Height / 2);
float fInches = Math.Min(Width / grfx.DpiX, Height / grfx.DpiY);
grfx.ScaleTransform(fInches * grfx.DpiX / 2000,
fInches * grfx.DpiY / 2000);
}
void DrawDots(Graphics grfx, Brush brush)
{
for (int i = 0; i < 60; i++)
{
int iSize = i % 5 == 0 ? 100 : 30;
grfx.FillEllipse(brush, 0 - iSize / 2, - 860 - iSize / 2, iSize, iSize);
grfx.RotateTransform(6);
}
}
protected virtual void DrawHourHand(Graphics grfx, Pen pen)
{
GraphicsState gs = grfx.Save();
grfx.RotateTransform(360f * Time.Hour / 12 + 30f * Time.Minute / 60 + 2);
grfx.DrawPolygon(pen, new Point[]
{
new Point(0, 150), new Point( 100, 0),
new Point(0, -600), new Point(-100, 0)
});
grfx.Restore(gs);
}
protected virtual void DrawMinuteHand(Graphics grfx, Pen pen)
{
GraphicsState gs = grfx.Save();
grfx.RotateTransform(360f * Time.Minute / 60 +
6f * Time.Second / 60 + 2);
grfx.DrawPolygon(pen, new Point[]
{
new Point(0, 200), new Point( 50, 0),
new Point(0, -800), new Point(-50, 0)
});
grfx.Restore(gs);
}
protected virtual void DrawSecondHand(Graphics grfx, Pen pen)
{
GraphicsState gs = grfx.Save();
grfx.RotateTransform(360f * Time.Second / 60 + 6f * Time.Millisecond / 1000 + 2.8f);
grfx.DrawLine(penSecond, 0, 0, 0, -800);
grfx.Restore(gs);
}
private void InitializeComponent()
{
//
// ClockControl
//
this.Name = "ClockControl";
this.Size = new System.Drawing.Size(416, 424);
}
protected void DrawNumbers(Graphics grfx)
{
int count = 1;
int r = 1900;
int dx = 25;
int dy = 20;
int offset = 8;
int dr = 300;
GraphicsState gs = grfx.Save();
grfx.TranslateTransform(- r/2 - dx, - r/2 - dy);
grfx.DrawEllipse(new Pen(Color.Black, 10), dx / 2 + offset, dy / 2 + offset, r + dx - offset, r + dy - offset);
//grfx.DrawEllipse(new Pen(Color.Black, 2), dx + offset, dy + offset, r - offset, r - offset);
grfx.TranslateTransform(dr/3 + 15, dr/3 + 15);
for (double a = 0; a < 2 * Math.PI; a += (2.0* Math.PI/12))
{
double x = (r - dr * 1.2)/2 * Math.Cos(a - Math.PI/3) + (r - dr)/2 + 25;
double y = (r - dr * 1.2)/2 * Math.Sin(a - Math.PI/3)+ (r - dr)/2 + 20;
grfx.DrawString(Convert.ToString(count), ClockFont, Brushes.Black, (float)x,(float)y, new StringFormat());
count++;
}
grfx.Restore(gs);
//grfx.DrawLine(new Pen(Color.Black, 1), 0, -800, 0, 800);
}
}
}
接着再从BezierClockControl再从 ClockControl控件继承,由于绘制方式不同,因此最后显示的效果也不同:
//BezierClockControl.cs
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
namespace BrawDraw.Com.PhotoFrame.Net.PublicFunctions
{
public class BezierClockControl: ClockControl
{
protected override void DrawHourHand(Graphics grfx, Pen pen)
{
GraphicsState gs = grfx.Save();
&nbs