JDBC连接数据库
步骤:
Connection连接对象,
PreparedStatementsql操作独对象,
ResultSet结果集对象
2.加载数据库驱动
3.定义sql语句
4.获取预处理statement
5.设置查询参数
5.从结果集中取出数据
package com.mybatis.jdbc.JDBCUtil;
import com.mybatis.jdbc.pojo.Emp;
import java.sql.*;
public class JDBC {
public static void main(String[] args) {
Connection cOnnection=null;
PreparedStatement preparedStatement=null;
ResultSet resultSet=null;
try {
Class.forName("com.mysql.jdbc.Driver");
cOnnection= DriverManager.getConnection("jdbc:mysql://localhost:3306/tr18lx","root","333");
String sql="select * from emp where JOB=?";
preparedStatement= connection.prepareStatement(sql);
preparedStatement.setString(1,"job");
resultSet = preparedStatement.executeQuery();
while(resultSet.next()){
int empno=resultSet.getInt("empno");
String ename=resultSet.getString("ename");
String job=resultSet.getString("job");
int mgr=resultSet.getInt("mgr");
String hiredate=resultSet.getString("hiredate");
int sal=resultSet.getInt("sal");
int comm=resultSet.getInt("comm");
int deptno=resultSet.getInt("deptno");
Emp emp = new Emp();
emp.setEmpno(empno);
emp.setComm(comm);
emp.setDeptno(deptno);
emp.setEname(ename);
emp.setHiredate(hiredate);
emp.setJob(job);
emp.setMgr(mgr);
emp.setSal(sal);
String s = emp.toString();
System.out.println(s);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
JDBC问题分析:
硬编码问题,参数设置,获取结果集,sql语句,数据库配置信息存在硬编码。
频繁创建释放数据连接。
手动封装结果集较为繁琐。
解决:1.使用配置文件,将参数放在配置文件中。把经常发生改变的 信息和不经常改变的信息放在不同的文件中。
2.使用连接池
3.使用反射,内省,将结果集自动映射到实体类中。
自定义持久层框架:
思路:
客户端:引入自定义持久层框架的jar包
提供两部分配置信息:数据库配置信息,sql配置信息(sql语句,参数类 型,返回值类型)。使用配置文件提供这两部分信息。
sqlMapConfig.xml,存放mapper.xml的全路径。在加载时只需要一次
mapper.xml
服务端:本质就是对JDBC代码进行了封装。
1.加载配置文件 加载成流,存储在内存中。
创建Resources类 方法:InputSteam getResourcesAsSteam(String path)
2.加载完配置信息后,创建两个JavaBean存放配置信息。(容器对象)
Configuration核心配置类:存放sqlMapConfig.xml解析出来的内容。
MapperStatement映射配置类:映射配置文件类,存放mapper.xml映射出来的内容。
3.解析配置文件 dom4j
创建类:SqlSessionFactoryBuide 方法:buider(InputStream input)
a.使用dom4j解析配置文件,将解析出来的内容放到bean中
b.创建SQLSessionFactory对象:生产sqlSession:会话对象(工厂模式)
4. 创建SqlSessionFactory接口及实现类DefaultSqlSessionFactory
openSession():主要作用就是创建sqlSession对象。
5.创建SqlSession接口及实现类DefaultSession:
定义crud操作:selectAll(),selectOne(),update(),delete()
6.创建Exexutor接口及实现类SimpleExecuter
具体执行jdbc代码,query(Configuration,MapperStatement,Object... )
问题分析:
1.代码重复:dao层在加载配置文件,创建sqlsessionfactory,生产sqlsession重复
2.存在硬编码问题。dao层在执行crud方法时,传入的statementid是写死的。
解决思路:使用代理模式生成dao层的代理实现类。利用动态代理中的三个参数,动态生成statementId和params
项目目录:
自定义持久层:
客户端: