使用java程序将数据持久化保存到DBMS.
问题: Mysql oracle sqlserver..... 在数据库DBMS(数据库管理系统软件) 操作数据。 用户注册提交的数据-----> 代码----> 持久化保存到数据库中。
java database connectivity java连接数据库技术。 客户端操作服务器。
cmd navicat java 客户端操作服务器
java程序面向对象 获得连接对象。
cmd: mysql -h127.0.0.1 -uroot -proot navicat: 新建新的连接------> connection----> my.ini 151 127.0.0.1 localhost 动态ip 3306 root root
public static void main(String[] args) { //目的: 获得特定的DBMS的连接对象----> mysql //客户端连接服务器 //用户名 String username = "root"; //密码 String password = "root"; //服务器程序在哪一台主机上---->服务器的地址 //String url = "jdbc:mysql://ip地址:端口号/数据库名称?参数名=参数数据"; String url = "jdbc:mysql://192.168.13.217:3306/bb"; //连接哪一个DBMS 就需要提供这个DBMS的驱动----> 不同的厂商已经实现ok //引入第三方的驱动 mysql的驱动----> mysql-driver.jar //1.1 下载驱动: 1. 官网 2. maven仓库管理所有的jar https://mvnrepository.com/artifact/mysql/mysql-connector-java/8.0.27 //mysql的服务: mysql5.7 下载驱动 5+ 可以向下兼容 //1.2 将下载ok的jar 引入项目中 lib add as library //String driver = "com.mysql.jdbc.Driver"; String driver = "com.mysql.cj.jdbc.Driver"; //学习JDBC 调用jdbc提供api //java.sql.* javax.sql.* //DriverManager.getConnection() //对于mysql的驱动而言 自己提供了服务发现机制 自己注册驱动服务 //只能在当前的java项目里面 可以这么使用 //web项目依然存在问题? web项目后期运行在服务器 部署的是war包 默认自带一个META-INF Connection connection = null; try { //手动注册驱动/服务-----> 在jvm中创建驱动的实例(对象) Class.forName(driver);//jvm加载Driver.class connection = DriverManager.getConnection(url, username, password);//多态了 父接口指向任意一个实现类 System.out.println("连接对象:" + connection); connection.close(); } catch (SQLException | ClassNotFoundException throwables) { throwables.printStackTrace(); } finally { try { if (connection != null) { connection.close(); } } catch (SQLException throwables) { throwables.printStackTrace(); } } }
获得连接对象的功能 在工具类里面进行维护。
jdbc.username=root jdbc.password=root jdbc.url=jdbc:mysql://127.0.0.1:3306/bb jdbc.driver=com.mysql.cj.jdbc.Driver
public class DBUtil { private DBUtil() { } //1.加载核心资源配置文件 Map---->Properties //2.在程序不停 只需要加载一次 private static final Properties properties; static { properties = new Properties(); try { properties.load(new FileInputStream("src/jdbc.properties")); } catch (IOException e) { e.printStackTrace(); } } //获得连接 public static Connection getMysqlConn() { Connection connection = null; try { //1.注册驱动 Class.forName(properties.getProperty("jdbc.driver")); //2.获得连接对象 connection = DriverManager.getConnection( properties.getProperty("jdbc.url"), properties.getProperty("jdbc.username"), properties.getProperty("jdbc.password")); } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); } return connection; } //释放资源 public static void releaseResource(Connection connection) { try { if (connection != null) connection.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } }
DriverManager: 用于管理一组JDBC驱动程序的基本服务。 1. 注册驱动 2. 获得连接 Connection getConnection(String url, String user, String password)
Connection: 代表的任意DBMS连接对象。 需要关闭。 public interface Connection extends Wrapper, AutoCloseable 与特定数据库的连接(会话)。 java语言是面向对象的 将数据库连接都封装Connection java也会将每一条sql语句封装成语句对象 Statement 对象 Statement----> PreparedStatement(预编译语句对象) Statement createStatement() 创建一个 Statement对象,用于将SQL语句发送到数据库。 PreparedStatement prepareStatement(String sql) "推荐使用" 创建一个 PreparedStatement对象,用于将参数化的SQL语句发送到数据库。 PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) 创建一个默认的 PreparedStatement对象,该对象具有检索自动生成的密钥的能力。
PreparedStatement: (预编译语句对象) 代表的一条sql语句 int executeUpdate() 执行在该SQL语句PreparedStatement对象,它必须是一个SQL数据操纵语言(DML)语句,如INSERT , UPDATE或DELETE ; 或不返回任何内容的SQL语句,例如DDL语句。 返回值: 受影响的行记录数 >=1 =0 ResultSet executeQuery() 执行此 PreparedStatement对象中的SQL查询,并返回查询 PreparedStatement的 ResultSet对象。
结果集。 只要是查询语句 select查询出来的结果 封装查询出来的结果。
查询的每一行的记录都在结果集对象中。
以tb_userinfo
create read update delete
insert into tb_userinfo (name, gender, phone, age, balance, password, birthday) VALUES('李玲玉','女','11111',30,778767,'2828','2002-01-01')
dao: data access object 都是操作数据库数据。
新建新的包 com.javasm.dao 创建很多接口 xxxxDao.java 封装很多行为
新建新的包 com.javasm.dao .impl 创建dao接口的实现类
public interface UserInfoDao { /** * 1. 新增用户 * @return 受影响的行记录数 */ int addUserInfo(); }
public class UserInfoDaoImpl implements UserInfoDao { //实现新增用户功能 @Override public int addUserInfo() { //1.获得数据库连接(打开数据库) Connection connection = DBUtil.getMysqlConn(); //2.准备sql String sql = "insert into tb_userinfo (name, gender, phone, age, balance, password, birthday) VALUES('张三丰','女','11111',30,778767,'2828','2002-01-01')"; //3.执行sql 将数据持计划到mysql的数据库 //sql语句都在数据库服务中运行的 java语言没有能力直接执行sql //解决: 使用java程序将sql语句发送到dbms的服务中 Connection DDL DML DQL DCL PreparedStatement statement = null; int result = 0; try { //3.1 将sql语句发送到数据库 statement = connection.prepareStatement(sql);//sql语句被封装到statement //3.2 执行sql语句 result = statement.executeUpdate(); } catch (SQLException throwables) { throwables.printStackTrace(); } finally { DBUtil.releaseResource(connection, statement); } return result; } }
public static void main(String[] args) { //调用UserInfoDaoImpl.addUserInfo() UserInfoDao userInfoDao = new UserInfoDaoImpl(); int result = userInfoDao.addUserInfo(); System.out.println(result);//1 if(result>=1){ System.out.println("新增成功"); }else{ System.out.println("新增用户失败"); } }
//数据: 使用多个形参可以解决的 但是数量太多 不易维护 //映射: 操作数据库表===>操作类 一张表一个类 //表里面有很多字段====>类里面的属性 //表里字段数据类型====>类里面属性的数据类型 //表里面的一行记录====>类的一个对象 @Override public int addUserInfo1(UserInfo userInfo) { //1.获得连接 Connection connection = DBUtil.getMysqlConn(); int result = 0; PreparedStatement ps = null; //2.sql 使用JDBC提供的占位符进行占位 ? 一个?就是代表要赋值一个数据 //sql语句中有? 称他是一个“参数化的sql语句” String sql = "insert into tb_userinfo (name, gender, phone, age, balance,password, birthday) VALUES (?,?,?,?,?,?,?)"; try { //3.将sql语句发送到数据库 ps = connection.prepareStatement(sql);//参数化的sql语句在ps对象 //判断sql语句里面是否有? //有 对占位符赋值 1 ps.setString(1, userInfo.getName()); ps.setString(2, userInfo.getGender()); ps.setString(3, userInfo.getPhone()); ps.setInt(4, userInfo.getAge()); ps.setBigDecimal(5, userInfo.getBalance()); ps.setString(6, userInfo.getPassword()); //需要将util.Date转sql.Date 在jdbc里面 禁止使用sql包下的任意一个日期相关的类 //ps.setDate(7, new Date(userInfo.getBirthday().getTime())); ps.setObject(7, userInfo.getBirthday()); //4.执行sql result = ps.executeUpdate(); } catch (SQLException throwables) { throwables.printStackTrace(); } finally { DBUtil.releaseResource(connection, ps); } return result; }
public static void addTest() { Scanner input = new Scanner(System.in); UserInfo userInfo = new UserInfo(); System.out.println("请录入用户名:"); userInfo.setName(input.nextLine()); System.out.println("请录入性别:"); userInfo.setGender(input.nextLine()); System.out.println("请录入密码:"); userInfo.setPassword(input.nextLine()); System.out.println("请录入age:"); userInfo.setAge(Integer.parseInt(input.nextLine())); System.out.println("请录入balance:"); userInfo.setBalance(new BigDecimal(input.nextLine())); userInfo.setBirthday(new Date()); UserInfoDao userInfoDao = new UserInfoDaoImpl(); System.out.println(userInfoDao.addUserInfo1(userInfo)); }
delete from tb_userinfo where id=?
@Override public int deleteUserInfoById(int uid) { connection = DBUtil.getMysqlConn(); sql = "DELETE FROM tb_userinfo WHERE id=?"; try { ps = connection.prepareStatement(sql); ps.setObject(1, uid); result = ps.executeUpdate(); } catch (SQLException throwables) { throwables.printStackTrace(); } finally { DBUtil.releaseResource(connection, ps); } return result; }
/** * 3. 批量删除 * @param idList ids * @return 受影响的行记录数 */ int deleteUserInfoByIds(ListidList);
@Override public int deleteUserInfoByIds(ListidList) { connection = DBUtil.getMysqlConn(); //不知道要是有几个? 动态拼接sql StringBuilder builder = new StringBuilder("DELETE FROM tb_userinfo WHERE id IN ("); //动态拼接? int size = idList.size(); for (int i = 1; i <= size; i++) { builder.append("?"); if (i == size) { builder.append(")"); break; } builder.append(","); } try { ps = connection.prepareStatement(builder.toString()); for (int i = 1; i <= size; i++) { ps.setObject(i, idList.get(i - 1)); } result = ps.executeUpdate(); } catch (SQLException throwables) { throwables.printStackTrace(); } finally { DBUtil.releaseResource(connection, ps); } return result; }
由于我们不清楚用户到底修改几个列 指定所有的列全部都要修改
sql: UPDATE tb_userinfo SET name=?, gender=?, phone=?, age=?, balance=?, password=?, birthday=? WHERE id =?
private static void updateTest() { UserInfoDao userInfoDao = new UserInfoDaoImpl(); Scanner input = new Scanner(System.in); System.out.println("请录入要修改的用户id:"); int id = input.nextInt(); UserInfo userInfo = userInfoDao.findUserInfoById(id); System.out.println("要修改的用户信息如下:" + userInfo); System.out.println("请录入要修改的列(1,2): 1.name 2.phone 3.age 4. password "); String choiceStr = input.next(); String[] array = choiceStr.split(","); for (String s : array) { int choice = Integer.parseInt(s); switch (choice) { case 1: System.out.println("请录入新的name:"); String newName = input.next(); userInfo.setName(newName); break; case 2: System.out.println("请录入新的phone:"); String newPhone = input.next(); userInfo.setPhone(newPhone); break; case 3: System.out.println("请录入新的age:"); int newAge = input.nextInt(); userInfo.setAge(newAge); break; case 4: System.out.println("请录入新的password:"); String newPass = input.next(); userInfo.setPassword(newPass); break; } } System.out.println(userInfoDao.updateUserInfoById(userInfo)); }
@Override public int updateUserInfoById(UserInfo userInfo) { connection = DBUtil.getMysqlConn(); sql = " UPDATE tb_userinfo SET name=?, gender=?, phone=?, age=?, balance=?, password=?, birthday=? WHERE id =?"; try { ps = connection.prepareStatement(sql); ps.setString(1, userInfo.getName()); ps.setString(2, userInfo.getGender()); ps.setString(3, userInfo.getPhone()); ps.setInt(4, userInfo.getAge()); ps.setBigDecimal(5, userInfo.getBalance()); ps.setString(6, userInfo.getPassword()); ps.setObject(7, userInfo.getBirthday()); ps.setObject(8, userInfo.getId()); result = ps.executeUpdate(); } catch (SQLException throwables) { throwables.printStackTrace(); } finally { DBUtil.releaseResource(connection, ps); } return result; }
SELECT id,name, gender, phone, age, balance, password, birthday, create_time, update_time, last_login_time from tb_userinfo where id = ?
@Override public UserInfo findUserInfoById(int uid) { connection = DBUtil.getMysqlConn(); sql = "SELECT id,name, gender, phone, age, balance, password, birthday, create_time, update_time, last_login_time FROM tb_userinfo WHERE id = ?"; UserInfo userInfo = null; try { ps = connection.prepareStatement(sql); ps.setInt(1, uid); //执行sql----> dql rs = ps.executeQuery();//查询的结果(数据)在rs对象中 //判断: rs里面是否有记录? 有 获得数据转换成一个对象 //类似于学过的Iterator 遍历集合数据 //String getString(int columnIndex) 获得指定列的数据 2 查询结果有且只有1列的时候 // String getString(String columnLabel) 根据列名获得列对应的数据 if (rs.next()) {//判断光标之后是否有更多的行记录需要迭代 userInfo = new UserInfo(); userInfo.setId(uid); userInfo.setName(rs.getString("name")); userInfo.setPassword(rs.getString("password")); userInfo.setGender(rs.getString("gender")); userInfo.setBalance(rs.getBigDecimal("balance")); userInfo.setBirthday(rs.getDate("birthday")); userInfo.setAge(rs.getInt("age")); userInfo.setPhone(rs.getString("phone")); } } catch (SQLException throwables) { throwables.printStackTrace(); } finally { DBUtil.releaseResource(connection, ps, rs); } return userInfo; }
SELECT * FROM TB_USERINFO;
@Override public ListfindAllUserInfo() { connection = DBUtil.getMysqlConn(); sql = "SELECT * FROM tb_userinfo"; List userInfoList = new ArrayList<>(10); try { ps = connection.prepareStatement(sql); rs = ps.executeQuery(); while (rs.next()) { userInfoList.add(userInfoInstance(rs)); } } catch (SQLException throwables) { throwables.printStackTrace(); } finally { DBUtil.releaseResource(connection, ps, rs); } return userInfoList; }
private UserInfo userInfoInstance(ResultSet rs) throws SQLException { UserInfo userInfo = new UserInfo(); userInfo.setId(rs.getInt("id")); userInfo.setName(rs.getString("name")); userInfo.setPassword(rs.getString("password")); userInfo.setGender(rs.getString("gender")); userInfo.setBalance(rs.getBigDecimal("balance")); userInfo.setBirthday(rs.getDate("birthday")); userInfo.setAge(rs.getInt("age")); userInfo.setPhone(rs.getString("phone")); return userInfo; }