1.sqlyog软件的使用.
使用这个工具可以直接创建数据库 表 直接添加数据
2.jdbc
jdbc是什么
jdbc:java数据库连接.
jdbc有什么用 jdbc可以适配市面上大多数数据库.我们使用java语言开发只要写一套程序就ok.
jdbc怎么用
[1]加载对应数据库的驱动
[2]连接要操作的数据库
[3]准备你要执行的sql语句 select * from info;
[4]执行sql语句 返回一个结果
[5]把结果数据取出来.
@Test
public void jdbcTest1() throws Exception{
//1.加载对应的驱动程序
DriverManager.registerDriver(new Driver());
//2.获取数据库的连接 参数1:通过url地址来连接数据库 参数2:用户名 参数3:密码
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/hm104", "root", "123");
//3.准备一个要执行的sql语句
String sql = "select * from orders";
//4.执行sql语句前 要先获取statement对象 用来执行sql语句
Statement statement = conn.createStatement();
//5.执行一个查询sql语句 返回一个结果集
ResultSet resultSet = statement.executeQuery(sql);
//6.想取出数据需要先移动光标 因为光标默认是第一行之前
// resultSet.first();
while(resultSet.next()){
//7.获取对应列的数据
int id = resultSet.getInt(1);
String name = resultSet.getString(2);
int price = resultSet.getInt(3);
System.out.println("id:"+id+"---"+name+"--->"+price);
}
//8.关闭conn statement result对象 释放资源 先打开的后释放
resultSet.close();
statement.close();
conn.close();
}
3.jdbc加强
1.driverManager:注册驱动 获取一个数据库连接
2.Connection :获取一个statement对象,获取一个preparedStatement(预编译对象 可以防止sql注入)
3.statement对象 :执行一个查询的sql语句使用
executeQuery
(
String
sql) 如果执行的是insert update delete 应该使用executeUpdate();
4.ResultSet:代表结果集 只有进行查询的sdl语句的时候才会返回该对象,结果集内部默认有一个光标 光标默认在数据第一行之前.我们需要获取数据需要移动光标 移动光标的方法next() first() last();
4.sql注入
1.通过一个登录案例模拟 创建一个用户表用来模拟用户登录信息
create table login(id int,name varchar(20),pwd varchar(20));
insert into login values(1,'abc','123');
insert into login values(2,'abcd','1234');
2.模拟登录
select * from login where name='abc' and pwd='123'
select * from login where name='abc'or'1==1' and pwd='123dhdhdhdhdhd'
select * from login where name= 'abc\'or\'1==1' and pwd= '123dhdhdhdhdhd'
3.代码实现:
private static void loginIn(String name, String pwd) throws Exception{
//1.加载对应的驱动程序
DriverManager.registerDriver(new Driver());
//2.获取数据库的连接 参数1:通过url地址来连接数据库 参数2:用户名 参数3:密码
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/hm104", "root", "123");
//3.准备一个要执行的sql语句 ?代表占位符 607
String sql = "select * from login where name= ? and pwd= ?";
//4.执行sql语句前 要先获取statement对象 为了防止sql注入 我们获取一个preparedstatement 对象
PreparedStatement prepareStatement = conn.prepareStatement(sql);
//4.1 设置?占位符的内容
prepareStatement.setString(1, name);
prepareStatement.setString(2, pwd);
//5.执行一个查询sql语句 返回一个结果集
ResultSet resultSet = prepareStatement.executeQuery();
//6.想取出数据需要先移动光标 因为光标默认是第一行之前
if (resultSet.next()) {
System.out.println("登录成功");
}else {
System.out.println("登录失败");
}
//8.关闭conn statement result对象 释放资源 先打开的后释放
resultSet.close();
prepareStatement.close();
conn.close();
}
}
5.sqlite数据库
sqlite是轻量级 嵌入式的数据库. 不需要安装sqlite软件.因为已经嵌入到android系统里
先创建数据库 在操作数据库里面的表 在操作表里面的记录 sqliteOpenHelper
5.1使用传统sql语句实现增删改查逻辑
//点击按钮实现向数据库增加一条记录 其实就是执行一个插入的sql语句
public void click1(View view) {
//1.想把数据库文件创建出来 第一次是创建数据库 第二次调用就是打开数据库
SQLiteDatabase db = myOpenHelper.getWritableDatabase();
//2.执行一个插入的sql语句
db.execSQL("insert into info(name,phone) values('abc','13777777')");
//3.当db对象用完后 需要关闭
db.close();
}
//点击按钮实现向数据库删除一条记录 其实就是执行一个插入的sql语句
public void click2(View view) {
//1. 第一次是创建数据库 第二次调用就是打开数据库
SQLiteDatabase db = myOpenHelper.getWritableDatabase();
//2.执行一个插入的sql语句
db.execSQL("delete from info where name='abc'");
//3.当db对象用完后 需要关闭
db.close();
}
//点击按钮实现向数据库修改一条记录 其实就是执行一个插入的sql语句
public void click3(View view) {
//1. 第一次是创建数据库 第二次调用就是打开数据库
SQLiteDatabase db = myOpenHelper.getWritableDatabase();
//2.执行一个插入的sql语句
db.execSQL("update info set phone='139999999'where name='abc'");
//3.当db对象用完后 需要关闭
db.close();
}
//点击按钮实现向数据库 查询记录 其实就是执行一个插入的sql语句
public void click4(View view) {
//1. 第一次是创建数据库 第二次调用就是打开数据库
SQLiteDatabase db = myOpenHelper.getReadableDatabase();
//2.执行一个插入的sql语句 当执行查询sql语句的时候不能使用execSQL方法 因为这个方法返回值是void
Cursor cursor = db.rawQuery("select * from info", null);
//3.移动光标把数据取出来
if (cursor!=null){
while (cursor.moveToNext()){
//4.取出对应列的值 列的索引 从0开始
// int id = cursor.getInt(0);
String id = cursor.getString(0);
String name = cursor.getString(1);
String phone = cursor.getString(2);
System.out.println("id:"+id+"---"+name+"---"+phone);
}
}
//3.当db对象用完后 需要关闭
db.close();
}
5.2.使用谷歌封装好的api实现增删改查逻辑
传统实现方式 调用方法没有返回值,程序员不容易进行判断 ,传统的sql语句很容易写错.
//点击按钮实现向数据库增加一条记录 其实就是执行一个插入的sql语句
public void click1(View view) {
//1.想把数据库文件创建出来 第一次是创建数据库 第二次调用就是打开数据库
SQLiteDatabase db = myOpenHelper.getWritableDatabase();
//2.调用insert方法执行插入逻辑
// db.execSQL("insert into info(name,phone) values('abc','13777')");
/**
* 参数1:表名
* 参数2:占位作用 如果字段什么数据也不插入就使用NULL占位 如果插入数据了就使用插入的数据
* 参数3:编程小技巧 填写参数的时候 先不用管参数具体是什么含义 先把方法写完整.
*/
//2.1创建ContentValues实例 这个实例其实就是map 往数据库中添加记录
ContentValues values = new ContentValues(); //实际上底层就是一个map map由键值构成
values.put("name","lisi"); //key:应该是列名
values.put("phone","110");
//2.2 调用insert方法插入数据 返回值:代表新插入行的id 2条记录 1 2 3
long info = db.insert("info", null, values);
if (info!=-1){
Toast.makeText(this, "插入成功", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this, "插入失败", Toast.LENGTH_SHORT).show();
}
//3.当db对象用完后 需要关闭
db.close();
}
//点击按钮实现向数据库删除一条记录 其实就是执行一个插入的sql语句
public void click2(View view) {
//1. 第一次是创建数据库 第二次调用就是打开数据库
SQLiteDatabase db = myOpenHelper.getWritableDatabase();
//2.执行一个插入的sql语句
// db.execSQL("delete from info where name='abc'");
/**
* 参数2:删除条件
* 参数3:?号占位
* 返回值: 代表删除的行数
* 原理:底层在帮助我们封装sql语句
*/
int info = db.delete("info", "name=?", new String[]{"lisi"});
Toast.makeText(this, "删除了"+info+"行", Toast.LENGTH_SHORT).show();
//3.当db对象用完后 需要关闭
db.close();
}
//点击按钮实现向数据库修改一条记录 其实就是执行一个插入的sql语句
public void click3(View view) {
//1. 第一次是创建数据库 第二次调用就是打开数据库
SQLiteDatabase db = myOpenHelper.getWritableDatabase();
//2.执行一个插入的sql语句
// db.execSQL("update info set phone='139999999'where name='abc'");
ContentValues values = new ContentValues();
values.put("phone","120");
int info = db.update("info", values, "name=?", new String[]{"lisi"});
Toast.makeText(this, "更新了"+info+"行", Toast.LENGTH_SHORT).show();
//3.当db对象用完后 需要关闭
db.close();
}
//点击按钮实现向数据库 查询记录 其实就是执行一个插入的sql语句
public void click4(View view) {
//1. 第一次是创建数据库 第二次调用就是打开数据库
SQLiteDatabase db = myOpenHelper.getReadableDatabase();
//2.执行一个插入的sql语句 当执行查询sql语句的时候不能使用execSQL方法 因为这个方法返回值是void
// Cursor cursor = db.rawQuery("select * from info", null); id name phone
/**
* 参数1:表名
* 参数2 :代表要查询的列 new String[]{"id","name","phone"} null什么也不写就不知道要查什么 默认查所有
* 参数3:查询条件 没有查询条件 ?
* 参数4: 对条件占位
* 参数5:group by 分组 不分组
* 参数6:having null
*/
Cursor cursor = db.query("info", null, null, null, null, null, null, null);
//3.移动光标把数据取出来
if (cursor!=null){
while (cursor.moveToNext()){
//4.取出对应列的值 列的索引 从0开始
// int id = cursor.getInt(0);
String id = cursor.getString(0);
String name = cursor.getString(1);
String phone = cursor.getString(2);
System.out.println("id:"+id+"---"+name+"---"+phone);
}
}
//3.当db对象用完后 需要关闭
db.close();
}
6.事务
什么是事务:事务就是执行一段逻辑 要么同时成功 要么同时失败. 银行转账. 张三给李四转账 张三账户-100 李四账号+100
sqlite3 指令打开数据库 sqlite3 Account.db 如何改变dos编码 chcp 936(gbk) 65001(utf-8)
public void click(View view) {
//1.先开启事务 //当硬盘满的时候 只能调用读
SQLiteDatabase db = myOpenHelper.getReadableDatabase();
//2.开启事务
db.beginTransaction();
try {
//代表你要实现的逻辑 张三-100 李四+ 100
db.execSQL("update info set money= money-200 where name=?",new String[] { "张三" });
int i = 10/0;
db.execSQL("update info set money= money+200 where name=?",new String[] { "李四" });
//设置一个标记 当这行代码成功的时候 说明事务执行成功 当事务没进行成功 事务会进行一个回滚操作
db.setTransactionSuccessful();
}catch (Exception e){
Toast.makeText(this, "服务器忙!!!!请稍后在转", Toast.LENGTH_SHORT).show();
}finally {
//结束事务
db.endTransaction();
}
}