zoukankan      html  css  js  c++  java
  • java模拟生日发祝福

    1.新建customer表生日都选为当天

    所需jar包

    2.使用c3p0连接到数据的xml配置文件

    3.连接数据库的工具类

    package com.cc.birthday;
    
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    import javax.sql.DataSource;
    
    import com.mchange.v2.c3p0.ComboPooledDataSource;
    
    public class DataSourceUtils {
        private static DataSource dataSource=new ComboPooledDataSource();
        
        private static ThreadLocal<Connection> t1=new ThreadLocal<Connection>();
        
        //直接可以获取一个连接池
        public static DataSource getDataSource(){
            return dataSource;
        }
        
        //获取连接对象
        public static Connection getConnection() throws SQLException{
            Connection con=t1.get();
            if(con==null){
                con=dataSource.getConnection();
                t1.set(con);
            }
            return con;
        }
        
        //开启事务
        public static void startTrasaction() throws SQLException {
            Connection con=getConnection();
            if(con!=null){
                con.setAutoCommit(false);
            }
        }
        
        //事务回滚
        public static void rollback() throws SQLException{
            Connection con =getConnection();
            if(con!=null){
                con.rollback();
            }
        }
        
        //提交并且 关闭资源及从ThreadLocal中释放
        public static void commitAndRelease() throws SQLException{
            Connection con=getConnection();
            if(con!=null){
                con.commit();
                con.close();
                t1.remove();
            }
        }
        
        //关闭资源方法
        public static void closeConnection() throws SQLException{
            Connection con=getConnection();
            if(con!=null){
                con.close();
            }
        }
        
        public static void closeStatement(Statement st) throws SQLException {
            if(st!=null){
                st.close();
            }
        }
        
        public static void closeResultSet(ResultSet rs) throws SQLException{
            if(rs!=null){
                rs.close();
            }
        }
        
    }

    4.发送邮件的工具类

    package com.cc.mail;
    
    import java.util.Properties;
    
    import javax.mail.Authenticator;
    import javax.mail.Message;
    import javax.mail.MessagingException;
    import javax.mail.PasswordAuthentication;
    import javax.mail.Session;
    import javax.mail.Transport;
    import javax.mail.internet.AddressException;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeMessage;
    import javax.mail.internet.MimeMessage.RecipientType;
    
    public class MailUtils {
    
        //email:邮件发给谁  subject:主题  emailMsg:邮件的内容
        public static void sendMail(String email, String subject, String emailMsg)
                throws AddressException, MessagingException {
            
            // 1.创建一个程序与邮件服务器会话对象 Session
            Properties props = new Properties();
            props.setProperty("mail.transport.protocol", "SMTP");//发邮件的协议
            props.setProperty("mail.host", "smtp.163.com");//发送邮件的服务器地址
            props.setProperty("mail.smtp.auth", "true");// 指定验证为true
    
            // 创建验证器
            Authenticator auth = new Authenticator() {
                public PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication("emailusername", "password");//发邮件的账号的验证
                }
            };
    
            Session session = Session.getInstance(props, auth);
    
            // 2.创建一个Message,它相当于是邮件内容
            Message message = new MimeMessage(session);
    
            message.setFrom(new InternetAddress("xxxxxx@163.com")); // 设置发送者
    
            message.setRecipient(RecipientType.TO, new InternetAddress(email)); // 设置发送方式与接收者
    
            message.setSubject(subject);//邮件的主题
    
            message.setContent(emailMsg, "text/html;charset=utf-8");
    
            // 3.创建 Transport用于将邮件发送
            Transport.send(message);
        }
    }

    5.customer实体类

    package com.cc.birthday;
    
    public class Customer {
        private int id;
        private String username;
        private String password;
        private String realname;
        private String birthday;
        private String email;
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        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 getRealname() {
            return realname;
        }
        public void setRealname(String realname) {
            this.realname = realname;
        }
        public String getBirthday() {
            return birthday;
        }
        public void setBirthday(String birthday) {
            this.birthday = birthday;
        }
        public String getEmail() {
            return email;
        }
        public void setEmail(String email) {
            this.email = email;
        }
        
        
    }    

    6.根据数据库查询结果使用调度器定时发送祝福邮件

    package com.cc.birthday;
    
    import java.sql.SQLException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.List;
    import java.util.Timer;
    import java.util.TimerTask;
    
    import javax.mail.MessagingException;
    import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;
    
    import org.apache.commons.dbutils.QueryRunner;
    import org.apache.commons.dbutils.handlers.BeanListHandler;
    
    import com.cc.birthday.Customer;
    import com.cc.mail.MailUtils;
    
    public class BirthdayListener implements ServletContextListener{
    
        @Override
        public void contextInitialized(ServletContextEvent sce) {
            // 当web应用启动开启任务调动---功能在用户的生日当天发送邮件
            //开启一个定时器
            Timer timer=new Timer();
            timer.scheduleAtFixedRate(new TimerTask() {
                
                @Override
                public void run() {
                    // 为当前的生日的用户发邮件
                    //1.获得今天过生日的人
                    //获得今天的日期
                    SimpleDateFormat format=new SimpleDateFormat("MM-dd");
                    String currentDate=format.format(new Date());
                    //根据当前时间从数据库查询今天过生日的人
                    QueryRunner qr=new QueryRunner(DataSourceUtils.getDataSource());
                    String sql="select * from customer where birthday like ?";
                    List<Customer> customerList=null;
                    try {
                         customerList = qr.query(sql, new BeanListHandler<Customer>(Customer.class),"%"+currentDate);
                    } catch (SQLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    //2.发邮件
                    if(customerList!=null&&customerList.size()>0){
                        for(Customer c:customerList){
                        String emailMsg="亲爱的:"+c.getRealname()+",生日快乐!";
                        try {
                            MailUtils.sendMail(c.getEmail(), "happy..birthday", emailMsg);
                            System.out.println(c.getRealname()+"邮件发送完毕");
                        } catch (MessagingException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        }
                    }
                }
            },new Date(),10*1000);
            //实际开发中起始时间是一个固定的时间
            //实际开发中间隔时间是1天
        }
    
        @Override
        public void contextDestroyed(ServletContextEvent sce) {
            // TODO Auto-generated method stub
            
        }
        
    }

  • 相关阅读:
    Oracle(创建序列)
    BoostrapValidator使用方法
    SpringBoot(八)----SpringBoot配置日志文件
    SpringBoot(七)-----查看配置报告
    eclipse导入新项目后,运行时找不到主类解决办法(转载)
    严重性代码说明项目文件行 禁止显示状态错误 C4996 fopen('fscanf'、strcmp):This function or variable may be unsafe. 最全解决办法
    Spring Boot(六)----application.properties文件加载顺序
    No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?
    异常处理(一):Non-parseable POM C:Usersadmin.m2 epositoryorgspringframework问题解决方案
    Spring Boot(五)----profile文件路径设置
  • 原文地址:https://www.cnblogs.com/benjamin77/p/9234872.html
Copyright © 2011-2022 走看看