java中常用的工具類

1. 常用零散工具類

1.1【DateUtil.java】日期處理的工具類

/**
 * 時間日期處理工具
 * String -> Date
 * Date -> String
 * 以及生成含有日期的字符串 可以當作保存id用等等。
 * 等格式化處理 
 * **/
public class DateUtil {
    private static final String FORMAT_0 = "yyyy-MM-dd HH:mm:ss";
    private static final String FORMAT_1 = "yyyy-MM-dd";
    private static final String FORMAT_2 = "HH:mm:ss";
    private static final String FORMAT_3 = "yyyyMMddHHmmss";

    //獲得含有時間的id 字符串
    public static String getIdByTime(){
        Date now = new Date();
        SimpleDateFormat simple = new SimpleDateFormat(FORMAT_3);
        return simple.format(now);
    }
    //如果參數長度不爲爲0,則取第一個參數進行格式化,否則取當前日期時間,精確到秒 如:2010-4-15 9:36:38
    public static String toFull(Date... date) {
        SimpleDateFormat simple = new SimpleDateFormat(FORMAT_0);
        if (date!=null && date.length > 0) {
            return simple.format(date[0]);
        }
        return simple.format(new Date());
    }
    /**
     * 如果參數長度不爲爲0,則取第一個參數進行格式化,<br>
     * 否則取當前日期 如:2010-4-15
     * 
     * @param Date
     *            ... 可變參數
     * @return java.lang.String
     * **/
    public static String toDate(Date... date) {
        SimpleDateFormat simple = new SimpleDateFormat(FORMAT_1);
        if (date.length > 0) {
            return simple.format(date[0]);
        }
        return simple.format(new Date());
    }

    /**
     * 如果參數長度不爲爲0,則取第一個參數進行格式化,<br>
     * 否則取當前日期時間,精確到秒<br>
     * 如:9:36:38
     * 
     * @param Date
     *            ... 可變參數
     * @return java.lang.String
     * **/
    public static String toTime(Date... date) {
        SimpleDateFormat simple = new SimpleDateFormat(FORMAT_2);
        if (date.length > 0) {
            return simple.format(date[0]);
        }
        return simple.format(new Date());
    }

    /**
     * 根據字符串格式去轉換相應格式的日期和時間
     * 
     * @param java
     *            .lang.String 必要參數
     * @return java.util.Date
     * @exception java.text.ParseException
     *                如果參數格式不正確會拋出此異常
     * **/
    public static Date reverse2Date(String date) {
        SimpleDateFormat simple = null;
        switch (date.trim().length()) {
        case 19:// 日期+時間
            simple = new SimpleDateFormat(FORMAT_0);
            break;
        case 10:// 僅日期
            simple = new SimpleDateFormat(FORMAT_1);
            break;
        case 8:// 僅時間
            simple = new SimpleDateFormat(FORMAT_2);
            break;
        default:
            break;
        }
        try {
            return simple.parse(date.trim());
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 將帶有時、分、秒格式的日期轉化爲00:00:00<br>
     * 方便日期推算,格式化後的是yyyy-MM-dd 00:00:00
     * 
     * @param java
     *            .util.Date... date的長度可以爲0,即不用給參數
     * @return java.util.Date
     * **/
    public static Date startOfADay(Date... date) {
        SimpleDateFormat simple = new SimpleDateFormat(FORMAT_1);
        Date date_ = date.length == 0 ? new Date() : date[0];// 如果date爲null則取當前時間
        String d = simple.format(date_);
        try {
            return simple.parse(d);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 推算一個月內向前或向後偏移多少天,當然推算年也可以使用
     * 
     * @param date
     *            要被偏移的日期,<br>
     *            amout 偏移量<br>
     *            b 是否先將date格式化爲yyyy-MM-dd 00:00:00 即: 是否嚴格按整天計算
     * @return java.util.Date
     * **/
    public static Date addDayOfMonth(Date date, Integer amount, Boolean b) {
        date = date == null ? new Date() : date;// 如果date爲null則取當前日期
        if (b) {
            date = startOfADay(date);
        }
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.DAY_OF_MONTH, amount);
        return cal.getTime();
    }

    /**
     * 推算一個小時內向前或向後偏移多少分鐘,除了秒、毫秒不可以以外,其他都可以
     * 
     * @param date
     *            要被偏移的日期,<br>
     *            amout 偏移量<br>
     *            b 是否先將date格式化爲yyyy-MM-dd HH:mm:00 即: 是否嚴格按整分鐘計算
     * @return java.util.Date
     * **/
    public static Date addMinuteOfHour(Date date, Integer amount, Boolean b) {
        date = date == null ? new Date() : date;// 如果date爲null則取當前日期
        if (b) {
            SimpleDateFormat simple = new SimpleDateFormat(
                    "yyyy-MM-dd HH:mm:00");
            try {
                date = simple.parse(simple.format(date));
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.MINUTE, amount);
        return cal.getTime();
    }

    public static void main(String[] args) {
        System.out.println(DateUtil.addMinuteOfHour(new Date(), 60, false));
    }
}

1.2【Base64Util.java】

String s = "這是一個待加密的字符串";
BASE64Encoder base64e = new BASE64Encoder();//base64加密的類對象
String s2 = base64e.encode(s.getBytes());//s2就是用base64加密後的字符串
BASE64Decoder base64d = new BASE64Decoder();//base64解密的類對象
byte b[] = base64d.decodeBuffer(s2);//★字符串經base64解密成byte數組
String s3 = new String(b);

1.3【MD5Util.java】MD5加密工具類

public class MD5Util {
    public static String encode(String message){
        try {
            MessageDigest md=MessageDigest.getInstance("md5");
            byte b[] = md.digest(message.getBytes());
            return new BASE64Encoder().encode(b);//sun.misc.BASE64Encoder;
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }
    }
}

1.4【IDGeneratorUtil.java】ID生成器/ID生成機制

///說明:一般在service層,在調用dao層的方法進行插入數據之前對id賦值,如:book.setId(IDGeneratorUtil.genPrimaryKey());
public class IDGeneratorUtil {
    public static String genPrimaryKey(){
        return UUID.randomUUID().toString();
    }
    //生成與當前時間有關係的ID號(用於訂單號的生成),20150302+毫秒值
    //System.nanoTime():得到當前時間的納秒值[JDK5.0以後]
    public static String genOrdersNum(){
        Date now = new Date();
        DateFormat df = new SimpleDateFormat("yyyyMMdd");
        String str = df.format(now)+System.currentTimeMillis();//得到當前時間的毫秒值
        return str;
    }
}

1.5【Dom4jUtils.java】

public class Dom4jUtils {
    private static String dbFilePath;
    static{//類加載器->得到資源->得到路徑
        ClassLoader c1=Dom4jUtils.class.getClassLoader();
        URL url=c1.getResource("users.xml");//模擬
        dbFilePath=url.getPath();//得到真實地址
    }
    //得到document
    public static Document getDocument() throws DocumentException{
        SAXReader reader = new SAXReader();
        return reader.read(dbFilePath);//注意該路徑不是Myeclipse下面的文件路徑,而是部署到tomcat後的路徑
    }
    public static void writer2xml(Document document) throws Exception{
        XMLWriter writer = new XMLWriter(new FileOutputStream(dbFilePath),OutputFormat.createPrettyPrint());
        writer.write(document);
        writer.close();
    } 
}

1.6【FormBeanUtil.java】表單頁面數據封裝類(用泛型),配合自定義的javabean使用,用於數據回顯

public class FormBeanUtil {
    public static <T>T fillFormBean(Class<T> clazz,HttpServletRequest request){
        try {
            T bean = clazz.newInstance();//創建需要類型的bean
            //★BeanUtils.populate()用來將一些 key-value 的值(例如 hashmap)映射到bean中的屬性
            BeanUtils.populate(bean, request.getParameterMap());
            return bean;//返回映射了數據的bean
        } catch(Exception e) {
            throw new RuntimeException(e);
        }
    }
}

數據庫相關

2.1【JdbcUtil.java】數據庫連接、釋放的工具類

/**【db.properties】內容
    driverClassName=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/custmanage
    user=root
    password=****
*/
public class JdbcUtil {
    private static String driverClassName;
    private static String  url;
    private static String  user;
    private static String password;

    static{
        try {
            //加載配置文件
            InputStream in = JdbcUtil.class.getClassLoader().getResourceAsStream("db.properties");
            Properties prop = new Properties();
            prop.load(in);
            //讀取配置文件的值
            driverClassName = prop.getProperty("driverClassName");
            url = prop.getProperty("url");
            user = prop.getProperty("user");
            password = prop.getProperty("password");
            Class.forName(driverClassName);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    //開啓數據庫連接
    public static Connection getConnection() throws Exception{
        return DriverManager.getConnection(url,user,password);
    }
    //釋放數據庫連接
    public static void release(ResultSet rs,PreparedStatement ps,Connection conn){
        if(rs!=null){
            try{
                rs.close();
            }catch(SQLException e){
                e.printStackTrace();
            }
            rs=null;
        }
        if(ps!=null){
            try{
                ps.close();
            }catch(SQLException e){
                e.printStackTrace();
            }
            ps=null;
        }
        if(conn!=null){
            try{
                conn.close();
            }catch(SQLException e){
                e.printStackTrace();
            }
            conn=null;
        }
    }
}

2.2 【DBCPUtil.java】數據連接池的工具類

  • 自定義數據庫連接池
public class DBCPUtil{
    private static DataSource ds;
    static{
        try {
            InputStream in = DBCPUtil.class.getClassLoader().getResourceAsStream("dbconfig.properties");
            Properties props = new Properties();
            props.load(in);
            ds = BasicDataSourceFactory.createDataSource(props);//★一句話代替JDBCUtil中的四句話
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static DataSource getDataSource(){
        return ds;
    }
}

2.3【EntityFactory.java】創建對象工廠模型

public class EntityFactory {
    public static <T> T getInstance(Class<T> t) {
        try {
            return (T)t.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

2.4【DaoFactory.java】模擬Spring容器的單例模式

//假設dao.properties內有內容:userDao =cn.hw.dao.impl.UserDaoMySQLImpl
//創建Dao具體事例的工廠
public class DaoFactory {//惡漢式單例類
    private static DaoFactory instance = new DaoFactory();
    private DaoFactory(){//構造方法私有,不允許別人生成該工廠
    }
    public static DaoFactory getInstance(){//自己new一個實例
        return instance;
    }
    private static String userDaoImplClassName;
    static {
        try {
            InputStream in = DaoFactory.class.getClassLoader().getResourceAsStream("dao.properties");
            Properties props= new Properties();
            props.load(in);
            userDaoImplClassName = props.getProperty("userDao");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public UserDao getUserDao(){
        try {
            return (UserDao)Class.forName(userDaoImplClassName).newInstance();
        } catch (Exception e) {
            throw new RuntimeException();
        }
    }
}

2.5【EntityDao.java】★★利用泛型重構dao層

/**注意:DaoImpl層要繼承該類,如:public class DepartmentDaoImpl extends BaseDaoImpl<Department> implements DepartmentDao<Department>{}
*/
//★★理解:在public後面寫<T> 是用來聲明T爲泛型標識符
public class EntityDao extends HibernateUtils{//在創建EntityDao時就應該傳值
    /**
     * 查找所有的數據
     * @param classt
     * @return
     */
    //沒寫工廠之前的寫法
    public <T> List<T> findAll(Class<T> t){
        Session session = sessionFactory.openSession();
        List<T> list = session.createQuery("from "+t.getName()).list();//★★注意from後面的空格
        session.close();
        return list;
    }
    public <T> T findById(Class<T> t,Serializable id){
        Session session = sessionFactory.openSession();
        T tobject = (T) session.get(t, id);
        session.close();
        return tobject;
    }
    public <T> void saveEntry(T t){
        Session session = sessionFactory.openSession();
        Transaction transaction = session.beginTransaction();
        session.save(t);
        transaction.commit();
        session.close();
    }
    public <T> void updateEntry(T t){
        Session session = sessionFactory.openSession();
        Transaction transaction = session.beginTransaction();
        session.update(t);
        transaction.commit();
        session.close();
    }
    public <T> void deleteEntry(Class<T> t,Serializable id){
        Session session = sessionFactory.openSession();
        Transaction transaction = session.beginTransaction();
        T tObject = this.findById(t, id);
        session.delete(tObject);
        transaction.commit();
        session.close();
    }
    public <T> T findUser(Class<T> t,String username,String password){
        Session session = sessionFactory.openSession();
        Query query = session.createQuery("from User where username=:username and password=:password");
        query.setString("username", username);
        query.setString("password",password);
        T tt = (T)query.uniqueResult();
        session.close();
        return tt;
    }
}
///泛型Dao層進行測試
public class EntityDaoTest extends HibernateUtils{
    @Test
    public void testfindAll(){
        EntityDao entityDao = new EntityDao();
        List<User> userList = entityDao.findAll(User.class);
        System.out.println(userList.size());
    }
    @Test
    public void testfindById(){
        EntityDao entityDao = EntityFactory.getInstance(EntityDao.class);
        User user = entityDao.findById(User.class,1L);
        System.out.println(user.getUsername());
    }
    @Test
    public void testsaveEntry(){
        EntityDao entityDao = EntityFactory.getInstance(EntityDao.class);
        User user = new User();
        user.setEmail("[email protected]");
        user.setPassword("1234");
        user.setPhone("186***");
        user.setSex("1");
        user.setUsername("hyc");
        entityDao.saveEntry(user);
    }
}

3. 框架使用

【BaseAction.java】Struts2框架用泛型基類Action:屬性驅動、指定常量

///封裝一些公用的內容,注意繼承ActionSupport。
/// ★★模型驅動: Action類實現ModelDriven<javaBean>,並實現其內未實現的方法getModel()
public class BaseAction<T> extends ActionSupport implements ModelDriven<T>{
    private String message;//處理ajax產生的異常信息
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
    private Class classt;
    public BaseAction(){
        ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass();
        this.classt = (Class) type.getActualTypeArguments()[0];
        try {
            this.t = (T) this.classt.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    private T t;
    public T getModel(){
        return this.t;
    }
    //跳轉到列表頁面
    public static final String LISTACTION = "listAction";
    //跳轉到添加頁面
    public static final String ADDUI = "addUI"; 
    //添加到修改頁面
    public static final String UPDATEUI = "updateUI";
    //action跳轉到action
    public static final String ACTION2ACTION = "action2action";
    public String listAction = LISTACTION;
    public String addUI = ADDUI;
    public String updateUI = UPDATEUI;
    public String action2action = ACTION2ACTION;
}

3.1【HibernateUtil.java】利用Hibernate建立sessionFactory的

public class HibernateUtil{
    public static SessionFactory sessionFactory;
    static{
        Configuration config = new Configuration();//源碼指定默認配置文件:hibernate.cfg.xml
        config.configure();
        sessionFactory = config.buildSessionFactory();
    }
}

3.2 【BaseDaoImpl.java】注入HibernateTemplate,實現CURD+RId

//★★★由於這裏的BaseDao中的參數T還不能具體確定,所以在BaseDaoImpl上面只能繼續T
public class BaseDaoImpl<T> implements BaseDao<T> {//★這裏的BaseDaoImpl<T>看成是被參數化的類型
    /**★★★
     * 這裏的BaseDaoImpl<T>無法給它new對象,但是這個類中卻可以用this,這個this代表的是BaseDaoImpl<T>的子類
     * 所以用ParameterizedType type = (ParameterizedType)this.getClass().getGenericSuperClass();
     * 可以得到將來有了子類的BaseDaoImpl<T>的類對象。但是這段代碼怎麼加在這個類中了?如果在本類中將其加在一個單獨的方法中
     * (如aa()),則誰繼承BaseDaoImpl,誰就要調用這個類中的aa()方法。這樣不合理。
     * 要求:子類創建對象時就要自動調用aa()方法,而不要單獨程序再調用aa()方法來執行這一步
     * 解決方案1:static語句塊,但是static語句塊中不能用this,因爲static語句塊是先於對象加載的。所以該方案不行
     * 解決方案2:B類繼承A類:則B類創建對象的時候會調用A類默認的無參構造函數
     */
    private Class classt;
    public BaseDaoImpl(){
        //★ParameterizedType就是泛型
        ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass();
        //★getActualTypeArguments()[0]就是得到<T>【看源碼】,把這個T轉成Class
        this.classt = (Class)type.getActualTypeArguments()[0];
    }
    @Resource(name="")//★註解可以代替get和set方法(下面的get和set方法可以不寫)
    public HibernateTemplate hibernateTemplate;//★★必須用public,因爲子類要用
    public HibernateTemplate getHibernateTemplate() {
        return hibernateTemplate;
    }
    public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
        this.hibernateTemplate = hibernateTemplate;
    }
    //得到所有實體對象的集合
    public Collection<T> getAllEntry() {
        return this.getHibernateTemplate().find("from "+this.classt.getName());
    }
    //依據Id得到實體對象
    public T getEntryById(Serializable id) {
        //★★這裏要傳T的class形式,但是T沒有class形式:【ParameterizedType】
        return (T)this.hibernateTemplate.get(classt, id);
    }
    //更新實體對象
    public void updateEntry(T t) {
        this.hibernateTemplate.update(t);
    }
    //保存實體對象
    public void saveEntry(T t) {
        this.hibernateTemplate.save(t);
    }
    //刪除實體對象
    public void deleteEntry(Serializable id) {
        T t = this.getEntryById(id);
        this.getHibernateTemplate().delete(t);
    }
}

3.3 【SpringInit.java】spring容器初始化的工具類

public class SpringInit {
    public static ApplicationContext context;
    static{
        context = new ClassPathXmlApplicationContext("applicationContext.xml");
    }
}
發佈了56 篇原創文章 · 獲贊 15 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章