前日回顾:
1 . iframeset 和 iframe 的使用
2 . mysql 语句练习:updatedeleteinsertselect;模糊查询;like;_;\ 转义字符串;escape; distinct,合并重复项;<>、!=、 不等于;not 、and 、or 、逻辑字符;
order by 的升序 (asc) 降序(desc)。
今日内容:
SELECT userId ,LOWER(username) FROM user/* 将查询出来的字段改为小写 */
SELECT userId ,UPPER(username) FROM user /* 将查询出来的字段改为大写 */
SELECT userId ,LENGTH(username) FROM user /* 求字段长度 */
SELECT userId ,SUBSTR(username,1,2) FROM user /* 截取字段长度;1 代表开始位置;2 代表截取长度 */
SELECT AVG(SAL)FROM emp /* AVG([DISTINCT] expr) 平均函数 */
SELECT empno,ename,AVG(sal) FROM emp /* 错误案例(我们班的名字叫王朝) */
SELECT MAX(sal)FROM emp /* 计算出查询结果中该字段的最大值 */
SELECT MIN(sal)FROM emp /* 计算出查询结果中该字段的最小值 */
SELECT SUM(sal)FROM emp /* 计算出查询结果中该字段的和 */
SELECT COUNT(sal)FROM emp /* 计算出查询结果中该字段的个数 */
SELECT *FROM emp
SELECT deptno,AVG( sal) FROM emp GROUP BY deptno /* 该组工资的平均值 */
SELECT deptno,max( sal) FROM emp GROUP BY deptno /* 该组工资的最大值 */
SELECT deptno,min( sal) FROM emp GROUP BY deptno /* 该组工资的最小值 */
SELECT deptno,sum( sal) 共计 FROM emp GROUP BY deptno /* 该组工资的和 */
SELECT deptno,COUNT(SAL) FROM emp GROUP BY deptno /* 统计该组人数 */
SELECT deptno,AVG( sal) 平均工资,max( sal) 最大值,min( sal) 最小值 ,sum( sal) 共计,COUNT(SAL) 人数 FROM emp GROUP BY deptno
HAVING AVG( SAL) > 2000 ORDER BY deptno DESC
/* 子查询 */
SELECT *FROM emp WHERE sal > (SELECT AVG( sal) from emp) ORDER BY sal /* 查询工资低于平均工资的 */
SELECT * FROM (SELECT * FROM emp)e /* (子查询查询的结果是一张临时的表,即使只有一个数据) e 别名 */
SELECT * from emp where empno in (SELECT empno from emp where empno = 7369 or empno = 7499 or empno = 7521)
/* 连表语句 */
SELECT e.*,d.dname,d.loc FROM emp e,dept d where e.deptno = d.deptno /* 92年 */
SELECT * from emp e INNER JOIN dept d on e.deptno=d.deptno /* 99年新写法 两边都有的才显示出来 */
SELECT * from emp e RIGHT JOIN dept d on e.deptno=d.deptno /* 99年新写法 右边有的就显示出来 */
SELECT * from emp LIMIT 0,5 /* 0是起始位置 , 5是条数 */
MyEclipes 练习JDBC:
private static String jdbcDriver = "com.mysql.jdbc.Driver";
private static String jdbcUrl = "jdbc://mysql:localhost:3306/t_test?useUnicode\=true&characterEncoding\=UTF-8"; /* 解决数据乱码问题 */
private static String jdbcUser = "root";
private static String jdbcPassword = "123456";
2 . 建立 jdbc.properties 与代码的联系?
//静态代码块,直接调用,不用创建实例
static{
InputStream is = DBConnectionUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");
Properties p = new Properties();
try {
p.load(is);
jdbcDriver=p.getProperty("jdbcDriver");
jdbcUrl=p.getProperty("jdbcUrl");
jdbcUser=p.getProperty("jdbcUser");
jdbcPassword=p.getProperty("jdbcPassword");
} catch (IOException e) {
e.printStackTrace();
}
}
static 代码块也叫静态代码块,是在类中独立于类成员的 static 语句块,可以有多个,位置可以随便放,它不在任何的方法体内,Java 虚拟机加载类时会执行这些静态的代码块,如果 static 代码块有多个,Java 虚拟机将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。
开始写代码
1 . 在 po 包下新建 User 类 并 getters 和 setters。
package com.beiruan.po;
public class User {
private int userId;
private String username;
private int sex;
private String password;
private int flag;
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getSex() {
return sex;
}
public void setSex(int sex) {
this.sex = sex;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getFlag() {
return flag;
}
public void setFlag(int flag) {
this.flag = flag;
}
}
2 . 在 dao 包下新建 UserDao 类:
因为 save,delete 等操作数据库的方法都需要连接数据库代码,可以将相同代码封装到工具类 DBConnectionUtil 中。
public static Connection getConnection(){
Connection conn = null;
try {
Class.forName(jdbcDriver);
conn=DriverManager.getConnection(jdbcUrl, jdbcUser, jdbcPassword);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
public static void closeAll(Statement st,Connection conn){//后打开的先关闭
if(st!=null){
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}finally{
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
使用静态方法可以直接通过类名调用,不用实例化。
a . 先来 save 方法
public boolean savaUser(User user) {
boolean flag = false;
Connection conn = null;
Statement st = null;
try {
conn = DBConnectionUtil.getConnection();//直接调用封装好的连接数据库的方法
String sql = "insert into user(username,password) values('"
+ user.getUsername() + "','" + user.getPassword() + "')";
st = conn.createStatement();
int rows = st.executeUpdate(sql);
if (rows > 0) {
flag = true;
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBConnectionUtil.closeAll(st, conn);//封装好的方法
}
return flag;
}
然后测试它。单独新建一个 Test 资源包 ,在里面新建 JUnit 测试类。
@Test
public void testSave() {
UserDao user = new UserDao();
User u = new User();
u.setUsername("孙策");
u.setPassword("12%343r5");
System.out.println(user.savaUser(u)?"保存成功!":"失败");
}
b . 同理写 delete 方法:
public boolean deleteUserByuserId(int userId) {
Boolean flag = false;
Connection conn = null;
Statement st = null;
String sql = null;
try {
conn = DBConnectionUtil.getConnection();
st = conn.createStatement();
sql = "delete from user where userId = " + userId;
int rows = st.executeUpdate(sql);
if (rows > 0) {
flag = true;
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBConnectionUtil.closeAll(st, conn);
}
return flag;
}
c . update 方法:
public boolean updateUserByMap(Map<String, Object> map) {// Map 可以根据 key 来修改 value 的值
Boolean flag = false;
Connection conn = null;
Statement st = null;
String sql = null;
try {
conn = DBConnectionUtil.getConnection();
st = conn.createStatement();
sql = "update user set username ='" + (String) map.get("username")
+ "' where userId =" + map.get("userId");
int rows = st.executeUpdate(sql);
if (rows > 0) {
flag = true;
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBConnectionUtil.closeAll(st, conn);
}
return flag;
}
测试方法:
@Test
public void testUpdateUserByMap() throws Exception {
UserDao user = new UserDao();
Map<String, Object> map = new HashMap<String, Object>();
map.put("userId", "3");
map.put("username", "徐庶");
user.updateUserByMap(map);
}
查看数据表里数据是否变化。