- 帮朋友写的一个作业,在这里记录一下,用久了springboot框架竟然忘记了以前都是怎么连接数据库的了。
- 需求
- 需要用户登录成功后才能进行操作
- 用户登陆成功后在控制台显示“现在可以写你的日记了!”(要求可以多行输入,在输入save之后把用户ID,输入时间,输入内容进行存储)
- 存储之后程序继续等待,用户输入scan之后查询出当前用户的所有日记
现在开始写代码,先创建个项目,把需要的jar包加入项目,创建数据库连接工具类,创建连接池配置数据库
创建两个bean
public class Notes {
//pknumber private Integer id;
//日记 private String note;
//日记时间 private Date notedate;
//与用户ID相关联 private Integer userid; //get and set // tostring }
public class User {
//pknumber private Integer id;
//用户名 private String username;
//密码 private String password; //get and set // tostring }
创建daoutils
package com.yaobin.util; import java.beans.BeanInfo; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; import javax.sql.DataSource; import com.alibaba.druid.pool.DruidDataSourceFactory; public class DAOUtil { private static DataSource dataSource; static { try { Properties p = new Properties(); p.load(DAOUtil.class.getClassLoader().getResourceAsStream("druid.properties")); dataSource = DruidDataSourceFactory.createDataSource(p); } catch (Exception e) { e.printStackTrace(); } } /*** * 加载驱动和获取连接对象 */ public static Connection getConnection(){ try { return dataSource.getConnection(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } public static int executeUpdate(String sql,Object... obj){ Connection conn = null; PreparedStatement ps = null; try { conn = DAOUtil.getConnection(); ps = conn.prepareStatement(sql); for (int i = 0; i < obj.length; i++) { ps.setObject(i+1, obj[i]); } return ps.executeUpdate(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ //关闭资源化 close(null, ps, conn); } return 0; } /*** * 只负责查询 并将查询的结果返回 * @param sql * @param obj * @return List<Map> */ public static List< Map<String, Object> > executeQuery(String sql,Object... obj){ Connection conn = null; PreparedStatement ps = null; ResultSet set = null; try { conn = DAOUtil.getConnection(); ps = conn.prepareStatement(sql); for (int i = 0; i < obj.length; i++) { ps.setObject(i+1, obj[i]); } set = ps.executeQuery();//不一样的表 查询出来的 set 不一样 int count = set.getMetaData().getColumnCount(); List<Map<String, Object>> list = new ArrayList<>(); while(set.next()){ Map<String,Object> map = new HashMap<>(); int count = set.getMetaData().getColumnCount(); for(int i=1;i<=count;i++){ Object value = set.getObject(i); String key = set.getMetaData().getColumnName(i); map.put(key, value); } // 将 map 添加到 list中 list.add(map); } return list; } catch (SQLException e) { e.printStackTrace(); } finally { close(set, ps, conn); } return null; } public static <T> List<T> selectList(String sql,Class<T> c,Object... args){ List < Map <String, Object> > data = executeQuery(sql, args); List <T> list = new ArrayList <>(); for (Map <String, Object> map : data) { try { T obj = c.newInstance();//反射创建c类型的对象 User obj = new User() BeanInfo info = Introspector.getBeanInfo(obj.getClass());//javabean内省机制获取c这个类的信息 PropertyDescriptor[] pro = info.getPropertyDescriptors();//获取c这个类的属性列表 //遍历所有的属性 for (PropertyDescriptor p : pro) { String name = p.getName();//获取属性的名字 //根据属性名去set中取数据并判断是否取到数据 if( map.get(name) != null){ //如果取到 就调用该属性的set方法 将获取的value赋值给该属性 p.getWriteMethod().invoke(obj, map.get(name)); } } //将封装后的实体对象放入到list 中 list.add(obj); } catch (Exception e) { e.printStackTrace(); } } return list; } /** * 关闭连接 */ public static void close(ResultSet set, Statement st, Connection conn) { try { if (set != null) { set.close(); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { if (st != null) { st.close(); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { if (conn != null) { conn.close(); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } /** * @param sql * @param obj * @return 插入数据并获取自增的主键 */ public static int updateGetKey(String sql,Object...obj){ Connection connection=getConnection(); PreparedStatement ps=null; ResultSet rs=null; try { ps=connection.prepareStatement(sql,1); if(null!=obj&&obj.length>0){//给没个?设置参数 for (int i = 0; i < obj.length; i++) { ps.setObject(i+1, obj[i]); } } ps.executeUpdate(); rs=ps.getGeneratedKeys(); int key=0; if (rs.next()) { key=rs.getInt(1); } return key; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ close(rs, ps, connection); } return 0; } }
配置数据库连接池
driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/数据库名称?useOldAliasMetadataBehavior=true&useUnicode=true&characterEncoding=utf-8 username=用户名 password=密码
现在开始主方法,
- 登录方法
- 记录用户输入的用户名以及密码,去数据库查询有没有此条记录,判断返回结果是否为空以及长度是否大于0,条件不满足则重新调用自身
- 日记录入数据库方法
- 利用scancer获取用户在控制台的输入信息,如果不是save,就使用stringbuffer不断拼接,如果是save,结束方法,存入数据库
- 查询方法
- 利用登录方法中返回的用户的ID,以此ID为条件去数据库查询,显示用户输入的所有日记
package com.yaobin.function; import java.util.Date; import java.util.List; import java.util.Map; import java.util.Scanner; import com.yaobin.beans.Notes; import com.yaobin.beans.User; import com.yaobin.util.DAOUtil; public class Entrance { static User user; static Scanner sc; static Boolean login; public static void main(String[] args) { Entrance entrance = new Entrance(); entrance.login(); entrance.write(); entrance.selectAll(); } public void write() { String input = ""; StringBuffer noteCache = new StringBuffer(); System.out.println("现在可以写你的日记了 !"); while (true) { input = sc.nextLine(); if (!input.equals("save")) { noteCache.append(input + ","); }else { break; } } noteCache.deleteCharAt(noteCache.length() - 1).append("。"); String insertSql = "INSERT note(note,notedate,userid) VALUES(?,now(),?)"; int executeUpdate = DAOUtil.executeUpdate(insertSql, new String( noteCache), user.getId()); if (executeUpdate > 0) { System.out.println(" "); System.out.println("日记存入成功"); } }
/** * 根据ID查询 * * @param id */ private void selectAll() { String sql = "SELECT * from note where userid = ?"; System.out.println("输入scan打印您的日记,输入其他任意符号结束程序"); if (sc.nextLine().equals("scan")) { List<Notes> note = DAOUtil.selectList(sql, Notes.class, user.getId()); for (Notes notes : note) { System.out.println(notes); } } else { System.out.println("程序到此结束"); } } /** * 登录方法 * * @param username * @param password */ private Boolean login() { sc = new Scanner(System.in); user = new User(); System.out.print("请输入用戶名:"); user.setUsername(sc.nextLine()); System.out.print("请输入密码:"); user.setPassword(sc.nextLine()); String loginsql = "SELECT * from user where username = ? and password = ?"; List<Map<String, Object>> executeQuery = DAOUtil.executeQuery(loginsql, user.getUsername(), user.getPassword()); if (executeQuery != null && executeQuery.size() != 0) { System.out.println("用户:" + user.getUsername() + "登录成功"); Integer id = (Integer) executeQuery.get(0).get("id"); user.setId(id); return true; } else { System.out.println("用户名或密码错误,请重新登录"); login(); } return null; } }
效果