Spring中的JDBC
主要通过JdbcTemplate 实现功能
当然下面将用到 c3p0的连接池, 所用数据库的驱动这里使用的是免费的MySQL.
将使用的包导入c3p0-0.9.5-pre10.jar mysql-connector-java-5.1.7-bin.jar(根据实际情况决定)
为了程序的修改方便把连接数据库的 dataSouce放在了一个properties 文件中并在spring 的配置文件中使用。
db.property
user=root
password=123456
driverClass=com.mysql.jdbc.Driver
jdbcUrl=jdbc:mysql://localhost:3307/stuapp
initialPoolSize=5
maxPoolSize=10
配置c3p0的dataSouce(作用连接数据库)
<context:property-placeholder location="classpath:db.properties"/>
<bean id="dataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${user}"></property>
<property name="password" value="${password}"></property>
<property name="jdbcUrl" value="${jdbcUrl}"></property>
<property name="driverClass" value="${driverClass}"></property>
<property name="initialPoolSize" value="${initialPoolSize}"></property>
<property name="maxPoolSize" value="${maxPoolSize}"></property>
</bean>
主角登场 在spring 的配置文件中加入如下代码
<bean id="jdbcTemlplate"
class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
其实就是一个JdbcTemplate类,让spring帮忙自动加载了。当让我们也可以在代码中自己去创建对象并吧他的属性 dataSource赋值.(这里就不多说了)
这些配置好了以后就可以获取JdbcTemplate 实例了。
ApplicationContext ioc=new ClassPathXmlApplicationContext("jdbcContext.xml");
JdbcTemplate jdbcTemplate = (JdbcTemplate) ioc.getBean("jdbcTemlplate");
接下来就可以进行CRUD操作了
下面列举一下他的一些常用方法
1.batchUpdate(sql,ba); 对多条数据修改 传入一个集合
//id是主键
String sql="insert into appuser(id,nickname,profession,role,password,phone) values(?,?,?,?,?,?)";
List<Object[]> ba=new ArrayList<>();
ba.add(new Object[]{null,"Arik","Teacher","vip","123","1232123"});
ba.add(new Object[]{null,"Mark","Student","123456","public","456789"});
jdbcTemplate.batchUpdate(sql,ba);
2.update() 普通的操作方法
3.把查询的结果封装到对象中
String sql="select id,nickname,profession,role,password,phone from appuser where id=?";
RowMapper<appuser> rowmaper=new BeanPropertyRowMapper<appuser>(appuser.class);
appuser user=jdbcTemplate.queryForObject(sql, rowmaper,2);
4.把查询的结果封装到集合中
String sql="select id,nickname,profession,role,password,phone from appuser where id>?";
RowMapper<appuser> rowmaper=new BeanPropertyRowMapper<appuser>(appuser.class);
List<appuser> userList=jdbcTemplate.query(sql, rowmaper,1);
5.使用数据库函数查询
String sql="select count(id) from appuser";
long count=jdbcTemplate.queryForObject(sql, Long.class);
System.out.println(count);
具名参数的使用
通过使用NamedParameterJdbcTemplate 类来实现次功能
在spring的配置中加入
<bean id="nameJdbcTemlplate"
class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
<constructor-arg ref="dataSource"></constructor-arg>
</bean>
当让在要使用的时候首先获取实例
普通的操作做通过键值对来实现 。(相当于把原来的?边上号了,更加方便一一对应)
String sql="insert into appuser(id,nickname) values(:id,:nickname)";
Map<String, Object> paraMap=new HashMap<>();
paraMap.put("nickname", "asdf");
paraMap.put("id", 88);
nameTemplate.update(sql, paraMap);
也可以通过关系映射来修改数据库。例如给一个实例从而添加数据库。
其他的都是默认值这里主键 使用Integer 类型这样默认就是null 数据库就可以自增长。如果是int 如果不写默认就是0;这样就可能与主键唯一性相矛盾。
String sql="insert into appuser(id,nickname,profession,role,password,phone) values(:id,:nickname,:profession,:role,:password,:phone)";
appuser user=new appuser();
user.setNickname("Alice");
SqlParameterSource parameterSource=new BeanPropertySqlParameterSource(user);
nameTemplate.update(sql, parameterSource);
实际开发中如何使用JDBC
@Repository("jdbcDao")
public class jdbcFor {
@Autowired
JdbcTemplate jdbcTemplate;
@Test
public void testcount(){
String sql="select count(id) from appuser";
long count=jdbcTemplate.queryForObject(sql, Long.class);
System.out.println(count);
}
}
实际开发中的使用
当要用到持久层时 先通过注解获取实例让后就可以直接调用方法了。(应为前面连接数据库,jdbcTemplate对象的创建都由Spring帮我们完成了)
事物
概念
一系列的动作,要么都完成要么都不完成。(原子性)
属性:原子性,一致性,隔离性,持久性
使用事物可以使用代码,也可以使用声明。这里讲解声明式事物。
要导入tx 命名空间
<bean id="transanctionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
<property name="dataSource" ref="dataSource"></property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
接下只要加在方法上加上注解就行了。就是这么简单。
@Transactional
当然事物是通过异常来捕捉的。所以在你的事物上要有业务逻辑处理,并抛出异常。
事物的传播行为
一个事物 调用另一个事物方法。是整体算一个事物 还是,每一个事物只要成功就行,不成功的只回归自己的事物?
required 最外层的事物 为准,只要有不成功的就回归到最初始状态。
required-new 只要自己的事物成功,其他事物失败不会被回滚。