【JDBC、Mybatis初级知识点】
2020.9.28 coin
/*JDBC基本流程:
1.加载驱动 (选择连接哪一个数据库)
2.获取连接 (连接数据库)
3.准备sql
4.封装处理块
5.发送并执行sql,获取结果集
6.处理数据
7.关闭资源
*/
public class JDBCDemo01 {
public static void main(String[] args) throws Exception {
//1.加载驱动 (选择连接哪一个数据库)
Class.forName("oracle.jdbc.driver.OracleDriver");
//2.获取连接 (连接数据库)
Connection conn = DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:XE",
"SCOTT",
"TIGER"
);
//3.准备sql
String sql = "select * from dept";
//4.封装处理块 Statement 静态处理块
Statement state =conn.createStatement();
//5.发送并执行sql,获取结果集 executeQuery->返回值结果集 查询 executeUpdate 更新->返回值影响行数
ResultSet result = state.executeQuery(sql);
//6.处理数据
while (result.next()){
//getObject
int deptno = result.getInt(1);
String dname = result.getString(2);
String loc = result.getString(3);
System.out.println(deptno+"-->"+dname+"-->"+loc);
}
//7.关闭资源
result.close();
state.close();
conn.close();
}
}
/*
jdbc 的优化
1)异常的抛出
2)配置文件的定义 数据库的基础连接信息
注意: 执行增删改操作 的时候,事务默认 自动提交 autoCommit
*/
public class JDBCDemo02 {
public static void main(String[] args) {
Properties pro = new Properties();
try {
pro.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties"));
} catch (IOException e) {
e.printStackTrace();
}
//1.加载驱动
try {
Class.forName(pro.getProperty("driver"));
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Connection conn = null;
Statement state = null;
try {
//2.获取连接
conn = DriverManager.getConnection(
pro.getProperty("url"),
pro.getProperty("username"),
pro.getProperty("password")
);
//3.准备sql
String sql = "delete from dept where deptno = 70";
//4.封装处理块
state = conn.createStatement();
//5.发送并执行sql --> 查询->结果集 更新->影响行数
int rows = state.executeUpdate(sql);
//6.处理数据
if(rows<=0){
System.out.println("不成功");
}else{
System.out.println("成功");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
//7.关闭
if(state!=null){
try {
state.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
/*
用户模块
注册 ->插入
登录 ->查询
修改 -> 更新
注销 -> 删除
静态处理块: sql语句通过字符串 的连接符自己拼接
可能会出现sql注入
预处块: -->推荐使用
1.预先编译 ,效率高
2.预防sql注入的情况
*/
public class UserDemo {
public static void main(String[] args) {
if(reg("xiaopei1hao","654321")){
System.out.println("注册成功");
}else{
System.out.println("注册失败");
}
//login("laopei","12356 or 1=1");
}
//登录
//1.根据这个用户名字 和密码一起查询,如果有结果,登录成功,否则登录失败
//2.根据用户名查询,查询到结果与参数密码去比对是否相同
public static void login(String uname,String pwd){
Connection conn = null;
//Statement state = null;
PreparedStatement state = null; //预处理块
ResultSet result = null;
try {
//连接
conn = JDBCUtils.getConnection();
/*
静态处理块
//sql
String sql = "select * from t_user where username = '"+uname+"' and password ="+pwd;
//处理块
state = conn.createStatement();
//执行
result = state.executeQuery(sql);*/
//预处理块
String sql = "select * from t_user where username = ? and password = ?";
state = conn.prepareStatement(sql);
//为?赋值
state.setString(1,uname);
state.setObject(2,pwd);
result = state.executeQuery();
//处理结果
if(result.next()){
System.out.println("登录成功");
}else{
System.out.println("登录失败");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.release(result,state,conn);
}
}
//注册
public static boolean reg(String uname,String pwd){
Connection conn = null;
Statement state = null;
boolean flag = true;
try {
//连接
conn = JDBCUtils.getConnection();
//sql
String sql = "insert into t_user values('"+uname+"',"+pwd+")";
//处理块
state = conn.createStatement();
//执行
int rows = state.executeUpdate(sql);
//处理结果
if(rows<=0){
flag = false;
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.release(state,conn);
}
return flag;
}
}
/*
BaseDao -->了解
通过数据库访问对象 对数据操作行为的封装
1.更新 excuteUpdate -> 影响函数 结果成功与否boolean
2.查询 excuteQuery -> 结果集 结果存储着多个某种类型对象的集合
结果集中存放条数据 -> java中的多个对应类型的对象
注意:
数据库中的number类型的数据,在Java中默认转为BigDecimal类型的数据 1)javabean类 的属性类型改为BigDecimal 2)判断转换一下把BigDecimal转为int|double
字段名默认大写,可以添加别名控制
*/
public class BaseDao<T> {
//查询 返回值 : List<T> 参数: String sql ,Class cls,Object ...args
public List<T> testQuery(String sql ,Class<T> cls,Object ...args){
//创建一个集合
List<T> list = new ArrayList<>();
Connection conn = null;
PreparedStatement state = null;
ResultSet result = null;
ResultSetMetaData data = null;
try {
//获取 连接
conn = JDBCUtils.getConnection();
//封装预处理块
state = conn.prepareStatement(sql);
//为?赋值
if(args.length !=0 && args!=null){
for(int i=0;i<args.length;i++){
state.setObject(i+1,args[i]);
}
}
//执行sql ,得到结果集
result = state.executeQuery();
//通过结果集获取结果集的原信息对象
data = result.getMetaData();
//通过原信息对象就能够获取 字段的个数 --> 循环为属性赋值循环几次
int count = data.getColumnCount();
//处理数据
//1)遍历判断是否有数据,操作每一条 数据
while(result.next()){
//2)如果有一个调数据,就代表需要构建一个对应 类型 的对象
T obj = cls.newInstance();
//3)为对象 的所有属性赋值
//循环为对象的所有属性赋值
//循环操作为对象的每一个属性赋值
for(int i=1;i<=count;i++){
//a.获取字段的值|属性的值
Object value = result.getObject(i);
String columnName = data.getColumnName(i);
//如果数据为BigDecimal证明在数据库中是Number类型 -> 转为Integer类型
if(value instanceof BigDecimal){
value = ((BigDecimal) value).intValue();
}
//b.获取属性
Field field = cls.getDeclaredField(columnName);
//忽略权限问题
field.setAccessible(true);
//c.为这个属性赋值
field.set(obj,value);
}
//把对象加入集合
list.add(obj);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//关闭资源
JDBCUtils.release(result,state,conn);
}
//返回这个集合
return list;
}
//更新操作 返回值 : boolean 参数: String sql,Object ...args(为?赋值的)
public boolean testUpdate( String sql,Object ...args){
boolean flag = false; //表示结果
Connection conn = null;
PreparedStatement state = null;
try {
//获取连接
conn = JDBCUtils.getConnection();
//封装sql 预处理快
state = conn.prepareStatement(sql);
//为?赋值 args->值 sql->state
//遍历args,拿到每一个参数赋值
if(args.length !=0 && args!=null){
for(int i=0;i<args.length;i++){
state.setObject(i+1,args[i]);
}
}
//执行sql
int rows = state.executeUpdate();
if(rows>0){
flag = true;
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.release(state,conn);
}
return flag;
}
}