手机扫码查看
2020Javaweb教程之JDBC应用
封装工具类:
1.重用性方案
package Utils;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class DBUtils {
private static Connection connection=null;
private static String url="jdbc:mysql://localhost:3306/demo2";
private static String username="root";
private static String password="root";
//类加载触发 注册驱动
static{
try{
Class.forName("com.mysql.jdbc.Driver");
}catch (Exception e){}
}
//获取connection连接对象
public static Connection getConnection(){
try{
connection= DriverManager.getConnection(url,username,password);
return connection;
}catch (Exception e){}
return null;
}
//释放资源
public static void closeAll(ResultSet rs, Statement s,Connection c){
try{
if (rs != null) {
rs.close();
}
if (s != null) {
s.close();
}
if (c != null) {
c.close();
}
}catch (Exception e){}
}
}
2.跨平台方案
db.properties配置文件:
#连接设置 driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/demo2?useUnicode=true&characterEncoding=utf-8 username=root password=1234 #<!-- 初始化连接 --> initialSize=10 #最大连接数量 maxActive=50 #<!-- 最小空闲连接 --> minIdle=5 #<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 --> maxWait=5000
工具类
package Utils;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Properties;
public class DBUtils {
private static Connection connection=null;
private static String driver;
private static String url;
private static String username;
private static String password;
//类加载触发 注册驱动
static{
try{
Properties properties=new Properties();
properties.load(DBUtils.class.getClassLoader().getResourceAsStream("database.properties"));
driver=properties.getProperty("driver");
url= properties.getProperty("url");
username=properties.getProperty("username");
password=properties.getProperty("password");
Class.forName(driver);
}catch (Exception e){}
}
//获取connection连接对象
public static Connection getConnection(){
try{
connection= DriverManager.getConnection(url,username,password);
return connection;
}catch (Exception e){}
return null;
}
//释放资源
public static void closeAll(ResultSet rs, Statement s,Connection c){
try{
if (rs != null) {
rs.close();
}
if (s != null) {
s.close();
}
if (c != null) {
c.close();
}
}catch (Exception e){}
}
}
ResultSet查询封装
ORM(Object Relational Mapping) 实体类(entity):零散数据的载体
从ResultSet中get相应的字段值后调用实体对象的对应的属性的set方法,把值保存在实体对象中。
实体类:包名entity,类名为表名且首字母大写,如类名user,类名为User
包含属性、构造方法和set/get方法以及toString()方法
import Utils.DBUtils;
import entity.Student;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
public class TestDql {
public static void main(String[] args) {
Connection connection=null;
PreparedStatement ps=null;
ResultSet rs=null;
List<Student> list=new ArrayList<Student>();
try{
connection=DBUtils.getConnection();
String sql="select*from student";
ps=connection.prepareStatement(sql);
rs=ps.executeQuery();
while (rs.next()) {
int sid = rs.getInt(1);
String sname = rs.getString(2);
int sage = rs.getInt(3);
String ssex = rs.getString(4);
Date birthday = rs.getDate(5);
double score = rs.getDouble(6);
Student s=new Student();
s.setSid(sid);
s.setSname(sname);
s.setSage(sage);
s.setSsex(ssex);
s.setBirthday(birthday);
s.setScore(score);
list.add(s);
System.out.println(s);
}
}catch (Exception e){}finally {
DBUtils.closeAll(rs,ps,connection);
}
}
}
DAO模式
工具类封装:实现对表的增删改查
DAO设计模式
DAO(Database Access Object)数据库访问对象
为了降低耦合性,提出了DAO封装数据库操作的设计模式。实现业务逻辑与数据库访问相分离
DAO模式的组成部分
1.DAO接口:增删改查
2.DAO实现类
3.实体类:entity
4.数据库连接和关闭工具类
包名:
entity实体类、utils工具类、dao存放接口、dao.impl 存放实现类、service业务层接口、service.impl业务实现、view视图层
使用DAO设计模式实现对表的 增删改查
实体类entity:User
私有属性、构造方法、set/get方法、toString()方法
接口dao:UserDao
查询所有:List<User> findAll();
查询单个:User getUser(int id);
新增数据:void add(User u);
删除数据:void delete(int id);
修改数据:void update(User u);
接口实现类:UserDaoImpl
实现UserDao接口,重写接口方法,执行DML语句以及DQL
业务层接口service:UserService
接口方法与DAO层一致
业务层实现类:UserServiceImpl
创建UserDao接口对象引用UserDaoImpl实现类对象:
private UserDao userdao=new UserDaoImpl();
方法返回值 是 userdao.方法名
视图层view:展示菜单
import DAO.StudentDao;
import DAO.impl.StudentDaoIimpl;
import entity.Student;
import java.text.*;
import java.util.*;
public class View {
private static StudentDao sd=new StudentDaoIimpl();
private static Scanner sc=new Scanner(System.in);
public static void main(String[] args) {
System.out.println("1.查看所有学生信息 2.查看指定学生信息 3.新增学生信息\n 4.删除指定学生信息 5.修改指定学生信息");
System.out.println("请选择你要的操作");
int n=sc.nextInt();
switch (n){
case 1:showAll();
break;
case 2:getId();
break;
case 3:add();
break;
case 4:delete();
break;
case 5:update();
break;
default:break;
}
}
public static void showAll(){
List<Student> all = sd.findAll();
for (Student student : all) {
System.out.println(student);
}
}
public static void getId(){
System.out.println("请输入你要查询的学生编号");
int id=sc.nextInt();
System.out.println(sd.getStudent(id));
}
public static void add(){
Student s = info();
int add = sd.add(s);
if(add>0) System.out.println("新增成功");
else System.out.println("新增失败");
}
public static void delete(){
System.out.println("请输入学生编号");
int n=sc.nextInt();
int delete = sd.delete(n);
if(delete>0) System.out.println("删除成功");
else System.out.println("删除失败");
}
public static Student info() {
Student s=null;
System.out.println("请输入姓名");
String sname=sc.next();
System.out.println("请输入年龄");
int sage=sc.nextInt();
System.out.println("请输入性别");
String ssex=sc.next();
System.out.println("请输入生日,如19951113");
String birthday=sc.next();
System.out.println("请输入成绩");
double score=sc.nextDouble();
String s1 = birthday.substring(0,4);
String s2 = birthday.substring(4, 6);
String s3 = birthday.substring(6,8);
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
Date date= null;
try {
date = sdf.parse(s1+"-"+s2+"-"+s3);
} catch (ParseException e) {
e.printStackTrace();
}
s=new Student();
s.setSname(sname);
s.setSage(sage);
s.setSsex(ssex);
s.setBirthday(date);
s.setScore(score);
return s;
}
public static void update(){
Student s = info();
System.out.println("请输入要更改的学生编号");
int sid=sc.nextInt();
s.setSid(sid);
int update = sd.update(s);
if(update>0) System.out.println("修改成功");
else System.out.println("修改失败");
}
}
Druid连接池
为什么要使用连接池?
用户每次请求都需要向数据库获得连接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长。假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出、宕机。
现流行的有:DBCP、C3P0、Druid等
Druid连接池简介:
Druid 是目前比较流行的高性能的,分布式列存储的OLAP框架(具体来说是MOLAP)。
Druid连接池五大特点:
1.亚秒级查询
druid提供了快速的聚合能力以及亚秒级的OLAP查询能力,多租户的设计,是面向用户分析应用的理想方式。
2.实时数据注入
druid支持流数据的注入,并提供了数据的事件驱动,保证在实时和离线环境下事件的实效性和统一性
3.可扩展的PB级存储
druid集群可以很方便的扩容到PB的数据量,每秒百万级别的数据注入。即便在加大数据规模的情况下,也能保证时其效性
4.多环境部署
druid既可以运行在商业的硬件上,也可以运行在云上。它可以从多种数据系统中注入数据,包括hadoop,spark,kafka,storm和samza等
5.丰富的社区
druid拥有丰富的社区,供大家学习
使用Druid连接池:
package Utils;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import java.sql.*;
import java.util.Properties;
public class DBUtils{
private static DruidDataSource dataSource;
static{
Properties properties=new Properties();
try {
properties.load(DBUtils.class.getClassLoader().getResourceAsStream("database.properties"));
dataSource= (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
}
public static DruidDataSource getDataSource(){
return dataSource;
}
public static void closeAll(ResultSet rs, Statement s, Connection c){
try{
if (rs != null) {
rs.close();
}
if (s != null) {
s.close();
}
if (c != null) {
c.close();
}
}catch (Exception e){}
}
}
- 本页地址 https://www.9713job.com/?p=2368
- 上一篇 <<2020Javaweb教程之JDBC总结
- 下一篇 >>得了肾病能吃豆制品吗?



发表回复