发表于: 2017-10-11 11:28:50
3 809
今天完成的事
【关于mysql的深度思考】
一,如果对学员QQ号做了一个唯一索引,在插入数据的时候,是否需要先判断这个QQ号已经存在了?
我觉得是需要的,如果设置了唯一索引,我在插入一个数据的时候,数据库会自动检索这个新字段的值是否存在,如果存在,那么拒绝插入。其实唯一索引的不光提高了数据访问速度,还确定了唯一性。
***经老大指点,我理解有误区,指的是代码里是否需要判断。
和师兄交流了一下。
我觉得如果我插入一个QQ号,如果这个QQ号没有唯一索引,那么插入的时候需要用代码做判断,存在这个QQ,那么拒绝插入。(QQ唯一)
如果这个QQ有唯一索引了,那么就不要代码做判断,存在这个QQ,拒绝,不存在,插入。
请师兄判断一下这次理解的对么。
二,为什么不可以用Select * from table?
参阅文档http://blog.csdn.net/tongyu2009/article/details/8252418
1、SELECT * 语句取出表中的所有字段,不论该字段的数据对调用的应用程序是否有用,这会对服务器资源造成浪费,甚至会对服务器的性能产生一定的影响。
2、如果表的结构在以后发生了改变,那么SELECT * 语句可能会取到不正确的数据甚至是出错。
3、执行SELECT * 语句时,SQL Server首先要查找出表中有哪些列,然后才能开始执行SELECT * 语句,这在某些情况会产生性能问题。
4、使用SELECT * 语句将不会使用到覆盖索引,不利于查询的性能优化。
5、在文档角度来看,SELECT * 语句没有列明将要取出哪些字段进行操作,所以也是不推荐的。
【maven的安装】
*之前是用idea自带的,来体验一下本地安装。
顺路copy一下maven的目录结构。
Project
|-src
| |-main
| | |-java —— 存放项目的.java文件
| | |-resources —— 存放项目资源文件,如spring, hibernate配置文件
|-webapp —— webapp目录是web工程的主目录
|-WEB-INF
|-web.xml
| |-test
| |-java ——存放所有测试.java文件,如JUnit测试类
| |-resources —— 测试资源文件
|-target —— 目标文件输出位置例如.class、.jar、.war文件
|-pom.xml ——maven项目核心配置文件
【编写DAO,使用JDBC链接数据库】
public class JdbcTemplate {
@Test
public void test() throws Exception{
//注册驱动
Class.forName("com.mysql.jdbc.Driver");
//获取链接
Connection c = DriverManager.getConnection("jdbc:mysql://localhost:3306/mysql", "root", "123");
//编写sql
String sql = "select * from student3 ";
//创建语句执行者
PreparedStatement ps = c.prepareStatement(sql);
//执行语句
ResultSet rs = ps.executeQuery();
//处理结果
while (rs.next()) {
System.out.println(rs.getString("id") + ":" + rs.getString("user_name"));
}
rs.close();
ps.close();
c.close();
}
}
然后实现增删改查。发现获取链接和创建语句执行者和执行语句都是需要的,避免重复编写我就顺便建了个工具类。
import com.sun.org.apache.regexp.internal.RE;
import java.sql.*;
public class JdbcTemplateUtils {
public static Connection getConnection() throws SQLException {
//加载驱动
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//获取链接
return DriverManager.getConnection("jdbc:mysql://localhost:3306/mysql", "root", "123");
}
//释放资源
public static void closeResource(Connection c, PreparedStatement ps, ResultSet rs ){
closeResult(rs);
closePreparedStatement(ps);
closeConnection(c);
}
private static void closeResult(ResultSet rs) {
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
private static void closePreparedStatement(PreparedStatement ps) {
if(ps!=null){
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void closeConnection(Connection c){
if(c!=null){
try {
c.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
然后通过工具类实现了增删改。
@Test
public void test2() {
Connection c=null;
PreparedStatement ps=null;
ResultSet rs=null;
try {
c=JdbcTemplateUtils.getConnection();
//编写sql
String sql="insert into student3 values(?,?,?,?,?,?,?)";
//获取语句执行者
ps=c.prepareStatement(sql);
//设置参数
ps.setString(1,"19");
ps.setString(2,"小张");
ps.setString(3,"8888");
ps.setString(4,"上海交大");
ps.setString(5,"修真");
ps.setString(6,"999");
ps.setString(7,"888");
int i=ps.executeUpdate();
if(i==1){
System.out.println("执行成功数据插入成功");
}else{
System.out.println("数据插入失败");
}
//处理结果
} catch (SQLException e) {
e.printStackTrace();
}
finally{
JdbcTemplateUtils.closeResource(c,ps,rs);
}
}
@Test
public void test3(){
Connection c=null;
PreparedStatement ps=null;
ResultSet rs=null;
try {
c=JdbcTemplateUtils.getConnection();
String sql="update student3 set user_name=? where id= ?";
ps=c.prepareStatement(sql);
ps.setString(1,"小李");
ps.setString(2,"19");
int i=ps.executeUpdate();
if(i==1){
System.out.println("执行成功数据改变成功");
}else{
System.out.println("数据改变失败");
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
JdbcTemplateUtils.closeResource(c,ps,rs);
}
}
@Test
public void test4(){
Connection c=null;
PreparedStatement ps=null;
ResultSet rs=null;
try {
c=JdbcTemplateUtils.getConnection();
String sql="delete from student3 where id=?";
ps=c.prepareStatement(sql);
ps.setString(1,"19");
int i=ps.executeUpdate();
if(i==1){
System.out.println("删除数据成功");
}else{
System.out.println("删除数据失败");
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
JdbcTemplateUtils.closeResource(c,ps,rs);
}
}
}
暂时也算把JDBCTemplate自己编写了一遍,感觉比之前照着模板誊写印象深刻许多。
收获
jdbctemplateJDBC搭建过程重新对一些JAVA语句进行了一些理解。
一,class.forName
Class.forName("com.mysql.jdbc.Driver");
这句话是加载类,class.forName的作用是加载驱动,具体操作是这样的(源码):
static
{
try
{
DriverManager.registerDriver(
new
Driver());
}
catch
(SQLException e) {
throw
new
RuntimeException(
"Can't register driver!"
);
}
}
DriverManager.registerDriver(new Driver());熟悉的加载驱动语句,好理解了一点点。。。
二,
ResultSet rs=ps.executeQuery();
executeQuery();的用途是把数据库响应的查询结果存放在ResultSet类对象中供我们使用。
ResultSet的作用是结果集是一个存储查询结果的对象,但是结果集并不仅仅具有存储的功能,他同时还具有操纵数据的功能,可能完成对数据的更新等。
三,
while(rs.next())
中的.next()方法。
ResultSet 对象具有指向其当前数据行的光标。最初,光标被置于第一行之前。next 方法将光标移动到下一行;因为该方法在 ResultSet 对象没有下一行时返回 false,所以可以在 while 循环中使用它来迭代结果集。
光标向前移动一位后,发现这个位置有对象,那么rs.next 就返回true,否则返回false。
出现的问题
1,用try...catch和throw抛出异常的区别是什么?
- throw是在程序中明确引发异常。
- main方法处理该异常,使用try…..catch语句,将可能会出现的异常的代码放在try块内,将处理异常的代码放在catch块内,并指明catch能够捕获的异常的类型,当异常被捕获时,执行catch块内的语句。
- throws的作用是如果一个方法可以引发异常,而它本身并不对该异常处理,那么它必须将这个异常抛给调用它的方法。
- main方法不处理该异常,将异常向外层程序抛出。在方法声明中使用throws关键字抛出异常,方法体中不需要使用try…catch语句。
2,注意使用JDBCTemplate的时候分离Interface和Imple
学哥看这里,我按照博客说的和自己理解的,我没用到Interface和Imple啊,还是说任务里说的JDBC是spring框架的jdbcTemplate啊,我理解错了,如果理解错了,希望学哥说一声,我明天用spring框架的jdbcTemplate的再链接一遍。
明天的计划
继续任务,争取把mybatis解决掉。
评论