UserDao
修改项目
1、把UserDao修改为接口,然后把原来的UserDao修改类名为UserDaoImp
2、修改UserService中对UserDao的实例化:private UserDao userDao = Daofactory.getUserDao();
1、DAO模式
DAO(Data Access Object)模式就是写一个类,把访问数据库的代码封装起来。DAO在数据库与业务逻辑(Service)直接
实体域,即操作的对象,例如我们操作的是user表,那么就需要先写一个User类
DAO模式需要先提供一个DAO接口
然后再提供一个DAO接口的实体类
再编写一个DAO工厂,Service通过工厂来获取DAO实现
时间类型
SQL包下相关时间的方法
java.sql.ResultSet#java.sql.Date.getDate()
java.sql.PreparedStatement#setDate(int col,java.sql.Data date)
例如 user.setBirthday(rs.getDate("birthday"));其中rs.getDate()方法返回的是java.sql.Date而User的birthday必须是java.util.Date类型。把sql包的Date赋给util包下的Date这是子类给父类,不用强转
例如:pstmt.setDate(3,user.getBirthday())其中user.getBirthday() 返回的是util包下的Date,而setDate()方法的参数类型是sql包下的Date,这说明需要把utilDate转换成sqlDate。这需要处理类型转换问题
pstmt.setDate(3,new java.sql.Date(user.getBirthday().getTime()))
数据库类型与java中类型的对应关系
DATE->java.sql.Date
TIME->java.sql.Time
TIMESTAMP->java.sql.TimeStamp
领域对象(domain)中的所有属性不能出现java.sql包下的东西。即不能使用java.sql.Date
ResultSet#getDate()返回的是java.sql.Date()
PreparedStatement#setDate(int,Date) 其中第二个参数也是java.sql.Date
时间类型的转换
java.util.Date->java.sql.Date、Time、Timestamp
把util的Date转换成毫秒值
使用毫秒值创建sql的Date、Time、Timestamp
java.sql.Date、Time、Timestamp->java.util.Date
不需要处理了:因为java.sql.Date是java.util.Date
java.util.Date date = new java.sql.Date();儿子给爸爸 不用转换
java.util.Date date = new java.util.Date();
long l = date.getTime();
java.sql.Date sqlDate = new java.sql.Date(l);
Java中的时间类型
java.sql包中给出三个与数据库相关的日期时间类型,分别是
Date:表示日期,只有年月日,没有时分秒。会丢失事件
Time:表示时间,只有时分秒,没有年月日。会丢失日期
Timestamp:表示时间戳,有年月日时分秒,以及毫秒
这三个类都是java.util.Date的子类
UserDao.java 接口类
/**
*
* @author Administrator
* 接口不容易换 实现类容易换, 按照一定规则能换人,规则不轻易换
* 遵循开辟原则
*/
public interface UserDao {
public User findByUsername(String username);
public void add(User user);
}
DaoFactory.java
/**
* 通过配置文件得到dao实现类的名称
* 通过类名称,完成创建类对象(反射完成的)
* @author Administrator
*
*/
public class DaoFactory {
private static Properties props = null;
static{
//加载配置内容到props对象中
try{
InputStream in = DaoFactory.class
.getClassLoader().getResourceAsStream("dao.properties");
//不能再在前面加Properties不然会报空指针异常
props = new Properties();
props.load(in);
} catch(Exception e){
throw new RuntimeException(e);
}
}
/**
* 返回一个具体UserDao的实现类对象
* @return
*/
public static UserDao getUserDao(){
/*
* 给出一个配置文件,文件中给出UserDao接口的实现类名称
* 我们这个方法,获取实现类的类名,通过反射完成创建对象
*/
/*
* 得到dao实现类的名称 名字长点防止冲突
*/
String daoClassName = props.getProperty("my.user.dao.UserDao");
/*
* 通过反射来创建实现类的对象
*/
try {
Class clazz = Class.forName(daoClassName);
return (UserDao) clazz.newInstance();//返回的Object需要进行强转
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/*@Test
public void fun1(){
InputStream in = DaoFactory.class
.getClassLoader().getResourceAsStream("dao.properties");
props = new Properties();
try {
props.load(in);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String daoClassName = props.getProperty("my.user.dao.UserDao");
try {
Class clazz = Class.forName(daoClassName);
System.out.println(clazz.newInstance());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}*/
}
UserDaoImpl.java
/**
* 数据类 持久层(数据层)
* 用来访问xml文件
* @author Administrator
*
*/
public class UserDaoImpl implements UserDao {
private String path="D:/users.xml";//依赖数据文件
/**
* 按用户名查询
*/
public User findByUsername(String username){
/*
* 1、得到Document
* 2、xpath查询
* 3、校验查询结果是否为null,如果为null,返回null
* 4、如果不为null,需要把Element封装到User对象中。
*/
/*
* 1、得到document
*/
//创建解析器
SAXReader reader = new SAXReader();
try {
Document doc = reader.read(path);
/*
* 2、通过xpath查询得到Element
*/
Element ele = (Element) doc.selectSingleNode("//user[@username='"+username+"']");
/*
* 3、校验ele是否为null,如果为null,返回null
*/
if(ele == null) return null;
/*
* 4、把ele的数据封装到User对象中
*/
User user = new User();
String attrUsername = ele.attributeValue("username");//获取该元素的名为username 的属性值
String attrPassword = ele.attributeValue("password");//获取该元素的名为password的属性值
user.setUsername(attrUsername);
user.setPassword(attrPassword);
return user;
} catch (DocumentException e) {
throw new RuntimeException(e);
}
}
/**
* 添加用户
* @param user
*/
public void add(User user){
/*
* 1、得到Document
* 2、通过Document得到root元素<users>
* 3、使用参数user,转发成Element对象
* 4、把element添加到root元素中
* 5、保存Document
*/
SAXReader reader = new SAXReader();
try {
Document doc = reader.read(path);
//得到根元素
Element root = doc.getRootElement();
//通过根元素创建新元素
Element userEle = root.addElement("user");
//为userEle设置属性
userEle.addAttribute("username", user.getUsername());
userEle.addAttribute("password", user.getPassword());
/*
* 保存文档
*/
//创建输出格式化器
OutputFormat format = new OutputFormat("\t",true);//缩进使用\t,是否换行,使用是
format.setTrimText(true);//清空原有的换行和缩进 不然有之前留着的换行格式很不好看
//创建XmlWriter
//XMLWriter writer = new XMLWriter(new FileWriter(path),format);//没有编码方式 需要换另外的输出方式
XMLWriter writer;
try {
writer = new XMLWriter(
new OutputStreamWriter(
new FileOutputStream(path),"utf-8"),format);//保证编码方式
writer.write(doc);//保存document对象
writer.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
} catch (DocumentException e) {
throw new RuntimeException();
}
}
}
JdbcUtils
/**
* v1.0
* @author Administrator
*
*/
public class JdbcUtils {
private static Properties props = null;
//只在JdbcUtils类被加载一次
static{
//props进行初始化,即加载dbconfig.properties文件到props对象中
try {
/*
* 1.加载配置文件
* 2、加载驱动类
* 3、调用DriverManager.getConnection()
*/
//加载配置文件
InputStream in = JdbcUtils.class.getClassLoader()
.getResourceAsStream("dbconfig.properties");
props = new Properties();
props.load(in);
} catch (IOException e) {
throw new RuntimeException(e);
}
try {
//加载驱动类
Class.forName(props.getProperty("driverClassName"));
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
//获取连接
public static Connection getConnections() throws SQLException{
//得到Connection
return DriverManager.getConnection(props.getProperty("url"),
props.getProperty("username"),
props.getProperty("password"));
}
}
JdbcUserImpl.java
/**
* 针对数据库的实现
* @author Administrator
*
*/
public class JdbcUserDaoImpl implements UserDao {
@Override
public User findByUsername(String username) {
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
/*
* 一、得到连接
*/
con = JdbcUtils.getConnections();
/*
* 二、准备sql模版,得到pstmt
*/
String sql = "SELECT * FROM t_user WHERE username=?";
pstmt = con.prepareStatement(sql);
/*
* 三、为pstmt中的问号赋值
*/
pstmt.setString(1, username);
/*
*四、执行之
*/
rs = pstmt.executeQuery();
/*
* 五、把rs转换成User类型,返回
*/
if(rs == null){
return null;
}
if(rs.next()){
//转换成User对象,并返回
//ORM-->对象关系映射 把表的东西放到对象中 hibernate ORM工具
User user = new User();
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
return user;
}else{
return null;
}
} catch (Exception e) {
throw new RuntimeException(e);
} finally{
try {
if(pstmt!=null) pstmt.close();
if(con!=null) con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
@Override
public void add(User user) {
Connection con = null;
PreparedStatement pstmt = null;
try {
/*
* 一、得到连接
*/
con = JdbcUtils.getConnections();
/*
* 二、准备sql模版,得到pstmt
*/
String sql = "INSERT INTO t_user Values(?,?)";
pstmt = con.prepareStatement(sql);
/*
* 三、为pstmt中的问号赋值
*/
pstmt.setString(1, user.getUsername());
pstmt.setString(2, user.getPassword());
/*
*四、执行之
*/
pstmt.executeUpdate();
} catch (Exception e) {
throw new RuntimeException(e);
} finally{
try {
if(pstmt!=null) pstmt.close();
if(con!=null) con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
1135

被折叠的 条评论
为什么被折叠?



