赞
踩
Class.forName("com.mysql.jdbc.Driver");
通过DriverManager的getConnection方法,我们可以建立与数据库的连接。
String url = "jdbc:mysql://127.0.0.1:3306/myschool?useSSL=false";
String userName = "root";
String password = "123456";
Connection conn = DriverManager.getConnection(url,userName,password);
通过Connection对象的createStatement方法,我们可以创建一个Statement对象,用于执行SQL语句。
Statement stmt = conn.createStatement();
通过Statement对象的executeQuery或executeUpdate方法,我们可以执行SQL语句,获取结果或者更新数据库。
String sql = "SELECT COUNT(1) FROM USER";
ResultSet rs = stmt.executeQuery(sql);
对于查询操作,我们需要处理ResultSet结果集;对于更新操作,我们不需要处理结果。
int userCount = 0;
while (rs.next()){
//userCount = rs.getInt(1);
userCount = rs.getInt("count(1)");
}
System.out.println("该表中一共有" + userCount + "条记录!");
最后,我们需要关闭打开的资源,包括ResultSet、Statement和Connection。
if(rs!=null){
rs.close();
}
if(stmt!=null){
stmt.close();
}
if(conn!=null){
conn.close();
}
注入原理:利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句
PreparedStatement接口是Statement的子接口,你可以使用该接口来替换Statement接口。
/** * 用户登录 * @param userName 用户名 * @param userPass 用户密码 * @return */ public User toLogin(String userName,String userPass){ //1.获取连接对象 getConnection(); //2.编写SQL语句 String sql = "select ID,USERNAME,ROLE from user where userName = ? and userPass = ?"; System.out.println("要执行的SQL语句是:" + sql); //3.创建statement对象 User user = null; try { ps = connection.prepareStatement(sql); //3.1处理参数 ps.setString(1,userName); ps.setString(2,userPass); //4.执行并解析结果 resultSet = ps.executeQuery(); while (resultSet.next()){ user = new User(); user.setId(resultSet.getInt(1)); user.setUserName(resultSet.getString(2)); user.setRole(resultSet.getInt(3)); } } catch (SQLException e) { e.printStackTrace(); }finally { closeResource(); } return user; }
加载驱动、建立连接、关闭资源与业务无关。而业务中又要根据多个SQL的执行结果来进行业务处理,若代码全都放在一起,则:
采用面向接口编程,可以降低代码间的耦合性
把实体类转换为数据库中的记录,dao层也被成为数据访问层
信息存储在MySQL数据库中,但在开发和部署时有可能使用不同的数据库,也可能因为客户的需求而更换数据库产品。数据库连接信息直接写死在java代码中会导致切换麻烦,因此可以将这类信息写在外部的配置文件中,这样切换配置/环境时,不需要重新编译程序。
让用户脱离程序本身修改相关的变量设置——使用配置文件
private static String driverClassName; private static String url; private static String username; private static String password; static{ Properties properties = new Properties(); String path = "database.properties"; InputStream is = BaseDao.class.getClassLoader().getResourceAsStream(path); try { properties.load(is); } catch (IOException e) { e.printStackTrace(); } driverClassName = properties.getProperty("driverClassName"); url = properties.getProperty("url"); username = properties.getProperty("username"); password = properties.getProperty("password"); }
连接池自动分配连接对象并对闲置的连接进行回收
表示层、业务逻辑层、数据访问层
封装性原则:每个层次向外公开接口,但是隐藏内部细节
比如:钥匙开锁,只知道锁提供的接口,但不知道锁的内部细节
顺序访问原则:下一层为上一层服务,但不使用上层的服务
比如:盖楼时需要先打地基,地基为上层建筑服务,但不使用上层的服务
分层结构中,不同层之间通过实体类传输数据
package com.myschool.day05.base; import com.myschool.day05.config.DataSourceConfig; import java.io.IOException; import java.io.InputStream; import java.sql.*; import java.util.List; import java.util.Properties; /** * @author: zjl * @datetime: 2024/1/13 * @desc: */ public abstract class BaseDao { private static DataSourceConfig dataSourceConfig = DataSourceConfig.getInstance(); private static String driverClassName = dataSourceConfig.getValue("driverClassName"); private static String url = dataSourceConfig.getValue("url"); private static String username = dataSourceConfig.getValue("username"); private static String password = dataSourceConfig.getValue("password"); private PreparedStatement ps; public ResultSet rs; //1.加载驱动、创建数据库连接对象 public static Connection getConn(){ Connection conn = null; try { Class.forName(driverClassName); conn = DriverManager.getConnection(url,username,password); conn.setAutoCommit(false); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return conn; } //2.封装增删改的通用方法 public int executeUpdate(Connection conn, String sql, List<Object> params) throws SQLException { int line = 0; try { ps = conn.prepareStatement(sql); if(params!=null && !params.isEmpty()){ for (int i = 0; i < params.size(); i++) { ps.setObject((i + 1),params.get(i)); } } line = ps.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); }finally { close(); } return line; } //3.封装查询的通用方法 public ResultSet executeQuery(Connection conn, String sql, List<Object> params) throws SQLException { ps = conn.prepareStatement(sql); if(params!=null && !params.isEmpty()){ for (int i = 0; i < params.size(); i++) { ps.setObject((i + 1),params.get(i)); } } rs = ps.executeQuery(); return rs; } //4.关闭链接 public void close() throws SQLException { if(rs!=null){ rs.close(); } if(ps!=null){ ps.close(); } } }
package com.myschool.day05.config; import java.io.IOException; import java.io.InputStream; import java.util.Properties; /** * @author: zjl * @datetime: 2024/1/13 * @desc: */ public class DataSourceConfig { private static DataSourceConfig dataSourceConfig; private Properties properties; private DataSourceConfig(){ properties = new Properties(); String path = "database.properties"; InputStream is = DataSourceConfig.class.getClassLoader().getResourceAsStream(path); try { properties.load(is); } catch (IOException e) { e.printStackTrace(); } } public static DataSourceConfig getInstance(){ if(dataSourceConfig == null){ synchronized (DataSourceConfig.class){ if(dataSourceConfig == null){ dataSourceConfig = new DataSourceConfig(); } } } return dataSourceConfig; } public String getValue(String key){ return properties.getProperty(key); } }
package com.myschool.day05.config; import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSource; import java.io.IOException; import java.sql.Connection; import java.util.Properties; /** * @author: zjl * @datetime: 2024/1/16 * @desc: */ public class DruidDataSourceConfig { private static DruidDataSourceConfig dataSourceConfig; private Properties properties; private static DataSource dataSource; public DruidDataSourceConfig(){ properties = new Properties(); try { properties.load(DruidDataSourceConfig.class.getClassLoader().getResourceAsStream("database.properties")); dataSource = DruidDataSourceFactory.createDataSource(properties); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } public static DruidDataSourceConfig getInstance(){ if(dataSourceConfig == null){ synchronized (DruidDataSourceConfig.class){ if (dataSourceConfig == null) { dataSourceConfig = new DruidDataSourceConfig(); } } } return dataSourceConfig; } public Connection getConnection() { try { Connection connection = dataSource.getConnection(); connection.setAutoCommit(false); return connection; } catch (Exception e) { e.printStackTrace(); } return null; } }
package com.myschool.day05.vo; /** * @author: zjl * @datetime: 2024/1/13 * @desc: */ public class ResponseResult<T> { //private boolean success;//响应状态 private int code;//响应码 private String msg;//响应信息 private T data;//响应数据 //有响应数据的模板方法 public ResponseResult(int code, String msg, T data) { this.code = code; this.msg = msg; this.data = data; } //无响应数据的模板方法 public ResponseResult(int code, String msg) { this.code = code; this.msg = msg; } public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public T getData() { return data; } public void setData(T data) { this.data = data; } }
package com.myschool.day05.pojo; /** * @author: zjl * @datetime: 2024/1/10 * @desc: */ public class User { private int id; private String userName; private String userPass; private int role; public User(int id, String userName, String userPass, int role) { this.id = id; this.userName = userName; this.userPass = userPass; this.role = role; } public User() { } 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 getUserPass() { return userPass; } public void setUserPass(String userPass) { this.userPass = userPass; } public int getRole() { return role; } public void setRole(int role) { this.role = role; } @Override public String toString() { return "User{" + "id=" + id + ", userName='" + userName + '\'' + ", userPass='" + userPass + '\'' + ", role=" + role + '}'; } }
package com.myschool.day05.dao; import com.myschool.day05.pojo.User; import java.sql.Connection; import java.sql.SQLException; import java.util.List; public interface UserDao { User selectUserByUserNameAndUserPass(Connection conn,String userName, String userPass) throws SQLException; List<User> selectUserByUserNameAndRole(Connection conn,String keyWords,int role) throws SQLException; int updateUserPassById(Connection conn,User user) throws SQLException; } package com.myschool.day05.dao.impl; import com.myschool.day05.base.BaseDao; import com.myschool.day05.dao.UserDao; import com.myschool.day05.pojo.User; import com.mysql.jdbc.StringUtils; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * @author: zjl * @datetime: 2024/1/13 * @desc: */ public class UserDaoImpl extends BaseDao implements UserDao { @Override public User selectUserByUserNameAndUserPass(Connection conn, String userName, String userPass) throws SQLException { String sql = "SELECT ID,USERNAME,ROLE FROM USER WHERE USERNAME = ? AND USERPASS=?"; List<Object> params = new ArrayList<>(); Collections.addAll(params,userName,userPass); User user = null; try { rs = executeQuery(conn,sql,params); while (rs.next()){ user = new User(); user.setId(rs.getInt(1)); user.setUserName(rs.getString(2)); user.setRole(rs.getInt(3)); } }finally { this.close(); } return user; } /** * 如果 keyWords为null,role==0 表示查询全部 * 如果 keyWords为null,role!=0 表示按照role查询 * 如果 keyWords不为null,role==0 表示按照userName模糊查询 * 如果 keyWords不为null,role!=0 表示按照userName模糊查询并且按照role查询 * @param conn * @param keyWords * @param role * @return * @throws SQLException */ @Override public List<User> selectUserByUserNameAndRole(Connection conn,String keyWords,int role) throws SQLException { //String sql = "SELECT * FROM USER WHERE 1=1"; StringBuffer sbf = new StringBuffer("SELECT * FROM USER WHERE 1=1"); List<User> userList = new ArrayList<>(); try { List<Object> params = new ArrayList<>(); //if(keyWords!=null && keyWords.trim().length()>0){ if(!StringUtils.isNullOrEmpty(keyWords)){ sbf.append(" AND USERNAME LIKE CONCAT('%',?,'%') "); params.add(keyWords); } if(role != 0){ sbf.append(" AND ROLE = ?"); params.add(role); } System.out.println("动态的SQL语句是:" + sbf.toString()); rs = executeQuery(conn,sbf.toString(),params); User user = null; while (rs.next()){ user = new User(); user.setId(rs.getInt(1)); user.setUserName(rs.getString(2)); user.setUserPass(rs.getString(3)); user.setRole(rs.getInt(4)); userList.add(user); } }finally { close(); } return userList; } @Override public int updateUserPassById(Connection conn,User user) throws SQLException { String sql = "UPDATE USER SET USERPASS=? WHERE ID=?"; List<Object> params = new ArrayList<>(); Collections.addAll(params,user.getUserPass(),user.getId()); int line = executeUpdate(conn,sql,params); return line; } }
package com.myschool.day05.service; import com.myschool.day05.pojo.User; import com.myschool.day05.vo.ResponseResult; import java.util.List; public interface UserService { /** * 用户登录的业务 * @param userName * @param userPass * @return */ ResponseResult<User> login(String userName,String userPass); ResponseResult<List<User>> getUserList(String keyWords,int role); ResponseResult modifyPassword(User user); } package com.myschool.day05.service.impl; import com.myschool.day05.base.BaseDao; import com.myschool.day05.config.DruidDataSourceConfig; import com.myschool.day05.dao.UserDao; import com.myschool.day05.dao.impl.UserDaoImpl; import com.myschool.day05.pojo.User; import com.myschool.day05.service.UserService; import com.myschool.day05.vo.ResponseResult; import org.apache.log4j.Logger; import java.sql.Connection; import java.sql.SQLException; import java.util.List; /** * @author: zjl * @datetime: 2024/1/13 * @desc: */ public class UserServiceImpl implements UserService { Logger log = Logger.getLogger(UserServiceImpl.class); UserDao userDao = new UserDaoImpl(); @Override public ResponseResult<User> login(String userName, String userPass) { log.info("登录请求:"+userName+" "+userPass); //Connection conn = BaseDao.getConn(); Connection conn = DruidDataSourceConfig.getInstance().getConnection(); try { User user = userDao.selectUserByUserNameAndUserPass(conn,userName,userPass); //System.out.println(5/0); log.info("登录信息是:" + user); if(user!=null){ return new ResponseResult<>(200,"登录成功!",user); } return new ResponseResult<>(0,"登录失败!"); }catch (Exception e){ log.error("程序异常,异常信息为:" + e); e.printStackTrace(); return new ResponseResult<>(500,"程序错误!"); }finally { try { if (conn!=null) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } } @Override public ResponseResult<List<User>> getUserList(String keyWords,int role) { Connection conn = BaseDao.getConn(); try { List<User> userList = userDao.selectUserByUserNameAndRole(conn,keyWords,role); if(userList!=null && !userList.isEmpty()){ return new ResponseResult<>(200,"查询用户列表成功!",userList); } return new ResponseResult<>(0,"查询用户列表失败!"); }catch (Exception e){ e.printStackTrace(); }finally { try { if (conn!=null) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } return new ResponseResult<>(500,"程序异常!"); } @Override public ResponseResult modifyPassword(User user) { Connection conn = BaseDao.getConn(); try { int line = userDao.updateUserPassById(conn,user); if (line > 0){ conn.commit(); return new ResponseResult(200,"密码修改成功!请重新登陆!"); } return new ResponseResult(0,"密码修改失败!请检查数据!"); }catch (Exception e){ e.printStackTrace(); }finally { try { if (conn!=null) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } try { conn.rollback(); } catch (SQLException e) { e.printStackTrace(); } return new ResponseResult(500,"程序错误!"); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。