首先我们来看一下整个框架的代码结构
1,创建bean包:
这里是用来存储一些实体类对象,可以保存实体的一些属性数据。
-
创建Customer类来保存一些顾客的信息
这里我只写了顾客类的属性
还需要写它的get和set方法
还有重写toString
还要实现序列化接口private Long id;
private String name;
private String gender;
private String telephone;
private String address;
2,创建dao包:
这里写的是一些连接数据库的增删改查的类
-
创建类CustomerDao.java
这里面只要是写数据库的增删改查
下面是它的一些方法
public void save(Customer customer){
//保存数据到数据库中
}
public void update(Customer customer){ //更新数据库中的数据
}
public Customer findByName(String name){//根据名字查找
}
public void delete(){//删除数据库中的数据
}
public List<Customer> findAll(){//查找所有的数据
}
在这些方法中比较复杂的方法就是findByName按照名字来查找,我讲解一下这个方法的实现。
- 我们可以发现当进行查询数据的时候,大部分的代码都类似,可变的部分就是三个。
一,传入的sql语句
二,sql语句中传入的参数,数量不确定并且类型也不确定,所以要写成Object类型的数组
public Customer findByName(String name){
Customer data=null;
String sql = "select * from ctmer where name=?";
Object[] obj={name};
data=(Customer) temp.findUnique(sql, obj, new Mapper());
return data;
}
三,就是返回的查询结果,你可能需要一个数据也可能两个数据,所以这里用到了内部类来传递你想要的结果集
class Mapper implements Impper<Customer>{
@Override
public Customer map(ResultSet rs) {
Customer cust=new Customer();
try {
if(rs.next()){
long id = rs.getLong("id");
String name = rs.getString("name");
String gender = rs.getString("gender");
String telephone = rs.getString("telephone");
String address = rs.getString("address");
cust=new Customer(id, name, gender, telephone, address);
System.out.println(id+"=="+name+"=="+gender+"=="+telephone+"=="+address);
}
} catch (Exception e) {
e.printStackTrace();
}
return cust;
}
}
3,创建service包
这里主要写的是业务逻辑的代码
-
创建接口 ICustomerService.java
下面是该接口中的方法
//注册
void register(Customer customer) throws ServiceException;
//登陆
Customer login(String username,String passworld);
//更新信息
Customer updateInfo(Customer newCustomer);
-
创建该接口的实现类CustomerServiceImp.java
在这里调用dao层的方法实现数据的增删改查。
下面是注册逻辑的代码实现
> @Override
public void register(Customer customer) throws ServiceException{
if(dao.findByName(customer.getName())==null){
dao.save(customer); //这里调用了dao层的保存数据到数据库的方法
System.out.println("注册成功");
}else{
throw new ServiceException("注册失败");
}
}
4,创建包common
这里主要写的就是一些封装好的类可以直接调用
-
创建ConnectionFactory类
它是封装了连接数据库的类
1)静态参数的配置
static{
driver="com.mysql.jdbc.Driver";
password="root";
user="root";
url="jdbc:mysql://127.0.0.1:3306/customer";
//从文件系统中获取参数,方便后期放在配置文件中,可以直接改为其他数据库的参数
}
2)封装的两个静态方法
第一个方法:其他数据库也是这两个部分必写,只是传递进来的参数不同,因为外部需要用到connection来进行sql语句的执行,所以要返回出去
第二个方法:关闭数据库的三个参数的链接,这是会多次调用的
public static Connection getConnection() throws Exception{
Class.forName(driver);
return DriverManager.getConnection(url, user, password);}
public static void close(ResultSet rs,PreparedStatement pstmt,Connection conn) throws Exception{}
创建类JDBCTemplate.java
这里封装的是数据库链接的代码,因为在dao层的方法中进行增删改查时,大量的代码是类似的,只是传递的sql语句不同,查询返回的结果不同,封装后就可以进行代码的复用创建接口Impper.java
这个接口的目的是为了让用户可以传递用户想要的结果集,毕竟你想查询多少个属性是不确定的,属性的类型也是不确定的,属性的bean类也是不确定的就要用到泛型
public interface Impper<T> {
T map(ResultSet res);
}
6,最后还有一个异常类
这里主要是为了让用户在调用业务逻辑(ICustomerService)中代码时会有一个提示,比如用户登陆成功时怎么处理,登陆失败时怎么处理。
1)ServiceException继承Exception类
2)ICustomerService接口中方法抛出异常ServiceException,因为只有接口抛出了异常子类才可以抛出自己定义的异常
3)实现类CustomerServiceImp.java在方法中抛出异常,并且在注册失败时,输入失败信息进去
throw new ServiceException("注册失败");
测试:
Customer cust=new Customer();
cust.setData(3L,"fei","famel","12345678900","nanchang");
try {
customerService.register(cust);
} catch (ServiceException e) {
e.printStackTrace();
}