overview_java(九)-java数据库操作

来源:互联网 发布:北京弘书阁教育 知乎 编辑:程序博客网 时间:2024/06/10 09:31

数据库访问

。加载驱动

加载jdbc驱动,并将去注册到DriverManager中,每一个数据库提供的数据库驱动不一样,加载驱动时要把jar包添加到lib中

。//加载驱动程序

   Class.forName("com.mysql.jdbc.Driver");

。//获得数据库的链接

   Connection conn =  DriverManager.getConnection(URL,NAME,PASSWORD);

。//通过数据库连接操作数据库,实现增删改查

   Statement stmt = conn.createStatement();

    ResultSet rs = stmt.executeQuery("sql");


while(rs.next()){

//循环打印

out.println(rs.getString("user_name"))

}


。。/url = "jdbc:mysql://localhost:3306/db"

。。/name

。。/password


搭建模型层。

采用mvc三层设计

 从上到下依次是  view   control    model   DB

作用:

         view  视图层  展示数据,反馈用户行为

         control 控制层  控制数据流通过程,协调视图层和数据层

         model  模型层  与数据库建立映射,与数据进行交互

         db     

第一步:按照数据库表对应的字段编写实体类

第二步:新建DAO层,并DBUtil.java

  eg:

public class DBUtil {

private static final String URL="jdbc:mysql://localhost:3306/db";

private static final String NAME="root";

private static final String PASSWORD="root";

private static Connection conn = null;

//静态代码块

static{

try{

//1,加载驱动程序

Class.forName("com.mysql.jdbc.Driver");

//2,获得数据库的链接

conn = DriverManager.getConnection(URL,NAME,PASSWORD);

   }catch(ClassNotFoundException e){

e.printstackTrace();

}

}

//对外提供一个方法来获取数据库连接

public static Connection getConnection(){

return conn;

}

public static void main(String[] args)throws Exception{

//3.通过数据库的链接操作数据库,实现增删改查

statement stmt = conn.createStatement();

ResultSet rs = stmt.executeQuery("sql");

while(rs.next()){

//如果对象中有数据,就会循环答应出来

System.out.println("rs.getString("user_name")");

}

}



}

第三步:Dao.java

goddessDao.java

public class GoddessDao{

public void addGoddess(){

}

public void updateGoddess(){

}

public void delGoddess(){

}

public List<Goddess> query() throws Exception{

Connection con = DBUtil.getconnection();

Statement stmt = con.createStatement();

ResultSet rs = stmt.excuteQuery("sql");

List<Goddess> gs = new ArrayList<Goddess>();

Goddess g = null;

while(rs.next()){

//如果对象中有数据,就会循环打印出来额

g = new Goddess();

g.setUserName(rs.getString("name"));

g.setAge(rs.getInt("age"));

gs.add(g);

}

return gs;

}

public Goddess get(){

return null;

}

}



Controller层:GoddessAction.java

public class GoddessAction{

public static void main(String[] args) throws Exception {

GoddessDao gd = new GoddessDao();

List<Goddess> gs = gd.query();

for(Goddess goddess:gs){

System.out.println(goddess.getUserName()+ ","+ goddess.getAge());

}

}


}


搭建模型层

create 操作

1,添加女神

public void addGoddess(Goddess g) throw Exception{

//首先拿到数据库的链接

Connection con = DBUtil.getConnection();

String sql = "" + " insert into table_name " + " (字段)"  + " values( " + " ? )";

//参数用?表示,相当于占位符;用mysql的日期函数current_date()来获取当前日期

//预编译sql语句

PreparedStatement psmt = con.prepareStatement(sql);

psmt.setString(1,g.getUserName());

       psmt.setDate(4, new Date(g.getBirthday().getTime()));
       //日期型参数需要自己做下转换
psmt.execute();


}

/*


prepareStatement 这个方法会将sql语句加载到conn驱动中去,但不会直接执行

而是当它调用execute()方法的时候才回真正的执行

上面的sql参数用?表示,相当于占位符,然后对参数进行赋值

当真正执行时,这些参数回家再在这些sql语句中去,把sql语句拼接完整采取执行

这样就会减少对数据库的操作。

*/



测试类

public class GoddessAction{

GoddessDao gd = new GoddessDao();

Goddess g1 = new Goddess();

g1.setUserName("小夏");

gd.addGoddess(g1);

}

修改,删除,查询(根据id)操作

//update

public void updateGoddess(Goddess g) throws SQLException{

Connection con = DBUtil.getConnectionn();

String sql = " " + " update table_name " +" set user_name=?,age=?" + " where id = ? ";

//参数用?表示,相当于占位符;用mysql的日期函数

PreparedStatement psmt = con.prepareStatement(sql);

psmt.setString(1,g.getUserName());

psmt.setDate(4,new Date(g.getBirthday.getTime()));

psmt.execute();

}


//delete

public void delGoddess(Integer id) throws SQLException

Connection con = DBUtil.getConnection();

String sql = " " + " delete from table_name " + " where id = ?";

PreparedStatement psmt = con.prepareStatement(sql);

psmt.setInt(1,id);

psmt.execute();

//查询单个,根据字段

public Goddess get(Integer id) throws SQLException{

Goddess g = null;

Connection con = DBUtil.getConnection();

String sql = " " + " select * from table_name " + " where id=?";

PreparedStatement psmt = con.prepareStatement(sql);

psmt.setInt(1,id);

ResultSet rs = psmt.executeQuery();//返回一个结果集

//遍历结果集

while(rs.next()){

g= new Goddess();

g.setId(rs.getInt("id"));

}

return g;

}

查询

//查询单个女神(根据姓名等信息去查询)
        public List<Goddess> get(String name,String mobile) throws SQLException{
            List<Goddess> result=new ArrayList<Goddess>();
            Connection con=DBUtil.getConnection();//首先拿到数据库的连接
            StringBuffer sb=new StringBuffer();
            sb.append("select * from imooc_goddess ");
            sb.append("where user_name like ? and mobile like ?");
            //预编译sql语句
            PreparedStatement psmt = con.prepareStatement(sb.toString());
            //先对应SQL语句,给SQL语句传递参数
            psmt.setString(1, "%"+name+"%");
            psmt.setString(2, "%"+mobile+"%");    
            System.out.println(sb.toString());
            //执行SQL语句
            /*psmt.execute();*///execute()方法是执行更改数据库操作(包括新增、修改、删除);executeQuery()是执行查询操作
            ResultSet rs = psmt.executeQuery();//返回一个结果集
            Goddess g=null;
            //遍历结果集
            while(rs.next()){
                g=new Goddess();
                g.setId(rs.getInt("id"));
                g.setUserName(rs.getString("user_name"));
                g.setAge(rs.getInt("age"));
                g.setSex(rs.getInt("sex"));
                //rs.getDate("birthday")获得的是java.sql.Date类型。注意:java.sql.Date类型是java.util.Date类型的子集,所以这里不需要进行转换了。
                g.setBirthday(rs.getDate("birthday"));
                g.setEmail(rs.getString("email"));
                g.setMobile(rs.getString("mobile"));
                g.setCreateUser(rs.getString("create_user"));
                g.setCreateDate(rs.getDate("create_date"));
                g.setUpdateUser(rs.getString("update_user"));
                g.setUpdateDate(rs.getDate("update_date"));
                g.setIsDel(rs.getInt("isdel"));
                
                result.add(g);//将结果封装到对象中
            }
            return result;
        }



//查询操作进一步完善。

//使用Map存储条件信息;防止条件为空可以添加一条where 1=1;

public List<Goddess> get(List<Map<String,Object>> params) throws SQLExpection{

List<Goddess> result = new ArrayList<Goddess>();

Connection con= DBUtil.getConnection();

}

优化
//查询单个女神
//使用Map存储条件信息,防止条件为空可加一条where 1=1;
public List<Goddess> result = new ArrayList<Goddess>();
//首先拿到数据据库
Connection con = DBUtil.getConnection();
StringBuffer sb = new StringBuffer();
sb.append("select * from table_name where 1=1");
if(params!= null && params.size()>0){
//先判断集合是否为空
//遍历集合
for(int i =0;i<params.size();i++){
Map<String,Object> map = params.get(i);
sb.append("and " + map.get("name")+ " " +
map.get("rela")+" " = map.get("value")+ " ");
//查询什么?关系是什么?以及值是什么,我们都可以通过
//参数传进来
}
}
PreparedStatement psmt = con.prepareStatement(sb.toString());
//执行SQL语句
//psmt.execute();此方法是执行更改数据库操作(包括新增,修改,删除)
//executeQuery()是执行查询操作
ResultSet rs = psmt.executeQuery(); // 返回一个结果集
Goddess g =null;
//遍历结果集
while(rs.next()){
g=new Goddess();
g.setId(rs.getInt("id"));
g.setUserName(rs.getString("user_name"));
g.setBirthday(rs.getDate("birthday"));
result.add(g);
}
return result;


测试:
List<map<String,Object>> param = new ArrayList<Map<String,object>>();
Map<String,Object> param = new HashMap<String,Object>();
param.put("name","user_name");
param.put("rela","like");
param.put("value","%aa%")
params.add(param);
param = new HashMap<String,Object>();
param.put
.
.
.
params.add(param);
List<Goddess> list1 = gd.get(params);
//遍历list1


搭建控制层

//添加

public void add(Goddess goddess) throws Exception{

GoddessDao dao = new GoddessDao();

goddess.setSex(1);

goddess.setIsDel(0);

dao.addGoddess(goddess);

}

//修改

public void edit(Goddess goddess) throws Exception{

GoddessDao dao = new GoddessDao();

dao.updateGoddess(goddess);

}

//删除




总结


1,jdbc,就是数据库连接的桥梁

      是由java语言编写的类和接口组成,可以为多种数据库提供统一的访问。

2,采用MVC三层结构

DB数据库

模型层   DB+DAO  :封装实现类

控制层:负责调用模型层

视图层调用控制层