关闭

Java数据库Dao层-不完全指南

37人阅读 评论(0) 收藏 举报
分类:

从开始使用Windows软件到自己编程,一切有点东西的软件都需要涉及到数据库,它存储着我们的重要信息~-~

开始

你可能首先知道这些?

1.为什么要使用数据库?

数据库是做数据持久化保存的一种方式!

2.什么是数据持久化,它与什么相对应?

数据在创建和使用过程中都是在内存中进行的,我们要将他保存下来可以下一次使用,将数据模型转为存储模型的过程叫持久化操作!

3.Java连接数据库或者说Java操纵数据库前期我们需要准备什么?

1.首先你要有一个数据库!这里我们使用的是MySql

关于Windows和Linux下Mysql数据库的安装:
MySql官方Download:下载地址
Windows
Linux安装mysql并配置外网访问

2.你需要Java连接Mysql的驱动

1.JDBC驱动:官方地址
2.Maven Maven

第一节:Java连接数据库-jdbc

1.在环境中导入jar包

可以通过Maven方式或者lib导入jar

2.开始编码阶段

①加载驱动

            Class.forName("com.mysql.jdbc.Driver");
            //在新版的mysql驱动中是
            Class.forName("com.mysql.cj.jdbc.Driver");

②获取数据库连接

/**
url:jdbc:mysql://127.0.0.1:3306/test1?useUnicode=true&useUTF-8=true&character=utf-8&useSSL=true
此前你需要定义 url,user,password
*/
Connection connection = DriverManager.getConnection(url, user, password);

③获取prepareStatement或者Statement

//这里需要传入sql ,字符串的拼接形式or?  这里涉及到sql注入问题
 PreparedStatement  preparedStatement = connection.prepareStatement(sql);

④获取结果集ResultSet

//如果是查询使用以下方式
         ResultSet    resultSet=preparedStatement.executeQuery();

⑤将结果集放入Entity中

 List<T> list=new ArrayList<>();
 //新建T类型 放入list集合中,当然如果是单个查询返回T即可

⑥关闭连接

//一定不要忘记,要关闭连接
closeAll(connection,preparedStatement,resultSet);

第二节:自己封装jdbc+Spring的JdbcTemplate

封装JDBC的思路是使用模板方法模式,将其中的公有部分抽取出来
最后封装如下:

1.获取连接:

    public static Connection getConnection() {
        final  String url = "jdbc:mysql://127.0.0.1:3306/test1?useUnicode=true&useUTF-8=true&character=utf-8&useSSL=true";
        final  String user = "root";
        final  String password = "xxx";
        Connection connection=null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection(url, user, password);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return connection;
    }

2.执行查询操作

    public static <T> List ExecuteQuery(String sql , QueryMap<T> queryMap){
        List<T> list=new ArrayList<>();
        Connection connection=getConnection();
        PreparedStatement preparedStatement=null;
        ResultSet resultSet=null;

        try {
             preparedStatement = connection.prepareStatement(sql);
             resultSet=preparedStatement.executeQuery();
             while (resultSet.next()){
                list.add(queryMap.MapSet(resultSet)) ;
             }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            closeAll(connection,preparedStatement,resultSet);
        }

        return list;
    }

3.执行更新操作

    public static int ExecuteUpdate(String sql, Object ...s){
        int result=0;
        Connection connection=null;
        PreparedStatement preparedStatement=null;
        try {
             connection=getConnection();
             preparedStatement = connection.prepareStatement(sql);
            for (int i = 0; i < s.length; i++) {
                preparedStatement.setObject(i+1,s[i]);
            }
            result = preparedStatement.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            closeAll(connection,preparedStatement,null);
        }
        return result;
    }

4.关闭所有

    public static void closeAll(Connection connection, PreparedStatement preparedStatement, ResultSet resultSet){
        try {
            if (connection!=null){
                connection.close();
            }
            if (preparedStatement!=null){
                preparedStatement.close();
            }
            if (resultSet!=null){
                preparedStatement.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

5.关于rowMap

import java.sql.ResultSet;

public interface QueryMap<T> {
    <T> T MapSet(ResultSet resultSet);
}

6.SpringJdbcTemplate?

封装的思想是使用模板方法模式将共同的抽取出来,变化的使用策略模式,实时传入的思想。

第三节:什么是数据源?DataSource,数据库连接池?

数据源顾名思义就是数据的来源
在Java中Mysql配置一般最少需要url,user,password.

数据库连接池:创建数据库连接是一个很耗费时间和资源的事情,每次将使用完连接归还到池子当中,每次从池子中取,有效的解决了创建耗费资源的问题。而且在大多数框架中都要使用数据库连接池!
数据库连接池现在有哪些呢?
如:c3p0,dbcp,Druid等


第四节:配置使用Mybatis

配置步骤及Mapper.xml的配置
Mybatis-Maven:https://mvnrepository.com/artifact/org.mybatis/mybatis
Mybatis官网:http://www.mybatis.org/mybatis-3/

1.导入jar包
2.配置mybatis-config.xml
3.书写接口
4.书写接口Mapper.xml(SQL语句)
5.执行调用

第五节:Spring+Mybatis

Spring+Mybatis的配置步骤及文档
1.导入jar包,包含Spring的相关包+Spring JDBC的包+Mybatis+SpringMybatis的包
2.配合bean dataSource
3.配置 sqlSessionFactory
4.配置MapperScannerConfigurer或者
5.配置事务相关 transactionManage

第六节:Mybatis解决了我们什么问题?

1.sql语句在Mapper.xml中配置,不需要在代码中书写
2.使用模板方法,不需要我们书写重复代码
3.使用ResultMap或者ResulType接收结果,简单易用

第七节:Mybatis的结果集映射 1-N的问题

1-N官方推荐的解决方式 left join

1-1的方式

第八节:Mybatis处理复杂表关系

使用ResultMap
一对一的关系
一对多的关系

第九节:Mysql常见优化

分页查询优化
查询索引进行优化
数据库字段进行优化

第十节:开发注意事项

如果是个人开发在没有用到数据库连接池的时候
注意关闭连接

什么时候进行优化?
在发生性能问题后进行优化

Mybatis中#{}和使{}防止SQL注入

第十一节:附录

1.数据库的事务
 
 数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。
ACID特性
2.数据库的隔离级别
读未提交:可以读到没有没有另一事务中没有提交的数据
读提交:只能读到事务commit后的数据
重复读:保证两次重复读的数据相同
序列化:一切有序进行

3.数据库的四种现象

脏读 不可重复读 幻读
Read uncommitted
Read committed ×
Repeatable read × ×
Serializable × × ×

脏读:读到没有提交的数据
不可重复读:两次读取不一致 读-读
幻读:读-写 数据不一致 数据条数不一致

4.数据库的limit分页查找

在分页时用id将不需要的隔离开

5.数据库如何手动设置事务或者说创建事务

6.数据库如何加行锁,什么情况下加
锁只在查询中加,其他的会自动加锁?


START TRANSACTION;


SAVEPOINT point1;


ROLLBACK to point1;
release savepoint point1
commit;

START TRANSACTION;  
SELECT * FROM student WHERE id=1  FOR UPDATE;  
SELECT sleep(10);
COMMIT;  
START TRANSACTION;  
SELECT * FROM student WHERE id=1  lock in share mode ;  
SELECT sleep(10);
COMMIT;  

rollback;

Java编写事务:

  conn.setAutoCommit(false);开启事务操作
  conn.commit();提交操作
  connection.rollback();回滚操作
  connection.setSavepoint();设置回滚点

Spring+Mybatis设置事务

事务注解
@Transactional 

        Object savePoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint();
        //设置回滚点

        TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint);
        //回滚操作

备注在阿里巴巴规范中
@Transactional 必须设置 rollback

不管怎么样最后都需commit

START TRANSACTION; 会将上次事务提交

set transaction read only; #设置事务只读
set transaction read write; #设置事务可读、写

release savepoint point1; #删除保存点

0
0
查看评论

java Dao层对数据库操作总结

一、获取数据库连接 Connection con = null; try{     con =this.getSessionFactory.getCurrentSession().connection();    con.setA...
  • u011300808
  • u011300808
  • 2016-06-12 10:51
  • 2299

JAVA DAO层 对数据库操作常用方法

/** * @param custId * @param page * @param rows * @return */ @SuppressWarnings("unchecked") public List> getCustomerList(Stri...
  • h378588270
  • h378588270
  • 2013-10-21 16:31
  • 22139

java中dao层获取MySQL数据库中的时间

由于ResultSet包中的getDate()方法默认的是使用java.sql.date,会将数据库中所有的时间类型转换成java.sql.date类型(只有日期没有具体时分秒) 所以使用getTimestamp(),获取到的当前时间的时间戳(long类型的date),在将时间戳转换为java.ut...
  • qq_31143473
  • qq_31143473
  • 2017-12-09 13:50
  • 75

Java通过JDBC 进行Dao层的封装

前言前面有一章节,我专门讲解了Java通过JDBC 进行MySQL数据库操作,这主要讲解了MaySQL数据库的连接和简单的操作,但是在真正的java项目中,我们要不断的和数据库打交道,为了提高数据库操作的执行效率和增加代码的复用性,将重新封装一个Dao层,也就是数据访问层 ,用来访问数据库实现数据的...
  • ToBeTheEnder
  • ToBeTheEnder
  • 2016-10-16 23:50
  • 5807

数据持久层DAO的建立和使用,实现数据库的连接

//DAO接口 package ex3; import java.sql.Connection; public interface DAO { public Connection getConnection();//声明连接方法 }//StudentDAO接口 package ex3; impor...
  • sanganqi_wusuierzi
  • sanganqi_wusuierzi
  • 2017-02-03 22:59
  • 1413

安卓开发-数据库dao层的简单CRUD

package com.wanggjie.weishi.db.dao; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import...
  • baliang8
  • baliang8
  • 2017-02-17 17:39
  • 455

JDBC---DAO经典模式 实现对数据库的增、删、改、查

JDBC(Java Data Base Connection)的作用是连接数据库   先看下jdbc连接SQLServer数据库的简单例子 代码实现(FirstJDBC):   package com.jdbc; import java.sql.Connectio...
  • hzc543806053
  • hzc543806053
  • 2012-03-26 18:13
  • 29524

JAVA学习笔记(五十二)- 开发DAO层的经典实现

StudentDAO接口,定义学生相关的操作 /* * StudentDAO接口,定义学生相关的操作 */ public interface StudentDAO { //添加学生 public void addStudent(Student stu); //删除学生 ...
  • wangzi11322
  • wangzi11322
  • 2015-04-05 08:59
  • 8962

java EE的三层结构:web层、service层、dao层

我们常常提到java EE的三层或者四层结构。 四层架构: 展示层(web层)、业务逻辑层、数据访问层、信息资源层 四层架构在是开发企业应用时使用的非常经典的划分模式。 web层负责前端展示和用户请求的处理。mvc是一个设计模式,主要用户构建用户界面,目的是把展示逻辑和逻辑分离。web层通常会使用M...
  • u010772673
  • u010772673
  • 2017-02-09 16:38
  • 3451

Java中dao层和service层的区别

今天看了一篇文章,写的是关于Java中dao层和service层的区别,写的是相当好。忍不住跟大家分享。 service是业务层,dao是数据访问层。 记得以前刚学编程的时候,都是在service里直接调用dao,service里面就new一个dao类对象,调用,其他有意义的事没做,也不明白有这...
  • chenfengbao
  • chenfengbao
  • 2017-02-26 15:46
  • 1243