九十五、JDBC
1、连接数据库
String driver="com.mysql.jdbc.Driver";
String url="jdbc:mysql://localhost:3306/aowin";
String user="root";
String password="163041";
Connection con=null;
try {
1、加载驱动
Class.forName(driver);
System.out.println("加载成功");
} catch (ClassNotFoundException e) {
System.out.println("加载驱动失败");
}
try {
· 2、获取与数据库的连接
con=DriverManager.getConnection(url, user, password);
System.out.println("连接成功");
} catch (SQLException e) {
System.out.println("连接失败");
}
return con;
3.将sql语句送到数据库并执行
4.将查询结果放到ResultSet里
修改和删除都可以用executeUpdate()方法;
当查询时,返回n条数据:executeQuery(sql)
(1)、Statement的createStatement()
(普通查询(查询所有):使用createStatement()方法,再使用executeQuery(sql)执行sql语句,并将得到的值放入ResultSet集合中,再使用ArrayList集合接收这些值。)
con=DbUtils.getConnection();
st=con.createStatement();
String sql="select * from student";
//当是查询时,返回n条数据就用executeQuery
rs=st.executeQuery(sql);
//st.execute(sql);返回布尔类型,代表语句是否执行成功
List<Student>l =new ArrayList<Student>();
while(rs.next()) {
}
(2)、 prepareStatement(sql)方法:
PreparedStatement 有预编译的功能 ,可以防止sql注入
(删除:sql语句中有?的,使用prepareStatement(sql)方法,意思是先将sql语句传到数据库中,并将得到的值放入PreparedStatement集合中,并配合setInt()等方法设置?的值,当对数据修改时,再使用executeUpdate()方法判断sql语句是否执行成功(此方法返回行数),再用ArrayList集合接收查询得到的值)
con=DbUtils.getConnection();
String sql="delete from student where id=?";
ps=con.prepareStatement(sql);
ps.setInt(1, id);
int rows=ps.executeUpdate();
//当是对数据修改时,就用executeUpdate();返回的时行数
(3)、批处理: 先将语句传到数据库,再将具体的值写到列表中,再一起执行
(sql语句中没有?的,可以使用createStatement()方法,并将得到的值放入Statement集合中,并配合addBatch()方法将sql语句放入到列表中,最后使用executeBatch()方法执行sql语句。)
对象.get封装方法(createStatement()方法)
con=DbUtils.getConnection();
st=con.createStatement();
for(int i=0;i<5;i++) {
String sql="insert into student values("+(s.getId()+i)+","+ "'" +s.getSex()+ "'" +","+s.getScore()+")";
//批处理:Statement有个语句列表,可以先将语句放入列表中,再一起执行
st.addBatch(sql);
}
int a[]=st.executeBatch();
prepareStatement()方法:
(sql语句中有?的,使用这个方法,意思是先将sql语句传到数据库中,并将得到的值放入PreparedStatement集合中,并配合setInt()等方法设置第n个?的值,再使用addBatch()方法将sql语句放入到列表中,最后使用executeBatch()方法执行sql语句。)
con=DbUtils.getConnection();
String sql="insert into student values(?,?,?)";
ps=con.prepareStatement(sql);
//PrepareStatement批处理:先将语句传到数据库,在将具体的值写到 列表中,再一起执行
for(int i=0;i<5;i++) {
ps.setInt(1, i);
ps.setString(2, "女");
ps.setInt(3, 99);
ps.addBatch();
}
int rows=ps.executeBatch().length;
(4)、非批处理的方法
(查询(?):sql语句中有?的,使用prepareStatement(sql)方法,意思是先将sql语句传到数据库中,并将得到的值放入PreparedStatement集合中,并配合setInt()等方法设置?的值,再executeQuery()方法判断sql语句是否执行成功,并将结果放入,再用ArrayList集合接收查询得到的值)
con=DbUtils.getConnection();
String sql="select * from pet where color=?";
ps=con.prepareStatement(sql);
ps.setString(1, strcolor);
rs=ps.executeQuery();//返回布尔类型,代表语句是否执行成功
List<Pet> l =new ArrayList<Pet>();
while(rs.next())
{
Pet p=new Pet();
p.setId(rs.getInt("id"));
p.setColor(rs.getString("color"));
p.setMoney(rs.getInt("money"));
l.add(p);
}
(5)、事务
在连接数据库的代码之后,使用con.setAutoCommit(false)方法,并将其初始值设置成fasle,则整个sql语句会预先执行,此时,数据库的数据还没与真正的改变,当我们再提交事务时,数据才会真正的改变,如果出现问题不想提交时,需要回滚事务。
遇到执行的方法就调用con.commit()方法提交事务,然后在catch代码块中再次用try代码块执行con.rollback()方法,回滚事务。
5.将结果集中的数据根据列名取出并赋值给相应的对象属性