Java架构师之旅(十七)
夜光序言:
我必须冲在第一个,不能依靠任何的力量,就像当年的闷油瓶一样~~
正文:Spring连接数据库查询,精讲~~人生总要留下点什么
package cn.Genius.jdbc;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.junit.Test;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
public class JdbcTemplateDemo2 {
/*夜光:我们聊一聊查询代码的书写
* QueryRunner runner = new QueryRunner(datasource)
* 返回对象
* runner.query(sql,BeanHandler<user>(User.class));
*
*
* 返回list集合
*
* 在dbutils时候,我们发现有接口ResultSetHandler
* dbutils提供了针对不同结果的实现类~~
*
* 重点:jdbcTemplate要实现,也有特定的接口,我们称之为RowMapper
* jdbcTemplate针对这个接口没有提供实现类,得到不同类型数据需要自己去进行封装
*
*
* */
//2、jdbc底层实现的代码
@Test
public void testJDBC() throws SQLException{
Connection conn = null;
PreparedStatement psmt = null;
ResultSet rs = null;
//加载驱动
try {
Class.forName("com.mysql.jdbc.Driver");
//创建连接
conn = DriverManager.getConnection("jdbc:mysql:///studentsmanager", "root", "1111");
//编写sql语句
String sql = "select * from user where username=?";
//预编译sql
psmt = conn.prepareStatement(sql);
//夜光:设置参数值
psmt.setString(1, "lucy");
//执行sql
rs = psmt.executeQuery();
//遍历结果集
while(rs.next()){
//得到返回结果值
String username = rs.getString("username");
String password = rs.getString("password");
//夜光:我想把这两个值放到user对象里面去
User user = new User();
user.setUsername(username);
user.setPassword(password);
System.out.println(user);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try{
rs.close();
psmt.close();
conn.close();
}catch (SQLException e) {
e.printStackTrace();
}
}
}
//1、夜光:查询表中有多少条数据
@Test
public void testCount(){
//创建一个对象,用来设置数据库信息
DriverManagerDataSource dataSource =new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
//下面,我们还需要设置数据库地址
dataSource.setUrl("jdbc:mysql:///studentsmanager");
dataSource.setUsername("root");
dataSource.setPassword("1111");
//创建jdbcTemplate模板对象,设置数据源
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
//夜光:调用jdbcTemplate里面的方法实现计数
//我们先写一个sql语句
String sql = "select count(*) from user";
//调用jdbcTemplate里面的方法来实现
int count = jdbcTemplate.queryForObject(sql, Integer.class);
System.out.println(count);
}
//3、夜光:查询返回对象~~
@Test
public void testObject(){
//创建一个对象,用来设置数据库信息
DriverManagerDataSource dataSource =new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
//下面,我们还需要设置数据库地址
dataSource.setUrl("jdbc:mysql:///studentsmanager");
dataSource.setUsername("root");
dataSource.setPassword("1111");
//创建jdbcTemplate模板对象,设置数据源
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
//上面的是固定的~~
//夜光:先写一个sql语句,根据username进行查询
String sql = "select * from user where username=?";
//调用jdbcTemplate里面的方法来实现
//夜光:第二个参数是接口,需要自己写类实现接口,就是对数据的封装~~
User user = jdbcTemplate.queryForObject(sql, new MyRowMapper(), "jack");
System.out.println(user);
}
//4、夜光:查询list返回对象~~
@Test
public void testList(){
//创建一个对象,用来设置数据库信息
DriverManagerDataSource dataSource =new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
//下面,我们还需要设置数据库地址
dataSource.setUrl("jdbc:mysql:///studentsmanager");
dataSource.setUsername("root");
dataSource.setPassword("1111");
//创建jdbcTemplate模板对象,设置数据源
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
//上面的是固定的~~
//夜光:先写一个sql语句,根据username进行查询
String sql = "select * from user ";
//调用jdbcTemplate里面的方法来实现
java.util.List<User> list = jdbcTemplate.query(sql, new MyRowMapper());
System.out.println(list);
}
}
//夜光:我们手写一个封装过程~~
class MyRowMapper implements RowMapper<User>{
//上面这个就是范型的意思,代表要把数据封装到哪里~~,我们学模型驱动就是这么写的嗯
@Override
public User mapRow(ResultSet rs, int num) throws SQLException {
// 里面嵌套了一个方法,num就代表行号嗯~~
//1、从结果集把数据拿到~~
String username = rs.getString("username");
String password = rs.getString("password");
//2、把得到数据封装到对象里面去
User user = new User();
user.setUsername(username);
user.setPassword(password);
return user;
}
}