最基础的数据库连接JDBC
Connection conn=null; Statement statement=null; PreparedStatement ps=null; ResultSet rs=null; try { // 装载数据库的驱动 Class.forName("com.mysql.jdbc.Driver"); // 建立数据库连接 conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jj","root","root"); // 事务处理 conn.setAutoCommit(false); // 创建Statement statement=conn.createStatement(); // 设置SQL执行的参数 String sql="insert into user values(null,‘csdn1‘,‘csdn1‘)"; // 执行对数据库的操作 statement.execute(sql); // 处理执行结果 // 事务处理 conn.commit(); // 处理执行过程中的异常 // 释放各种资源,关闭数据库连接 statement.close(); conn.close(); } catch (Exception e) { try { conn.rollback(); } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } e.printStackTrace(); }
Spring JDBC所需要的jar包:
JDBCTemplate是Spring JDBC核心包的核心类。
将JdbcTemplate类作为一个普通Bean交给Spring的IOC容器管理,就可以直接得到该对象的实例进行各种数据库操作(增加、修改、查询和删除)。
1.使用JdbcTemplate进行数据访问:
初始化JdbcTemplate
初始化JdbcTemplate很容易,只需要向它的构造方法传入它所使用的DataSource便可以。如果使用Jakarta Commons DBCP,那么初始化代码如下所示:
1
|
BasicDataSource
dataSource = new BasicDataSource();
|
2
|
dataSource.setDriverClassName( "com.mysql.jdbc.Driver" );
|
3
|
dataSource.setUrl( "jdbc:mysql://localhost/mysql?characterEncoding=UTF-8" );
|
4
|
dataSource.setUsername( "root" );
|
5
|
dataSource.setPassword( "root" );
|
6
|
JdbcTemplate
jdbcTemplate = new JdbcTemplate(dataSource);
|
也可以通过无参的构造方法构造JdbcTemplate,然后通过setDataSource(DataSource dataSource)来设置其dataSource。
上述这种方法是通过编码的方式构造JdbcTemplate,如果应用程序使用spring的IOC容器,其初始化工作便可移植到容器的配置文件applicationContext.xml当中:
01
|
<!--
dataSource -->
|
02
|
< bean id = "dataSource"
|
03
|
class = "org.apache.commons.dbcp.BasicDataSource"
|
04
|
>
|
05
|
|
06
|
< property name = "driverClassName" >
|
07
|
< value >com.mysql.jdbc.Driver</ value >
|
08
|
</ property >
|
09
|
< property name = "url" value = "jdbc:mysql://localhost:3306/jj?characterEncoding=UTF-8" />
|
10
|
< property name = "username" value = "root" />
|
11
|
< property name = "password" value = "root" />
|
12
|
</ bean >
|
13
|
<!--
jdbcTemplate -->
|
14
|
< bean id = "jdbcTemplate"
|
15
|
class = "org.springframework.jdbc.core.JdbcTemplate" >
|
16
|
< property name = "dataSource" >
|
17
|
< ref bean = "dataSource" />
|
18
|
</ property >
|
19
|
</ bean >
|
ApplicationContext ctx = new ClassPathXmlApplicationContext( "applicationContext.xml"); JdbcTemplate jt = (JdbcTemplate) ctx.getBean("jdbcTemplate"); //1.构建sql语句 //insert into user(name,pass) values(‘java‘,‘ym‘) String sql="delete from user where id=1"; jt.execute(sql);
连接数据库后会执行我的sql语句,删除数据库里jj下的表user里面的id=1的数据。
String sql = "insert into user(name,pass,sex,age) values(?,?,?,?)"; // 构建参数 Object[] sargs = new Object[4]; sargs[0] = "xx"; sargs[1] = "111"; sargs[2] = "nv"; sargs[3] = 12; // 构建参数类型 int[] argsTye = new int[4]; argsTye[0] = Types.VARCHAR; argsTye[1] = Types.VARCHAR; argsTye[2] = Types.CHAR; argsTye[3] = Types.INTEGER; jt.update(sql, sargs, argsTye);
String sql="select *from user"; //返回查询List List<Map<String, Object>> List<Map<String, Object>> list=jt.queryForList(sql); for(Map map:list){ Set keys=map.keySet(); Iterator it=keys.iterator(); while(it.hasNext()){ String key=it.next().toString(); System.out.println(key+":"+map.get(key)); // System.out.println(map.get(key)); } }
NamedParameterJdbcTemplate
为每个参数定义一个名字,在SQL语句中增加 : 标示。
两种赋值方式:
Map对象赋值
MapSqlParameterSource实现赋值
// 占位符的替代 ,使用:id作为占位符 // 必须使用构造函数注入DataSource NamedParameterJdbcTemplate njt = new NamedParameterJdbcTemplate( (BasicDataSource) ctx.getBean("dataSource")); String sql = "delete from user where id=:id"; //1. Map map = new HashMap(); map.put("id", 4); njt.update(sql, map); //2. /*MapSqlParameterSource mapSqlParameterSource=new MapSqlParameterSource("id",new Integer("3")); njt.update(sql, mapSqlParameterSource);*/
1)NamedParameterJdbcTemplate初始化:可以使用DataSource或JdbcTemplate 对象作为构造器参数初始化;
2)delete from user where id=:id:其中“:id”就是命名参数;
用占位符写的删除
//4.删除 String sql="delete from user where id=?"; Object[] args1=new Object[1]; args1[0]=5; int[] argType=new int[1]; argType[0]=Types.INTEGER; jt.update(sql, args1, argType);
3) update(insertSql, paramMap):其中paramMap是一个Map类型,包含键为“name”,值为“name5”的键值对,也就是为命名参数设值的数据;
//5.更新数据 String sql="update user set name=? where id=?"; Object[] args1=new Object[2]; args1[0]="spring"; args1[1]=8; int[] a=new int[2]; a[0]=Types.VARCHAR; a[1]=Types.INTEGER; jt.update(sql, args1, a);
4)query(selectSql, paramMap, new RowCallbackHandler()……):类似于JdbcTemplate中介绍的,唯一不同是需要传入paramMap来为命名参数设值;
package www.csdn.jdbc.model; public class User { private int id; private String name; private String pass; private String sex; private Integer age; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPass() { return pass; } public void setPass(String pass) { this.pass = pass; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
String sql="select * from user"; //封装返回值 RowMapper map=new RowMapper() { // 封装为一个自定义对象 //回调方法把结果集封装成自定义对象 @Override public Object mapRow(ResultSet rs, int rownum) throws SQLException { User user=new User(); //列号索引 user.setId(rs.getInt(1)); user.setName(rs.getString(2)); user.setPass(rs.getString(3)); user.setSex(rs.getString(4)); user.setAge(rs.getInt(5)); System.out.println("行号:"+rownum); return user; } }; //多条数据查询 List<User> users=jt.query(sql, map); for(User u:users){ System.out.println(u.getId()+"=="+u.getName()+u.getPass()+"=="+u.getSex()+"=="+u.getAge()); } }
5)update(deleteSql, paramSource):类似于“update(insertSql, paramMap)”,但使用SqlParameterSource参数来为命名参数设值,此处使用MapSqlParameterSource实现,其就是简单封装java.util.Map。
NamedParameterJdbcTemplate类为命名参数设值有两种方式:java.util.Map和SqlParameterSource:
1)java.util.Map:使用Map键数据来对于命名参数,而Map值数据用于设值;
2)SqlParameterSource:可以使用SqlParameterSource实现作为来实现为命名参数设值,默认有MapSqlParameterSource和BeanPropertySqlParameterSource实现;MapSqlParameterSource实现非常简单,只是封装了java.util.Map;而BeanPropertySqlParameterSource封装了一个JavaBean对象,通过JavaBean对象属性来决定命名参数的值。