JDBC总结

目录

dao

jdbc

pojo 数据承载bean

service

utils

JDBC

JDBC(Java Database Connectivity) Java 连接数据库的规范(标准),可以使用 Java 语言连接数据库完成 CRUD 操作

JDBC 核心思想

Java 中定义了访问数据库的接口,可以为多种关系型数据库提供统一的访问方式。由数据库厂商提供驱动实现类(Driver 数据库驱动)。

在这里插入图片描述

JDBC开发步骤

环境准备

a、将数据库连接驱动包赋值到当前工程的lib文件夹下

b、将jar包添加到类路径(class文件生成的位置)中。右击jar包 —> add as library(jvm只解析类路径)

注册数据库驱动

创建Driver对象,注册Driver

//1、注册数据库驱动
//实现方式一:不推荐使用
//Driver driver = new Driver();
//DriverManager.registerDriver(driver);
//Driver类里有个静态代码块,相当于注册两次
//实现方式二:推荐使用
Class.forName("com.mysql.jdbc.Driver");//主动触发类加载,执行静态代码块,进而注册驱动————反射

获取数据库的连接

// 2、获取数据库连接对象Connection
/**
  网络编程三要素
* 协议+地址+端口
* jdbc:mysql://localhost:3306/数据库名?serverTimezone=UTC
*/
Connection conn =
DriverManager.getConnection("jdbc:mysql://localhost:3306/java2105", "root",
"123456");

获取数据库操作对象Statement

// 3、获取数据库操作对象
Statement statement = conn.createStatement();

通过Statement对象执行SQL语句

// 4、通过数据库操作对象执行SQL语句
int count = statement.executeUpdate(
"insert into emp (empno,ename,job,mgr,hiredate,sal,comm,deptno)
values (6666,'张三','java',7369,'2021-05-01',30000,200,30)");

处理返回结果

// 5、处理结果
if(count > 0){
System.out.println("插入成功!!");
}else{
System.out.println("插入失败!!");
}

释放资源

//6、释放资源
statement.close();
conn.close();

ResultSet结果集

查询操作,返回的是结果集

//5、处理结果集
/**
\* ResultSet提供了一组方法
\* next(); 判断是否有下一行数据,如果有返回true,并将游标移动到下一行
\* getXXX("字段名"); XXX表示字段在java中的对应的类型

\* getXXX(列的下标); XXX表示字段在java中的对应的类型
*/
//释放资源也得关掉
while(rs.next()){
int empno = rs.getInt("empno");
//int empno = rs.getInt(1);
System.out.println(empno);
String ename = rs.getString("ename");
System.out.println(ename);
}

登陆案例

/**
* 登录的思路:
* 1、根据用户输入的用户名和密码到数据库中查询
* select * from tb_user where username = "你输入的用户名" and password =
"你输入的密码"
* select * from tb_user where username = admin and password = 123
* 如果有结果:登录成功
* 如果没有结果:登录失败
*/

登陆实现

public class JDBCDemo05 {
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户名");
String username = sc.nextLine();
System.out.println("请输入密码");
String password = sc.nextLine();
Class.forName("com.mysql.jdbc.Driver");
Connection conn =
DriverManager.getConnection("jdbc:mysql:///java2105", "root",
"123456");
Statement statement = conn.createStatement();
String sql = " select * from tb_user where username = '" +
username + "' and password = '" + password +"'";
System.out.println(sql);
ResultSet rs = statement.executeQuery(sql);
if(rs.next()){
//登录成功
System.out.println("登录成功");
}else{
//登录失败
System.out.println("登录失败");
}
rs.close();
statement.close();
conn.close();
}
}

登录案例分析

以上代码会出现SQL注入问题

  • 用户输入的数据中有 SQL 关键字或语法并且参与了 SQL 语句的编译,导致 SQL 语句编译后的条件含义为 true,一直得到正确的结果。这种现象称为 SQL 注入。
  • 字符串的拼接操作也是非常的不方便

更新

public class JDBCDemo06 {
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户名");
String username = sc.nextLine();
System.out.println("请输入密码");
String password = sc.nextLine();
Class.forName("com.mysql.jdbc.Driver");
Connection conn =
DriverManager.getConnection("jdbc:mysql:///java2105", "root",
"123456");
//3、获取数据库操作对象PreparedStatement 预加载SQL语句
PreparedStatement ps =
conn.prepareStatement("select * from tb_user where username = ? and
password = ?");
//3.1 设置占位符的值
/**
* PreparedStatement对象中提供了一组方法
* setXXX(index从1开始,要传入的值) XXX表示对应的java类型
*/
ps.setString(1,username);
ps.setString(2,password);
System.out.println(ps);
//4、执行SQL语句
ResultSet rs = ps.executeQuery();
if(rs.next()){
//登录成功
System.out.println("登录成功");
}else{
//登录失败
System.out.println("登录失败");
}
rs.close();
ps.close();
conn.close();
}
}

PreparedStatement

PreparedStatement 继承了 Statement 接口,执行 SQL 语句的方法无异。
作用:

  • 预编译SQL 语句,效率高。
  • 安全,避免SQL注入

ORM映射

ORM (Object Relational Mapping)

将数据库中的表的数据,一行一行的映射到Java对象中

多行数据:List empList;

开放中交给前端

在这里插入图片描述

一行数据
Emp emp = new Emp(empno,ename,job,mgr,hiredate,sal,comm,deptno);

javaBean实体类的规范

不用写,有插件,注解

  • 私有化属性提供set,get方法
  • 提供有参无参构造
  • 类名要与表 一致,属性名和字段名字一致
  • 基本数据类型要使用包装类(默认值为null)
  • 在有需要的话实现序列化接口

代码

public class JDBCDemo04 {
public static void main(String[] args) throws Exception {
//1、注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2、获取数据库连接对象
Connection conn = DriverManager.getConnection("jdbc:mysql:///java2105",
"root", "123456");
//3、获取数据库操作对象
Statement statement = conn.createStatement();
//4、执行SQL语句
ResultSet rs = statement.executeQuery("select * from emp");
//5、处理结果集
//定义List集合保存所有的emp对象
List<Emp> empList = new ArrayList<>();
while(rs.next()){
        int empno = rs.getInt("empno");
        String ename = rs.getString("ename");
        String job = rs.getString("job");
        int mgr = rs.getInt("mgr");
        Date hiredate = rs.getDate("hiredate");
        double sal = rs.getDouble("sal");
        double comm = rs.getDouble("comm");
        int deptno = rs.getInt("deptno");
        //将查询的结果存放到Emp对象中
        Emp emp = new Emp(empno,ename,job,mgr,hiredate,sal,comm,deptno);
        //将Emp对象添加到List中
        empList.add(emp);
}
//遍历集合中所有元素
empList.forEach(System.out::println);
// for(Emp emp : empList){
// System.out.println(emp);
// }
//6、释放资源
rs.close();
statement.close();
conn.close();
}
}

封装工具类

  • 注册数据库驱动(静态代码块)

    • 数据库只需注册一次,放在静态代码块中
    • 只会在类加载时执行一次
    • 静态代码块中不能抛出异常,只能捕获
  • 获取数据库连接 (方法:getConnection)

    • 不用每次暴漏
  • 释放资源 (方法:closeAll(Connection , Statement , ResultSet ))

  • 硬编码,不利于维护,在src根目录下创建一个db.propertoes(新建file--xx.properties格式)
    
  • 将配置信息放到properties配置文件中,减少硬编码

/**
* 数据库工具类
*/
public class JDBCUtils {
/**
* 1、注册驱动(只需要注册一次)
* 可以将注册驱动的代码写到静态代码块中
* 2、获取数据库连接
* 提供静态一个方法,用于返回数据库连接对象
* 3、关闭资源
* 提供静态一个方法,用于释放资源
* 4、硬编码问题(.xml .properties)
* 将数据源信息保存到配置文件中,然后在代码中进行读取
* properties文件的格式:key和value都是String类型
* key=value,根据key取value
*/
private static String driver;
private static String url;
private static String username;
private static String password;
static{
try {
//读取配置文件
Properties properties = new Properties();
//通过类对象读取当前类路径下的资源
//获取类对象,有个方法,获取类加载器(加载src下的资源有个方法)会返回一个io流
//任何一个类都是通过类加载器加载到方法区的
InputStream in =
JDBCUtils.class.getClassLoader().getResourceAsStream("db.properties");
//将配置文件中的信息读取到Properties集合中
//test格式也行,但不用切割,直接用load方法就行
properties.load(in);
//从集合中取出数据
//根据key取value    
driver = properties.getProperty("driver");
url = properties.getProperty("url");
username = properties.getProperty("username");
password = properties.getProperty("password");
//注册驱动
Class.forName(driver);
} catch (Exception e) {
e.printStackTrace();
}
}
//后面的参数就不写死    
    
public static Connection getConnection(){
Connection conn = null;
try {
conn = DriverManager.getConnection(url,username,password);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return conn;
 //为什么只传个statement,而不是prestatement————父类
//多态
 
public static void closeAll(Connection conn, Statement statement, ResultSet
rs){
try {
    //判断一下,不用写多个
if(rs!=null)
rs.close();
if(statement != null)
statement.close();
if(conn != null)
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}

配置文件 db.properties

driver123=com.mysql.jdbc.Driver
url=jdbc:mysql:///java2105
username=root
password=123456

工具类测试

public class JDBCDemo01 {
public static void main(String[] args) throws SQLException {
//2、获取数据库连接
Connection conn = JDBCUtils.getConnection();
//3、获取数据库操作对象
PreparedStatement ps = conn.prepareStatement("select * from emp");
//4、执行SQL语句
ResultSet rs = ps.executeQuery();
//5、处理结果集
while(rs.next()){
int empno = rs.getInt("empno");
String ename = rs.getString("ename");
String job = rs.getString("job");
int mgr = rs.getInt("mgr");
Date hiredate = rs.getDate("hiredate");
double sal = rs.getDouble("sal");
double comm = rs.getDouble("comm");
int deptno = rs.getInt("deptno");
System.out.println(ename);
}
//6、释放资源
JDBCUtils.closeAll(conn,ps,rs);
}
}

DAO (Data Access Object)

DAO 实现了业务逻辑与数据库访问相分离。

  • 对同一张表的所有操作封装在XxxDaoImpl对象中。
  • 根据增删改查的不同功能实现具体的方法(insert、update、delete、select、selectAll)。
  • 一个DAO对应数据库中的一张表,按照面向接口设计

开发流程

EmpDao接口

public interface EmpDao {
//增加员工
int insertEmp(Emp emp) throws SQLException;
//删除员工
int deleteEmp(int empno);
//修改员工
int updateEmp(Emp emp) throws SQLException;
//查询所有员工
List<Emp> selectAll() throws SQLException;
//查询单个员工
Emp selectOne(int empno);
}

实体类

com.qf.pojo包下创建实体类

public class Emp {
private Integer empno;
private String ename;
private String job;
private Integer mgr;
private Date hiredate;
private Double sal;
private Double comm;
private Integer deptno;
//省略get、set、构造方法
}
EmpDao实现类
public class EmpDaoImpl implements EmpDao {
@Override
public int insertEmp(Emp emp) throws SQLException {
//2、获取数据库连接对象
Connection conn = JDBCUtils.getConnection();
//3、获取数据库操作对象
PreparedStatement ps = conn.prepareStatement("insert into emp
values(?,?,?,?,?,?,?,?)");
//3.1设置占位符的值
ps.setInt(1,emp.getEmpno());
ps.setString(2,emp.getEname());
ps.setString(3,emp.getJob());
ps.setInt(4,emp.getMgr());
//将util.date 转换成 sql.date
//emp中保存的是java.util.Date,setDate方法要传的是java.sql.date
ps.setDate(5,new Date(emp.getHireadate().getTime()));
ps.setDouble(6,emp.getSal());
ps.setDouble(7,emp.getComm());
ps.setInt(8,emp.getDeptno());
//4、执行SQL语句
int count = ps.executeUpdate();
//5、处理结果
//6、释放资源
JDBCUtils.closeAll(conn,ps,null);
return count;
}
                                             
                                             
@Override
public int deleteEmp(int empno) {
return 0;
}
                                             
                                             
@Override
public int updateEmp(Emp emp) throws SQLException {
//2、获取数据库连接对象
Connection conn = JDBCUtils.getConnection();
//3、获取数据库操作对象
//String sql="update empset ename=?,job=?....where empno=?"
PreparedStatement ps = conn.prepareStatement("update emp set
ename=?,job=?,mgr=?,hiredate=?,sal=?,comm=?,deptno=? where empno = ?");
//3.1设置占位符的值
ps.setString(1,emp.getEname());
ps.setString(2,emp.getJob());
ps.setInt(3,emp.getMgr());
//将util.date 转换成 sql.date
ps.setDate(4,new Date(emp.getHireadate().getTime()));
ps.setDouble(5,emp.getSal());
ps.setDouble(6,emp.getComm());
ps.setInt(7,emp.getDeptno());
ps.setInt(8,emp.getEmpno());
//4、执行SQL语句
int count = ps.executeUpdate();
//5、处理结果
//6、释放资源
JDBCUtils.closeAll(conn,ps,null);
return count;
}
                                             
                                             
@Override
public List<Emp> selectAll() throws SQLException {
//2、获取数据库连接对象
Connection conn = JDBCUtils.getConnection();
//3、获取数据库操作对象
//String sql="select *from emp";
PreparedStatement ps = conn.prepareStatement("select * from emp");
//4、执行SQL语句
ResultSet rs = ps.executeQuery();
//5、处理结果集
List<Emp> empList = new ArrayList<>();
while(rs.next()){
    int empno = rs.getInt("empno");
    String ename = rs.getString("ename");
    String job = rs.getString("job");
    int mgr = rs.getInt("mgr");
    Date hiredate = rs.getDate("hiredate");
    double sal = rs.getDouble("sal");
    double comm = rs.getDouble("comm");
    int deptno = rs.getInt("deptno");
    //将查询的结果存放到Emp对象中
    Emp emp = new Emp(empno,ename,job,mgr,hiredate,sal,comm,deptno);
    //将Emp对象添加到List中
    empList.add(emp);
}
//6、释放资源
JDBCUtils.closeAll(conn,ps,rs);
return empList;
}
                                             
@Override
public Emp selectOne(int empno) {
    //设置占位符得的值
    //ps.setInt(1,empno)
return null;
}
}
测试类
public class TestEmpDao {
public static void main(String[] args) throws Exception {
//测试查询所有
// EmpDao empDao = new EmpDaoImpl();
// List<Emp> empList = empDao.selectAll();
// System.out.println(empList);
//测试增加
// EmpDao empDao = new EmpDaoImpl();
// Emp emp = new Emp(9000,"韩梅梅","mysql",7369,new Date(),4000d,200d,30);
// System.out.println(empDao.insertEmp(emp));
//测试修改
EmpDao empDao = new EmpDaoImpl();
Emp emp = new Emp(9000,"李雷","java",7369,new Date(),40000d,200d,30);
System.out.println(empDao.updateEmp(emp));
}
}

Service 业务

什么是业务

代表用户完成的一个业务功能,可以由一个或多个DAO的调用组成。(软件所提供的一个功能都叫业务)

先设计业务后DAO

一个业务对应一张表

业务接口——接口的实现类——

在这里插入图片描述

EmpService

public interface AccountService{
    //转账方法
    //转出方姓名,转出方密码,接收方姓名,转账金额
    String transferMoney(String fromName,String password,String toName,double money)   
}

AccountService

//重写转账操作
//判断我方账户时候合法,余额是否充足,对方账户是否合法,我方扣钱对方加钱
public class AccountServiceImpl implements AccountService {
    AccountDao accountDao = new AccountDaoImpl();
    @Override
    public String zhuanZhang(String fromName, String password, String toName,double money) {
    try {
        //1、验证我方用户密码
        Account account = accountDao.selectAccount(fromName);
        if(account == null){
        return "用户名不存在";
        }
        if(!account.getPassword().equals(password)){
        return "用户密码不正确";
        }
        //2、验证余额
        if(account.getMoney() < money){
        return "用户余额不足";
        }
        //3、验证敌方用户
        if(accountDao.selectAccount(toName) == null){
        return "敌方用户名不存在";
        }
        //4、我方扣钱
        accountDao.updateAccount(fromName,-money);
        System.out.println(10/0);
        //5、敌方加钱
        accountDao.updateAccount(toName,money);
        return "转账成功";
        } catch (SQLException throwables) {
        throwables.printStackTrace();
        }
        return "转账失败";
        }
}

Dao接口

public interface AccountDao{
//根据用户获取用户信息,如果返回值为null,表示用户不存在
	Account selectAccount (String name);
    //根据用户修改用户余额
    int updateAccount(String name,doule money);
}

pojo实体类

(数据承载bean)

public class Account{
	private Interger id;
	private String name;
	private String password;
	private String money;
	
	构造;
	setter/getter;
	toString();
}

AccountDao实现类

public class AccountDaoImpl implements AccountDao {
@Override
public Account selectAccount (String name) throws SQLException {
        //2、获取数据库连接对象
        Connection conn = JDBCUtils.getConnection();
        //3、获取数据库操作对象
        PreparedStatement ps = conn.prepareStatement("select *from tb_account where name=?");
        //3.1设置占位符的值
        ps.setString(1,name);
        //4、执行SQL语句
        ResultSet rs = ps.executeQuery();
    	While(rs.next()){
            int id = rs.getid("id");
            String password = rs.getString("password");
            double money = rs.getDouble("money");
            Account account = new Account(id,name,password,money);
            return account;
        }
        //5、处理结果
        //6、释放资源
        JDBCUtils.closeAll(conn,ps,null);
        return null;
        }

public Account updateAccount (String name,double money) throws SQLException {
        //2、获取数据库连接对象
        Connection conn = JDBCUtils.getConnection();
        //3、获取数据库操作对象
        PreparedStatement ps = conn.prepareStatement("update tb_account set money=money+? where name=?");
        //3.1设置占位符的值
        ps.setDouble(1,money);
        ps.setString(2,name);
        //4、执行SQL语句
        int count = ps.executeUpdate();
        //5、释放资源
        JDBCUtils.closeAll(conn,ps,null);
        return count;
        }
}                                                           

测试类

public class TestAcountService{
	public static void main(String[] args){
        AccountService accountService=new AccountServiceImpl();
        System.out.println(accountService.transFerMoney(jb,123,rose,100))
    }
}

事务

jdbc连接池

Druid连接池

在程序初始化时,预先创建指定数量的数据库连接对象存储在池中。当需要连接数据库时,从连接池中取出现有连接;使用完毕后,也不会进行关闭,而是放回池中,实现复用,节省资源。

  • 创建 db.properties 配置文件。
  • 引入druid的jar 文件。

db.properties

driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql:///java2105?useSSL=false
username=root
password=123456
#初始化连接 (初始化连接池的,里面默认就已经存在了20个Connection连接)
initialSize=20
#最大连接数量 (当初始的20个连接不够的时候,最大会创建到50个)
maxActive=50
#最小空闲连接 (当连接池中的连接,没有被使用,就会减少到5个)
minIdle=5
#超时等待时间 (当连接数超过最大连接数,会等待5秒,如果5秒后还没有空闲连接,就会抛出异常)
maxWait=5000

最终版JDBC工具类

public class JDBCUtils {
//定义数据库连接池
private static DataSource dataSource;
//初始化连接池对象
static{
try {
Properties properties = new Properties();
InputStream in =
JDBCUtils.class.getClassLoader().getResourceAsStream("db.properties");
properties.load(in);
//初始化连接池对象
dataSource = DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
}
//返回连接池对象
public static DataSource getDataSource(){
return dataSource;
}
//使用ThreadLocal保证Connection在同一个线程下唯一
static ThreadLocal<Connection> tl = new ThreadLocal<>();
public static Connection getConnection(){
Connection conn = tl.get();
try {
if(conn == null){
conn = dataSource.getConnection();
tl.set(conn);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return conn;
}
public static void closeAll(Connection connection, Statement statement ,
ResultSet rs){
try {
if(rs!=null)
rs.close();
if(statement!=null)
statement.close();
if(connection!=null)
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
public static void begin(){
Connection conn = getConnection();
try {
conn.setAutoCommit(false);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
public static void commit(){
Connection conn = getConnection();
try {
conn.commit();
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
try {
conn.close();
tl.remove();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
public static void rollback(){
Connection conn = getConnection();
try {
conn.rollback();
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
try {
conn.close();
tl.remove();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}

连接池测试

public class TestDruidDataSource {
public static void main(String[] args) throws SQLException {
// Connection conn1 = JDBCUtils.getConnection();
// System.out.println(conn1);
// Connection conn2 = JDBCUtils.getConnection();
// System.out.println(conn2);
for (int i = 0; i < 51; i++) {
Connection connection = JDBCUtils.getDataSource().getConnection();
System.out.println(connection);
connection.close();//并不是关闭连接,而是归还到连接池中
}
}
}

DBUtils工具类

DBUtils简介

DbUtils是Java编程中数据库操作实用小工具,小巧、简单、实用

  • 对于数据表的查询操作,可以把结果转换为List、Array、Set等集合。便于操作。
  • 对于数据表的DML操作,也变得很简单(只需要写SQL语句)。

DbUtils核心API

  • ResultSetHandler接口:转换类型接口
    • BeanHandler类:实现类,把一条记录转换成对象
    • BeanListHandler类:实现类,把多条记录转换成List集合。
    • ScalarHandler类:实现类,适合获取一行一列的数据。
    • MapHandler类: 实现类,把一条记录转换成Map集合
    • MapListHandler类:实现类,把多条记录转换成List集合。
  • QueryRunner:执行sql语句的类
    • 增、删、改:update();
    • 查询:query();

DbUtils的使用步骤

导入jar包

  • mysql连接驱动jar包
  • 导入druid 的jar包
  • database.properties配置文件
  • 导入commons-dbutils的jar包

DBUtils使用

使用DBUtils实现增删改查

public class EmpDaoImpl implements EmpDao {
@Override
public int insertEmp(Emp emp) throws SQLException {
//1、创建QueryRunner对象
//如果是更新(增删改)操作,那么就用无参的构造
QueryRunner qr = new QueryRunner();
//2、通过QueryRunner对象调用update
String sql = "insert into emp values(?,?,?,?,?,?,?,?)";
Object[] args =
{emp.getEmpno(),emp.getEname1(),emp.getJob(),emp.getMgr(),emp.getHireadate(),emp
.getSal(),emp.getComm(),emp.getDeptno()};
return qr.update(JDBCUtils.getConnection(),sql,args);
}
@Override
public int updateEmp(Emp emp) throws SQLException {
//1、创建QueryRunner对象
//如果是更新(增删改)操作,那么就用无参的构造
QueryRunner qr = new QueryRunner();
//2、通过QueryRunner对象调用update
String sql = "update emp set
ename=?,job=?,mgr=?,hiredate=?,sal=?,comm=?,deptno=? where empno = ?";
Object[] args =
{emp.getEname1(),emp.getJob(),emp.getMgr(),emp.getHireadate(),emp.getSal(),emp.g
etComm(),emp.getDeptno(),emp.getEmpno()};
return qr.update(JDBCUtils.getConnection(),sql,args);
}
@Override
public int deleteEmp(int empno) throws SQLException {
//1、创建QueryRunner对象
//如果是更新(增删改)操作,那么就用无参的构造
QueryRunner qr = new QueryRunner();
//2、通过QueryRunner对象调用update
String sql = "delete from emp where empno = ?";
Object[] args = {empno};
return qr.update(JDBCUtils.getConnection(),sql,args);
}
@Override
public List<Emp> selectAll() throws Exception {
//1、创建QueryRunner对象
//如果是查询操作,那么就用有参的构造,传递连接池对象(使用完成之后QueryRunner会自动关(回收)QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
//2、通过QueryRunner对象调用query
String sql = "select empno,ename ename1,job,mgr,hiredate
hireadate,sal,comm,deptno from emp";
//如果是集合就创建BeanListHandler对象,如果是实体类就创建BeanHandler对象
List<Emp> empList = qr.query(sql, new BeanListHandler<Emp>(Emp.class));
return empList;
}
@Override
public Emp selectOne(int empno) throws SQLException {
//1、创建QueryRunner对象
//如果是查询操作,那么就用有参的构造,传递连接池对象(使用完成之后QueryRunner会自动关(回收)QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
//2、通过QueryRunner对象调用query
String sql = "select * from emp where empno = ?";
Object[] args = {empno};
Emp emp = qr.query(sql, new BeanHandler<Emp>(Emp.class),args);
return emp;
}
@Override
public long count() throws SQLException {
//1、创建QueryRunner对象
//如果是查询操作,那么就用有参的构造,传递连接池对象(使用完成之后QueryRunner会自动关(回收)QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
String sql = "select count(*) from emp";
Long count = qr.query(sql, new ScalarHandler<Long>());
return count;
}
}

字段与属性名不一致

如果数据库的字段名与实体类中的属性名不一致,则无法完成映射,值会显示null

解决:在查询语句中取别名

@Override
public List<Emp> selectAll() throws Exception {
//1、创建QueryRunner对象
//如果是查询操作,那么就用有参的构造,传递连接池对象(使用完成之后QueryRunner会自动关闭(回)QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
//2、通过QueryRunner对象调用query
//通过别名进行数据映射
String sql = "select empno,ename ename1,job,mgr,hiredate
hireadate,sal,comm,deptno from emp";
//如果是集合就创建BeanListHandler对象,如果是实体类就创建BeanHandler对象
List<Emp> empList = qr.query(sql, new BeanListHandler<Emp>(Emp.class));
return empList;
}
public class Emp {
private Integer empno;
private String ename1; //这个与数据库字段不一致
private String job;
private Integer mgr;
private Date hireadate; //这个与数据库字段不一致
private Double sal;
private Double comm;
private Integer deptno;
//省略set、get、构造方法
}
  • 24
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是二次元穿越来的

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值