博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring JDBC模板
阅读量:6314 次
发布时间:2019-06-22

本文共 10348 字,大约阅读时间需要 34 分钟。

Spring的JDBC的模板

  • Spring是EE开发的一站式的框架,有EE开发的每层的解决方案。
  • Spring对持久层也提供了解决方案:ORM模块和JDBC的模板。
  • Spring提供了很多的模板用于简化开发
    • JDBC:org.springframework.jdbc.core.jdbc.jdbcTemplate
    • Hibernate:orm.springframework.orm.hibernamte.HibernateTemplate

JDBC模板使用的入门

引入jar包

  • spring开发基本jar包
  • 数据库驱动
  • Spring的JDBC模板的jar包

1472533-20190514004735556-1372565126.png

创建数据库和表

create table account(    id int primary key auto_increment,    name varchar(20),    money double);

使用JDBC的模板

@Testpublic void test() {    // 1. 创建连接池(数据库相关信息)    DriverManagerDataSource dataSource = new DriverManagerDataSource();    dataSource.setDriverClassName("com.mysql.jdbc.Driver");    // "jdbc:mysql:///spring" 相当于 "dbc:mysql://localhost:3306/spring"    dataSource.setUrl("jdbc:mysql://localhost:3307/spring");    dataSource.setUsername("root");    dataSource.setPassword("123456");    // 2. 创建JDBC模板    JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);    jdbcTemplate.update("insert into account values (null,?,?)", "IT666", 1000d);}

将连接池和模板交给Spring管理

配置文件配置Bean

1472533-20190514004746088-1081461695.png

使用jdbcTemplate注解插入数据

@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration("classpath:applicationContext.xml")public class SpringJdbcTest2 {    @Resource(name = "jdbcTemplate")    private JdbcTemplate jdbcTemplate;    @Test    public void test() {        jdbcTemplate.update("insert into account values (null,?,?)", "IT888", 1000d);    }}

使用开源连接池

DBCP

引入jar包

1472533-20190515113004973-496687616.png

配置DBCP连接池

测试

@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration("classpath:applicationContext.xml")public class SpringJdbcTest2 {    @Resource(name = "jdbcTemplate")    private JdbcTemplate jdbcTemplate;    @Test    public void test() {        jdbcTemplate.update("insert into account values (null,?,?)", "IT777", 1000d);    }}

C3P0

引入jar包

1472533-20190515113011436-845258170.png

配置

测试同上

DRUID

引入jar包

1472533-20190515113017370-1467449974.png

配置

测试同上

运行时发生错误:

1472533-20190515113025576-1658068735.png

解决方法:

将 druid-1.0.15.jar 换成 druid-1.1.11.jar 即可

1472533-20190515113029843-441117300.png

使用属性文件配置数据库连接信息

1.创建属性文件

jdbc.properties

driverClass=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3307/springusername=rootpassword=123456

2.配置文件中引入属性文件

(1)<bean>方式

测试:

@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration("classpath:applicationContext.xml")public class SpringJdbcTest2 {    @Resource(name = "jdbcTemplate")    private JdbcTemplate jdbcTemplate;    @Test    public void test() {        jdbcTemplate.update("insert into account values (null,?,?)", "IT789", 1000d);    }}

(2)<context/>方式

配置文件要加上

1472533-20190515133006961-299363619.png

jdbc.properties

key值不能和name一样,所以一般加上jdbc前缀

jdbc.driverClass=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3307/springjdbc.username=rootjdbc.password=123456

applicationContext.xml

测试同上

JDBC模板CRUD操作

插入操作、删除操作、更新操作

@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration("classpath:applicationContext.xml")public class SpringJdbcTest2 {    @Resource(name = "jdbcTemplate")    private JdbcTemplate jdbcTemplate;    // 插入操作    @Test    public void insert() {        jdbcTemplate.update("insert into account values (null,?,?)", "IT147", 1000d);    }    // 删除操作    @Test    public void delete(){        jdbcTemplate.update("delete from account where id=?",1);    }    // 更新操作    @Test    public void update(){        jdbcTemplate.update("update account set name=?,money=? where id=?","IT666",2000d,9);    }}

查询操作

(1)查询某一个字段

@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration("classpath:applicationContext.xml")public class SpringJdbcTest2 {    @Resource(name = "jdbcTemplate")    private JdbcTemplate jdbcTemplate;    @Test    public void query(){        String name = jdbcTemplate.queryForObject("select name from account where id=?",String.class,9);        System.out.println(name);    }    @Test    public void queryCount(){        long count = jdbcTemplate.queryForObject("select count(*)from account",long.class);        System.out.println(count);    }}

(2)查询返回对象的集合

使用 lombok,开启注解

1472533-20190515233207877-1197187947.png

@Getter@Setterpublic class Account {    private Integer id;    private String name;    private double money;    @Override    public String toString() {        return "Account{" +                "id=" + id +                ", name='" + name + '\'' +                ", money=" + money +                '}';    }}

(2.1)返回一个对象

@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration("classpath:applicationContext.xml")public class SpringJdbcTest2 {    @Resource(name = "jdbcTemplate")    private JdbcTemplate jdbcTemplate;    @Test    public void queryAccount(){        Account account = jdbcTemplate.queryForObject("select * from account where id=?", new MyRowMap(), 9);        System.out.println(account);    }}class MyRowMap implements RowMapper
{ @Override public Account mapRow(ResultSet resultSet, int i) throws SQLException { Account account = new Account(); account.setId(resultSet.getInt("id")); account.setName(resultSet.getString("name")); account.setMoney(resultSet.getDouble("money")); return account; }}

(2.2)返回所有对象集合

@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration("classpath:applicationContext.xml")public class SpringJdbcTest2 {    @Resource(name = "jdbcTemplate")    private JdbcTemplate jdbcTemplate;    @Test    public void queryAllAccount(){        List
query = jdbcTemplate.query("select * from account", new MyRowMap()); for (Account account : query) { System.out.println(account); } }}class MyRowMap implements RowMapper
{ @Override public Account mapRow(ResultSet resultSet, int i) throws SQLException { Account account = new Account(); account.setId(resultSet.getInt("id")); account.setName(resultSet.getString("name")); account.setMoney(resultSet.getDouble("money")); return account; }}

通过内省重构 mapRow() 方法

public class RowMap
implements RowMapper
{ private Class
classType; public RowMap(Class
classType) { this.classType = classType; } @Override public T mapRow(ResultSet resultSet, int i) throws SQLException { T obj = null; try { // 创建一个对象 obj = this.classType.newInstance(); // 通过内省来拿属性 , Object.class BeanInfo bf = Introspector.getBeanInfo(this.classType, Object.class); // 获取所有属性描述器 PropertyDescriptor[] pds = bf.getPropertyDescriptors(); // 遍历每一个属性的描述器 for (PropertyDescriptor pd : pds) { if (pd.getName().equals("anonymousName")) continue; Object val = resultSet.getObject(pd.getName()); // 给对象设置属性值 pd.getWriteMethod().invoke(obj, val); } } catch (Exception e) { e.printStackTrace(); } return obj; }}

测试

@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration("classpath:applicationContext.xml")public class SpringJdbcTest2 {    @Resource(name = "jdbcTemplate")    private JdbcTemplate jdbcTemplate;    @Test    public void queryAllAccount(){        List
query = jdbcTemplate.query("select * from user", new MyRowMap(User.class)); for (User user : query) { System.out.println(user); } }}class MyRowMap extends RowMap
{ public MyRowMap(Class
classType) { super(classType); }}

通过反射重构 mapRow() 方法

public class RowMapNew
implements RowMapper
{ private Class
classType; public RowMapNew(Class
classType) { this.classType = classType; } @Override public T mapRow(ResultSet resultSet, int i) throws SQLException { T obj = null; try { // 创建一个对象 obj = this.classType.newInstance(); // 通过反射来拿属性和方法 Field[] fields = this.classType.getDeclaredFields(); Method[] methods = this.classType.getDeclaredMethods(); // 遍历每一个属性 for (Field field : fields) { Object val = resultSet.getObject(field.getName()); // 将属性名的首字母变为大写 String s = field.getName().substring(0, 1).toUpperCase() + field.getName().substring(1); // 给对象设置属性值 for (Method method : methods) { if(("set"+s).equals(method.getName())){ method.invoke(obj,val); break; } } } } catch (Exception e) { e.printStackTrace(); } return obj; }}

测试

@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration("classpath:applicationContext.xml")public class SpringJdbcTest2 {    @Resource(name = "jdbcTemplate")    private JdbcTemplate jdbcTemplate;    @Test    public void queryAllAccount(){        List
query = jdbcTemplate.query("select * from account", new MyRowMap(Account.class)); for (Account account : query) { System.out.println(account); } }}class MyRowMap extends RowMapNew
{ public MyRowMap(Class
classType) { super(classType); }}

转载于:https://www.cnblogs.com/xzh0717/p/10859973.html

你可能感兴趣的文章
Kubernetes概念
查看>>
逻辑卷管理器(LVM)
查看>>
一个小代码,欢迎大佬的意见,求指正
查看>>
Spring.Net+WCF实现分布式事务
查看>>
个人简历-项目经验
查看>>
swoole异步任务task处理慢请求简单实例
查看>>
oracle数据泵导入分区表统计信息报错(四)
查看>>
spring技术内幕读书笔记之IoC容器的学习
查看>>
细说多线程(五) —— CLR线程池的I/O线程
查看>>
JavaScript instanceof和typeof的区别
查看>>
Hadoop文件系统详解-----(一)
查看>>
状态码
查看>>
我的友情链接
查看>>
用sqlplus远程连接oracle命令
查看>>
多年一直想完善的自由行政审批流程组件【2002年PHP,2008年.NET,2010年完善数据设计、代码实现】...
查看>>
自动生成四则运算题目
查看>>
【前台】【单页跳转】整个项目实现单页面跳转,抛弃iframe
查看>>
数据库设计中的14个技巧
查看>>
Android学习系列(5)--App布局初探之简单模型
查看>>
git回退到某个历史版本
查看>>