mysql学习:从JDBC到DbUtils,再到MyBatis

1.我们学会了用navicat编写sql语句,从而对mysql数据库进行增删改查。

2.我们如何用IDEA开发工具实现Java代码来操作数据库并获取返回值。

  1. JDBC就是在Java程序中连接数据库并操作SQL语句的一组API。
  2. 基本步骤就是,先引入一个mysql的bin的jar包,再通过url,username,password等获取java程序连接数据库的连接connection,然后通过这个连接对象获取编译sql语句的编译对象statement,这个编译对象就可以执行sql语句并获取结果集,最后处理我们的结果集就能拿到我们需要的数据了。
  3. 但是以上操作都是固定的,每次如果执行一个sql语句都要来一套这种操作我们就受不了,所以我们可以选择抽取一个jdbcUtil的工具类即可。
  4. statement存在sql注入的风险,因为他不是预编译的;PreparedStatement 对象就可以解决这个问题了,因为他是预编译的,通过?占位符这种形式提前把sql语句编译好,然后再进行替换,再替换的过程中会对单引号进行转换从而把传入的参数当成一个整体执行,这样就避免了sql注入的问题。

 3.自定义连接池

  1. jdbc中的连接是我们自己创建的,涉及到io操作,三次握手等,这样就会消耗很多额外的性能,所以需要连接池来解决这个问题,循环利用。
  2. 自定义连接池,创建连接就用工具类,创建好了添加到连接池LinkedList即可,用时就removeFirst(),还时就addLast(connection)。
  3. 自定义多麻烦,有现成的第三方使用多好,引入jar包即可,配置文件c3p0-config.xml ,无非就是那四样,driverClass、jdbcUrl、user、password等。使用的时候读取配置即可:new ComboPooledDataSource("haha"),此时返回一个dataSource连接池对象,dataSource.getConnection(),connection.prepareStatement("select * from emp");preparedStatement.executeQuery();这一系列方法调用即可。
  4. 使用上面的连接池就可以优化第一天的jdbcUtil工具类为C3p0JdbcUtils,不用自己创建连接,使用连接池获取,同时关闭资源close方法增强归还连接的作用。
  5. DbUtils是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC应用程序的开发,同时也不会影响程序的性能。这个工具类是再次简化了我们使用IDAEA操作sql语句获取返回结果集的操作。 new QueryRunner(C3p0JdbcUtils.getDataSource()); queryRunner.update(sql)即可,就不需要自己去获取什么编译对象了,再靠编译对象执行sql获取结果集,还要自己遍历处理结果集。
  6. DbUtils可以封装结果集为五种类型map,list<map>,javaBean,list<javaBean>,ScalarHandler

4.MyBatis 第一天

  1. 这是一个框架,框架就是来简化开发的;用DbUtils存在啥问题,sql硬编码,很不灵活,有时候我们的where条件复杂多变,难道你每次都去改代码,不好维护;与编译对象的占位符参数也是会变化的,这个时候该给几个?,很不方便;结果解析也是麻烦。所以为了解决这些问题,我们就需要一个框架了,别人搞好了,你直接学会如何用即可。
  2. 怎么用:进入maven编程了,肯定不是引入jar包了,所以说引入MyBatis依赖。创建javabean用于接受返回结果。创建com/itheima/dao包下的UserDao接口,同时在resources 下面创建文件夹 com/itheima/dao包下的UserDao.xml,这个是用来写sql语句的,和UserDao下的接口方法会一一对应。最后mybatis-config.xml 配置文件也是必不可少的,你总的告诉我去连那个数据库和前面的那个UserDao接口和UserDao.xml映射关系建立。
     //1.需要得到MyBatis核心配置文件的文件流
            InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
            //2.加载MyBatis核心配置文件 获得SqlSessionFactory对象
            //使用了建造者模式 和 工厂模式 得到SqlSessionFactory 相当于连接池对象
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
            //3.获取SqlSession对象  相当于Connection对象
            SqlSession sqlSession = sqlSessionFactory.openSession();
            //4.获取dao接口的代理对象   使用了代理模式
            UserDao userDao = sqlSession.getMapper(UserDao.class);
            //5.调用方法操作
            List<User> list = userDao.findAll();
  3. 准备工作做好了就开始用呗,获取SqlSession对象,再用它sqlSession.getMapper(UserDao.class)获取dao接口的代理对象,dao调用接口中的方法即可。同时这个接口方法就会去UserDao.xml根据接口方法命找到id对应得sql语句进行执行获取返回结果。
  4. 上面得步骤可以改进,比如起包别名啥的,设置好就不要每次写全限定类名了, 传递的参数是对象,获取时使用#{对象属性名称}即可。
  5. #{}和${}的区别?

    1.#{}会进行SQL语句预编译,能够完成类型自动转换,可以有效防止sql注入,更加安全,使用接收单个简单类型数据时,#{任意字段},接收对象属性值时 #{javabean属性名称}

    2.${}表示SQL语句拼接,不会进行类型自动转换,不能防止sql注入,使用接收单个简单类型数据时必须使用${value},接收对象属性值时${javabean属性名称}

    使用选择:一般能够使用#{}的时候就使用#{},偶尔如果需要传递表名、列名就会使用${}

  6. mybatis如何传递参数:简单数据类型;bean对象;多个简单参数记得要封装为bean(推荐)或map(很少),再或者@Param("username")每个参数都要打上这个注解;最后就是包装对象,就是对象套对象QueryVo包uesr对象,parameterType="QueryVo",获取时#{user.uid}。
  7. 接着传参数,不过此时是返回参数resultType :略,比较复杂,社么一对一,一对多啥的自己去看。

 5.MyBatis 第二天

  1. 事务,自己了解
  2. 动态sql,自己去看,写不下那么多
  3. MyBatis缓存 :将数据源(数据库或者文件)中的数据读取出来存放到缓存中,再次获取的时候 ,直接从缓存中获取,可以减少和数据库交互的次数,这样可以提升程序的性能!适用于经常查询的数据。自带一级缓存,二级缓存要自己开启。
  4. 多表关联查询,重点啊!resultMap的映射关系一大堆。 还是自己看吧。

6.MyBatis 第三天 

  1. mybatis的延迟加载:多表查询时才存在;fetchType="lazy"
  2. mybatis注解开发;用注解开发就不需要UserDao.xml了,因为它就是个写sql语句的,不用了自然就不需要。直接在UserDao接口上添加注解然后写sql即可。@Insert、@Update、@Delete、@Select、@SelectKey 。
  3. 注解实现复杂开发:略 自己看@Results 注解 @One 注解  @Many 注解(一对多)
  4. 分页处理:使用PageHelper插件实现分页效果。引入pagehelper依赖,在核心配置文件中添加配置<plugins></plugins>;Page<User>类接收返回结果。
  5. 在是实现类方法中使用,先获取userDao代理对象; PageHelper.startPage(2,3)设置分页参数;调用接口方法获取结果集list;结果集封装 new PageInfo(list)。
  6. 动态sql扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值