JdbcTemplate
知识点1:准备
导入相关jar包;
解释:
1.第一个框是mysql连接池和连接
2.第二个框是spring里的jar引入
- orm是其他框架,spring结合用
- tx是处理事务的
xml配置
<!-- 数据库连接池 --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close"> <property name="url" value="jdbc:mysql:///user_db" />//user_db是你自己的数据库名 <property name="username" value="root" /> <property name="password" value="root" /> <property name="driverClassName" value="com.mysql.cj.jdbc.Driver" /> </bean>
配置JdbcTemplate对象,注入DataSource
<!--JdbcTemplate对象获取--> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" > <!--注入dataSource--> <property name="dataSource" ref="dataSource" /> </bean>
创建service类,dao类,在dao注入jdbcTemplate对象
- 开启扫描
<!--开启组件扫描--> <context:component-scan base-package="com.gudoaxia.jdbcTemplate"></context:component-scan>
- service类
@Service public class BookService { //注入dao @Autowired private BookDao bookDao; }
- dao类
@Repository public interface BookDao { } @Repository public class BookDaoImpl implements BookDao{ //注入JdbcTemplate @Autowired private JdbcTemplate jdbcTemplate; }
知识点2:添加
知识点3:修改
知识点4:查询
知识点5:批量添加
完整代码
server层
@Service public class BookService { //注入dao @Autowired private BookDao bookDao; //添加的方法 public void addBook(Book book){ bookDao.add(book); } //修改的方法 public void updateBook(Book book){ bookDao.updateBook(book); } //删除的方法 public void deleteBook(String id){ bookDao.delete(id); } //4. 查询返回某个值的方法:表记录数 public int selectCount(){ return bookDao.selectCount(); } //5. 查询返回对象 public Book findOne(String id){ return bookDao.findBookInfo(id); } //6. 查询返回集合 public List<Book> findAllBook(){ return bookDao.findAllBook(); } //7. 批量操作添加 public void batchAdd(List<Object[]> batchArgs){ bookDao.batchAddBook(batchArgs); } }
Dao层
public interface BookDao { //添加的方法 void add(Book book); void updateBook(Book book); void delete(String id); int selectCount(); Book findBookInfo(String id); List<Book> findAllBook(); void batchAddBook(List<Object[]> batchArgs); }
@Repository public class BookDaoImpl implements BookDao{ //注入JdbcTemplate @Autowired private JdbcTemplate jdbcTemplate; //1. 添加的方法 @Override public void add(Book book) { String sql = "insert into t_book values(?,?,?)"; Object[] args = {book.getUserId(), book.getUserName(), book.getUserStatus()}; int update = jdbcTemplate.update(sql, args); System.out.println("添加成功,添加了"+update+"行"); } //2. 修改的方法 @Override public void updateBook(Book book) { String sql = "update t_book set name=?,status=? where id=?"; Object[] args = {book.getUserName(),book.getUserStatus(),book.getUserId()}; int update = jdbcTemplate.update(sql, args); System.out.println("修改成功,修改了"+update+"行"); } //3. 删除的方法 @Override public void delete(String id) { String sql ="delete from t_book where id=?"; jdbcTemplate.update(sql,id); } //4. 查询返回某个值的方法 @Override public int selectCount() { String sql ="select count(*) from t_book"; Integer count = jdbcTemplate.queryForObject(sql, Integer.class); return count; } //5. 查询返回对象 @Override public Book findBookInfo(String id) { String sql = "select id as userId,name as userName,status as userStatus from t_book where id=?"; //第二参数:RowMapper接口,针对返回不同数据类型数据,用于数据封装,即封装sql语句。 Book book = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<Book>(Book.class), id); return book; } //6. 查询返回集合 @Override public List<Book> findAllBook() { String sql ="select id as userId,name as userName,status as userStatus from t_book"; List<Book> bookList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<Book>(Book.class)); return bookList; } //7. 批量操作 @Override public void batchAddBook(List<Object[]> batchArgs) { String sql ="insert into t_book values(?,?,?)"; int[] ints = jdbcTemplate.batchUpdate(sql,batchArgs); System.out.println(Arrays.toString(ints)); } }
测试
public class testJdbcDemo { @Test public void testJdbc(){ ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml"); BookService bookService = context.getBean("bookService", BookService.class); // //添加 // Book book = new Book(); // book.setUserId("2"); // book.setUserName("Spring6"); // book.setUserStatus("a"); // bookService.addBook(book); // //修改:根据id修改 // Book book2 = new Book(); // book2.setUserId("1"); // book2.setUserName("JavaWeb"); // book2.setUserStatus("a"); // bookService.updateBook(book2); // //删除 // bookService.deleteBook("2"); // //查询返回某个值 // int i = bookService.selectCount(); // System.out.println("返回查询数量:"+i); // //查询返回对象 // Book one = bookService.findOne("1"); // System.out.println(one); // //查询返回集合 // List<Book> allBook = bookService.findAllBook(); // System.out.println(allBook); //批量添加 ArrayList<Object[]> batchArgs = new ArrayList<>(); Object[] o1 = {"2","Java","a"}; Object[] o2 = {"3","C++","a"}; Object[] o3 = {"4","Mysql","a"}; batchArgs.add(o1); batchArgs.add(o2); batchArgs.add(o3); bookService.batchAdd(batchArgs); } }
总结:
- 使用JdbcTemplate准备工作:
- jar包,德鲁伊连接池,xml的jdbcTemplate的dataSource注入
- crud环节:
- 添加:使用setX方法添加;
- 修改:根据id修改;
- 删除:根据id删除;
- 查询:查询某个值;查询获取某个对象;查询获取多个对象;
- 批量增加:batchUpdate(sql,batchArgs):batchArgs为Object类型的集合;
- 在server层编写方法,对外部暴露调用;在server层的方法实际调用的是:dao层接口的实现类的方法,具体的业务逻辑在实现类中具体编写。
JdbcTemplate | 方法 | 参数说明 |
---|---|---|
添加 | update(sql, args) | args占位符 |
修改 | update(sql, args) | args占位符 |
删除 | update(sql,id) | args占位符 |
查询count* | queryForObject(sql, Integer.class) | 第二参数为查询返回类型类 |
查询一条记录 | queryForObject(sql, new BeanPropertyRowMapper |
第二参数为sql数据封装 |
查询多条记录 | query(sql, new BeanPropertyRowMapper |
第二参数为sql数据封装 |
批量添加 | batchUpdate(sql,batchArgs) | 第二参数为要批量添加的行行记录,通常为数组类型的集合。 |
debug
准备环节
bug1:
问题:使用注解autowired 注入jdbctemplate , 代码爆红,无法注入的解决。
解决思路:可能是xml配置文件的注入dataSource出错,在<property name="dataSource" ref="dataSource"></property>
上的光标XML tag has empty body,说明这里出错。
解决:改为<property name="dataSource" ref="dataSource" />
总结:idea太过智能便捷,导致导入标签错误。这里应该使用单标签,进行获取jdbctemplate 对象。
比任何人都要努力
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)