个人学习-java-jdbc学习

JDBC的连接第一步

1.加载mysql-connector-java-5.1.7.jar.

  创建连接 Driver

2.准备数据库信息

3.调用Driver的接口 connect()加入数据库的连接

   Connection 


编写通用方法:可以获取任意数据库的链接

需要更改全类名,URL,USER,PASSWORD放入一个配置文件中然后进行加载

可以通过反射获取驱动的全类名. class.foname("").newInstances

然后利用properties去读取配置文件.在写入对应的驱动信息(用户名和密码)

driver.connect(jdbcrul,info)  即可


 --------- 以上为通过Driver来连接-----


采用driverManager

1.准备四个连接的字符串

    驱动全类名,用户名,密码,url

2.读取配置文件

   利用properties 与输入流进行读写配置文件


3.利用deriverManager.getConnection获取数据库的连接


-------------以上是连接数据库的方法.接下来进行对数据库的操作-------------

获取数据库的连接connection

Statment是用于执行sql语句的对象

执行语句的过程

1获取数据库连接

connection conn = 编写好的数据库的方法();

2调用connection的createStatemnt()方法

Statement st = conn.createStatemnt();

3调用statement的对象executeUpdate()执行语句的插入

st.executeUpdate(sql语句);

4.关闭数据库的连接

st .close();

conn.close();

!传入的sql语句可以自己编写!



-------------编写公共的方法对数据库的操作-------------

编写一个关闭的方法

public static void close(connection conn,Statement statement){

try{

做条件判断并且关闭

}catch{

抛异常

}

}


之后再数据库连接中调用这个工具类的方法,传入参数

关闭的方法.close(conn,statement);


ResultSet:结果集,

直接操作执行的sql语句 ,用next()方法获取.然后在get到属性,多条循环输出

ResultSet rs =statement.executeQuery(sql);

while(rs.next()){

rs.getint("id");

此内都是属性

}

---------------多个参数的传递太麻烦,采用PreparedStatment进行占位符的使用执行sql语句-------------


PreparedStatment可以使用占位符进行多个值的传递

示例:



20行 方法传入的参数 有sql语句 也有占位符的变量 用的是Object是因为传入不确定的类型,Args代表多个参数


28行 进行连接之后由于参数是存在多个的,所以需要将args进行循环

29行 循环取出来的值由于是0开始的需要+1 并且用数组的形式来取值.把值看做一条平行线

最后进行更新即可


-----------------以查询为例,如果存在多个entity,那么可以编写一个共同的方法进行查询-----------------


公共方法:使用泛型来传入一个实体类,传入sql传入占位符 ,一共三个参数.(实体类方面传入之后要使用反射来创建)

 由于传入的实体类为泛型,要获取到它的列和属性是通过sql的查询后获取,再放到map中 存在了键值对,然后通过反射存到实体类中

 在sql查询语句中获取到相对的属性可以利用ResultSetMetaData

ResultSetMetaData 的作用是描述ResultSet 的元数据对象,可以获取这个结果集中的数据.就是列和行

用法: 调用ResultSet 中的 getMetaData()方法

          ResultSetMetaData rsmd =ResultSet.getMetaData();//这里已经获取到数据

将数据进行循环取出

       for(int i=0;i<rsmd.getColumnCount();i++){  //getColumnCount()是获取所有列  此处是循环出有多少的列的次数

String lie =rmsd.getColumnLabel(i+1); //getColumnLabel是获取列中的键位

Object lievalue =resultSet.getObject(i+1);//获取结果集所有的值

// 这样键位和值相对应

map.put("lie","lievalue");//放入map中

}

取出sql集合中的数据列之后要将对应的值放入一个map中进行简直对保存,

这里就要生成一个map: Map<String,Object> map =new HashMap<String,Object>();

map.put("","");这里可以利用for循环进行赋值

如果map的值大于零,利用反射为class对象赋值

if(map.size()>0){

Object obj =clazz.newInstance();//利用反射创建对象

//遍历map对象,为反射创建的对象赋值

for(Map.Entry<String,Object> entry : map.entrySet()){//entrySet是map中的赋值的方法

String filename =entry.getkey();

Object value =entry.getvalue();

//采用一个工具类进行赋值.尚硅谷教学内容的工具

}

}


------------------------JDBC 编写通用DAO类 查询多条或者一条记录-----------------------

进行多条记录的编写:

public <T> T getForList(Class<T> clazz,String sql,Object...args){

List<T> list = new ArrayList<>();//用来保存被查询多条记录

Connection connection =null;

PreparedStatement preparedStatement =null;

  ResultSet resultset =null;

try{

进行数据库的连接;

sql语句的执行;

for(int i=0;i<args.length;i++){

preparedStatement.setObject(i+1,args[i]);//将占位符传入preparedStatement 

}

resultset =preparedStatement .executequery();//执行查询语句 获取处理返回的结果集

List<map<String,Object>>  values =new ArrayList<>();//准备一个List<map<String,Object>> 一个map对应一条记录(一条记录包括多个数据)

ResultSetMetaData rsmd = resultset.getMetaData();  // 获取数据源元  列表

Map<String,Object> map=null; //生成一个map将每一条循环出来的ResultSet 结果存入其中

  处理ResultSet 将某一条记录放置到map中

while(ResultSet .next()){

map = new hashmap<>();

for(int i=0;i<rsmd.getcolumnCount() ;i++) {  //获取列表的全部的列 

String columnLable =rsmd.getcolumnLable(i+1);//取列名

Object values =ResultSet .getObject(i+1);//列名对应的值

map.put("columnLable ","columnLable "); // 一个列名 和 值 对应的存入一个map中.采用循环就多个存入 这样就会形成一条记录的值和列名对应

}

values.add(map)//将上面的map里的某一条记录 存入到values 中.这样就会取得多条记录

}

T bean =null; //参数对应的对象

if(values.size()>0)){//判断返回的values 是否存有查询的记录

for(Map<String,Object> m : values){  //存有多条记录的list 拿出来循环

bean = clazz.newInstance();//存在一条记录.生成一个bean 

for(Map.Entry<String,Object> entry:m.EntrySet()){ //将上面循环的每一条值拿出来进行赋值

  String propertyName =entry.getkry();//将MAP中的属性拿出来

Object value =entry.getvalue();

BeanUtils.setProperty(bean,propertyName ,value ); //采用BeanUtils工具类 可以直接进行值的传入实体类中

}

list.add(bean); 存好值的实体类传入到list首次创建的list中.返回到查询

}


}catch(e xxxxx){

e.xxxx;

}finally{

关闭数据库的连接;

}

return list;

}


-------------------------以上写好了多条查询的方法 接下来可以进行优化---------------------------------

//用来处理ResultSet 结果集所对应的列的名称的 list保存 

private List<String>  getColumnLables(ResultSet rs){

List<String> lables =new ArrayList<>();

ResultSetMetaData rsmd = rs.getMetaData(); 

for(int i=0;i<rsmd.getcolumnCount() ;i++) {  //获取列表的全部的列

lables.add(rsmd.getcolumnLable(i+1));

}

return lables ;

}


改良后的代码.直接用这个方法进行resultSet的操作

原先的ResultSetMetaData rsmd =ResultSet.getMetaData(); 直接改为用重新整合代码传入resultSet的值就行.

for循环可以直接改为加强型的.因为getColumnLables方法已经可以得到列名了,

然后直接循环列名,在取值.同时保存到MAP中就行了.


--------------------------------进行一条的查询------------------------------------------

public <T> T get(Class<T> clazz,String sql ,Object ...args){  //通过多条集合的查询获取查到的第一个值就行了

List<T> result =getforlist(clazz,sql,args);

if(result,size()>0){

return result.get(0);

}

return null;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值