一、问题场景
如果程序员就希望使用spring框架来做项目,不使用hiberate等其他持久层框架, 那么spring框架如何处理对数据库的操作呢?
方案1.使用做项目时自已开发的JdbcUtils类方案
2.其实spring提供了一个操作数据库(表)功能强大的类JdbcTemplate。我们可以同ioc容器来配置一个jdbcTemplate对象,使用它来完成对数据库表的各种操作。
二、jdbcTemplate需要的包
1、mysql-connector-java.jar //mysql-java连接驱动
2、c3p0.jar //c3p0数据库连接池, 也可以使用其他连接池
3、mchange-commons-java.jar //拓展c3p0功能的jar包
4、spring-jdbc.jar //spring的数据库访问支持包
基本够用了
三、jdbcTemplate配置数据源
1、首先在mysql中新建数据库 tndb05 ,并新建表monster ,插入测试数据
2、在idea 的source root 下, 新建jdbc.properties数据库配置文件,配置数据库连接信息
jdbc.user=root
jdbc.pwd=
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/tndb05
3、在IOC配置文件beans.xml中配置数据源
<!-- 引入jdbc.properties配置文件-->
<context:property-placeholder location="jdbc.properties"/>
<!-- 配置数据源dataSource,数据库连接池还可以用其他工具-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${jdbc.user}"/>
<property name="password" value="${jdbc.pwd}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="driverClass" value="${jdbc.driver}"/>
</bean>
4、测试
@Test
public void test02() throws SQLException {
DataSource dataSource = (DataSource) applicationContext.getBean("dataSource");
System.out.println(dataSource.getConnection());
}
四、jdbcTemplate操作数据表
1、初步使用(插入insert)
先配置xml, 只写一遍,后边不写了
<!-- 引入jdbc.properties配置文件-->
<context:property-placeholder location="jdbc.properties"/>
<!-- 配置数据源dataSource 的 bean,数据库连接池还可以用其他工具-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${jdbc.user}"/>
<property name="password" value="${jdbc.pwd}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="driverClass" value="${jdbc.driver}"/>
</bean>
<!-- 配置jdbc模版类的 bean,并引用数据源-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
添加一个monster
/**
* 1、初步使用jdbcTemplate- 添加
*/
@Test
public void test01 () {
JdbcTemplate jdbcTemplate = (JdbcTemplate)applicationContext.getBean("jdbcTemplate");
String sql ="INSERT INTO monster VALUES (400,'小妖怪','玩耍')";
jdbcTemplate.execute(sql);
}
2、更新(update)
/**
* 3、更新
*/
@Test
public void test03() {
JdbcTemplate jdbcTemplate = (JdbcTemplate)applicationContext.getBean("jdbcTemplate");
String sql ="UPDATE monster SET skill=? where id=?";
jdbcTemplate.update(sql,"吐苦水","100");
}
3、批量添加monster对象
可以直接批量添加对象
/**
* 4、批量添加两个monster对象
*/
@Test
public void test04() {
JdbcTemplate jdbcTemplate = (JdbcTemplate)applicationContext.getBean("jdbcTemplate");
String sql = "INSERT INTO monster VALUES (?,?,?)";
List<Object[]> list = new ArrayList<Object[]>();
list.add(new Object[]{500,"白蛇精","变美女"});
list.add(new Object[]{600,"青蛇精","变丑女"});
jdbcTemplate.batchUpdate(sql,list); //注意使用的是batchUpdate()
}
4、封装成指定对象
查询的内容可以帮我们封装到对象里 , 使用了 RowMapper接口
/**
* 5、获取jdbcTemplate 查询一条数据,并且给我封装成指定的类型对象
*/
@Test
public void test05() {
JdbcTemplate jdbcTemplate = (JdbcTemplate)applicationContext.getBean("jdbcTemplate");
//编写sql, 需要与类的属性相匹配
String sql = "SELECT id,name,skill from monster where id = ?";
//创建一个RowMapper接口->帮助你将查询的结果封装到对象中
BeanPropertyRowMapper<Monster> rowMapper = new BeanPropertyRowMapper<>(Monster.class);
Monster monster = jdbcTemplate.queryForObject(sql, rowMapper, 100);
System.out.println(monster);
}
5、查询id>=200的monster并封装到Monster实体对象
/**
* 6.查询id>=200的monster并封装到Monster实体对象
*/
@Test
public void test06() {
JdbcTemplate jdbcTemplate = (JdbcTemplate)applicationContext.getBean("jdbcTemplate");
String sql = "SELECT * FROM monster WHERE id >=?";
BeanPropertyRowMapper<Monster> rowMapper = new BeanPropertyRowMapper<>(Monster.class);
List<Monster> monsterList = jdbcTemplate.query(sql, rowMapper, 200);
for(Monster monster:monsterList) {
System.out.println(monster);
}
}
6、.查询返回结果只有一行一列的值,
比如查询id=100的怪物名字.
/**
*查询返回结果只有一行一列的值,
* 比如查询id=100的怪物名字查询返回共有多少个妖怪
*/
@Test
public void test07() {
JdbcTemplate jdbcTemplate = (JdbcTemplate)applicationContext.getBean("jdbcTemplate");
//编写sq1,这时你的SELECT语句返回的字段,需要和你的类的属性相互匹配
String sql ="SELECT name FROM monster WHERE id=100";
//返回一行的一列的值
String name = jdbcTemplate.queryForObject(sql, String.class);
System.out.println("妖怪的名字是"+ name);
}
比如查询一共有多少个妖怪
/**
* 查询一共有多少个妖怪
*/
@Test
public void test07() {
JdbcTemplate jdbcTemplate = (JdbcTemplate)applicationContext.getBean("jdbcTemplate");
//编写sq1,这时你的SELECT语句返回的字段,需要和你的类的属性相互匹配
String sql ="SELECT count(*) FROM monster";
//返回一行的一列的值
Integer num = jdbcTemplate.queryForObject(sql,Integer.class);
System.out.println("妖怪的数量是"+ num);
}
7、namedParameterJdbcTemplate
namedParameterJdbcTemplate也有很多的quary(),excute(),update()方法
/**
* 使用Map传入具名参数添加一个monster
*/
@Test
public void test08() {
//namedParameterJdbcTemplate也有很多的quary(),excute(),update()方法
NamedParameterJdbcTemplate namedParameterJdbcTemplate =
(NamedParameterJdbcTemplate) applicationContext.getBean("namedParameterJdbcTemplate");
//注意值的写法,要加上冒号, 参数名可以自定义
String sql = "INSERT INTO monster VALUES (:id,:monster_name,:skill)";
Map<String,Object> paramMap = new HashMap<String,Object>();
paramMap.put("id",101);
paramMap.put("monster_name","螃蟹精");
paramMap.put("skill","大钳子");
namedParameterJdbcTemplate.update(sql,paramMap);
}
8、使用namedParameterJdbcTemplate的方式,添加monster
/**
* 使用具名参数的方式,添加monster
*/
@Test
public void test09() {
NamedParameterJdbcTemplate namedParameterJdbcTemplate =
(NamedParameterJdbcTemplate) applicationContext.getBean("namedParameterJdbcTemplate");
String sql = "INSERT INTO monster VALUES (:id,:name,:skill)";
Monster monster = new Monster(111, "狐狸精", "美人计");
BeanPropertySqlParameterSource source = new BeanPropertySqlParameterSource(monster);
namedParameterJdbcTemplate.update(sql,source);
}
9、在Dao中使用 jdbcTemplate
/**
* 在Dao中使用jdbcTemplate
*/
@Test
public void test10() {
MonstrController monstrController = applicationContext.getBean(MonstrController.class);
monstrController.save();
}
@Repository
public class MonstrDao {
@Autowired
private JdbcTemplate jdbcTemplate;
public void save() {
String sql = "INSERT INTO monster VALUES (999,'蝎子精','毒液')";
jdbcTemplate.update(sql);
}
}
@Service
public class MonstrService {
@Autowired
private MonstrDao monstrDao;
public void save () {
monstrDao.save();
}
}
@Controller
public class MonstrController {
@Autowired
private MonstrService monstrService;
public void save() {
monstrService.save();
}
}