发表于: 2020-11-03 23:47:21
2 1592
今天完成的事情:
JDBC,JDBCTemplate的详解
JDBC,首先使用Class.forName("com.mysql.jdbc.Driver");加载驱动,之后通过getConnection(StringjdbcUrl,Stringuser,Stringpassword) 方法获取连接,连接到数据库。然后定义SQL语句,之后创建向数据库发送sql的statement对象,不过现在一般使用PreparedStatement 防止sql注入(SQL语句在程序运行前已经进行了预编译,当运行时动态地把参数传给PreprareStatement时,即使参数里有敏感字符如 or '1=1'也数据库会作为一个参数一个字段的属性值来处理而不会作为一个SQL指令)。例子:PreparedStatement ps = conn.preparedStatement(sql); 再来处理执行结果(ResultSet),最后释放资源,也就是归还连接,因为数据库连接(Connection)非常耗资源,所以尽量晚创建,尽量早的释放,且都要加try catch 以防前面关闭出错,免得后面的就不执行了
JDBCTemplate,JDBCTemplate其实是spring提供的一个模板,所以需要导入spring-jdbc的一个包。有了spring的加入节省了一下功能:节省代码,不管连接(Connection),不管事务,不管异常,不管关闭(con.close() ps.close )
首先创建db.properties配置文件(在这之前现在pom.xml中添加依赖spring-jdbc,连接池c3-p0),编写spring配置文件,在其中读取读取properties文件,生成c3p0连接池,之后生成jdbcTemplate,并注入连接池中。这样spring配置文件就编写完毕,感觉和spring+mybatis配置文件很像,在编写一个实体类,最后编写一个测试类,感觉和spring+mybatis没差了。
package com.xwj.util;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.util.CollectionUtils;
import com.xwj.bean.User;
public class TestJdbc {
private ApplicationContext ctx = null;
private JdbcTemplate jdbcTemplate = null;
{
ctx = new ClassPathXmlApplicationContext("ApplicationContext.xml");
jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplate");
}
/**
* 执行 INSERT
*/
@Test
public void testInsert() {
String sql = "INSERT INTO xwj_user(id, last_name, age) VALUES(?, ?, ?)";
jdbcTemplate.update(sql, "1", "a-xwj", 0);
}
/**
* 执行UPDATE
*/
@Test
public void testUpdate() {
String sql = "UPDATE xwj_user SET last_name = ? WHERE id = ?";
jdbcTemplate.update(sql, "b-xwj", 1);
}
/**
* 执行 DELETE
*/
@Test
public void testDelete() {
String sql = "DELETE from xwj_user WHERE id = ?";
jdbcTemplate.update(sql, 1);
}
/**
* 测试批量更新操作 最后一个参数是 Object[] 的 List 类型:因为修改一条记录需要一个 Object 数组,修改多条记录就需要一个
* List 来存放多个数组。
*/
@Test
public void testBatchUpdate() {
String sql = "INSERT INTO xwj_user(id, last_name, email) VALUES(?, ?, ?)";
List<Object[]> batchArgs = new ArrayList<>();
batchArgs.add(new Object[] { "2", "AA", "aa@atguigu.com" });
batchArgs.add(new Object[] { "3", "BB", "bb@atguigu.com" });
batchArgs.add(new Object[] { "4", "CC", "cc@atguigu.com" });
batchArgs.add(new Object[] { "5", "DD", "dd@atguigu.com" });
jdbcTemplate.batchUpdate(sql, batchArgs);
}
/**
* 从数据库中获取一条记录,实际得到对应的一个对象 注意:不是调用 queryForObject(String sql,Class<Employee> requiredType, Object... args) 方法!
* 而需要调用queryForObject(String sql, RowMapper<Employee> rowMapper, Object... args)
* 1、其中的 RowMapper 指定如何去映射结果集的行,常用的实现类为 BeanPropertyRowMapper
* 2、使用SQL中的列的别名完成列名和类的属性名的映射,例如 last_name lastName
* 3、不支持级联属性。 JdbcTemplate只能作为一个 JDBC 的小工具, 而不是 ORM 框架
*/
@Test
public void testQueryForObject() {
String sql = "SELECT id, last_name lastName, email FROM xwj_user WHERE ID = ?";
RowMapper<User> rowMapper = new BeanPropertyRowMapper<>(User.class);
// 在将数据装入对象时需要调用set方法。
User user = jdbcTemplate.queryForObject(sql, rowMapper, 2);
System.out.println(user);
}
/**
* 一次查询多个对象
* 注意:调用的不是 queryForList 方法
*/
@Test
public void testQueryForList() {
String sql = "SELECT id, name, email FROM xwj_user WHERE id > ?";
RowMapper<User> rowMapper = new BeanPropertyRowMapper<>(User.class);
List<User> userList = jdbcTemplate.query(sql, rowMapper, 1);
if (!CollectionUtils.isEmpty(userList)) {
userList.forEach(user -> {
System.out.println(user);
});
}
}
/**
* 获取单个列的值或做统计查询
* 使用 queryForObject(String sql, Class<Long> requiredType)
*/
@Test
public void testQueryForCount() {
String sql = "SELECT count(id) FROM xwj_user";
long count = jdbcTemplate.queryForObject(sql, Long.class);
System.out.println(count);
}
}
mybatis详解:和JDBCTemplate一样的配置pom.xml文件,首先配置log4j日志,之后配置SqlMapConfig.XML文件,在文件开始需设置
明天计划的事情:
遇到的问题:
收获:
评论