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;
}