BoomMan

爱生活,爱Coding.....

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

从开始使用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; #删除保存点

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/boom_man/article/details/79244246
个人分类: Java-Web应用
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

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

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭