Mybatis(基于jdbc的优化)
一Mybatis的概述Mybatis 是一个长期持久的框架是基于 jdbc 为基础创建的减少了大量的 jdbc 的基础语言jdbc 需要将近20行代码而 Mybatis 大概只要5行代码二Mybatis快速入门1前期准备工作1创建SpringBoost工程需要引入相关的依赖lombokMysql driverMybatis Framework2准备数据库实体类user用于装读取到的数据3配置Mybatis四个必备配置连接数据库的地址注册驱动用户名密码2编写Mybatis代码一main包下的代码//需要声明一个注解表示Mapper接口一旦声明这个注解 //那么在运行代码时就会自动运行接口并创建对应的实现类 对象代理对象 //然后将这个实现类注入IOC容器中bean然后其他类就可以获取这个对象了 Mapper public interface UserMapper { //创建Mybatis的方法对应的注解其中有selectupdateinsertdelete对应的注解 //使用这个注解那么就会自动调用对应的SQL方法然后将方法返回值自动存入到findAll的返回值 Select(select * from user) public Listuser findAll(); }二test包下的代码//SpringBoostTest的注解的作用 //就是一旦有这个注解那么就会自动运行springboost的代码IOC就会创建好就可以直接使用 SpringBootTest class SpringboostMybatisQuickstartApplicationTests { //编写测试代码 //使用依赖注入的方法将这个UserMapper的代理对象获取出来 Autowired UserMapper userMapper; Test public void testFindAll() { Listuser all userMapper.findAll(); all.forEach(System.out::println); } }三注意事项和小细节在测试文件test下的单元测试代码需要添加注解SpringBoostTest在测试单元阶段就会加载SpringBoost的环境注意测试类所在的包需要和引导包启动包的名字一样或者在引导包所在包的子包下如下的test下的测试单元的类名和main下的启动类的名字一样创建时自带不要乱搞3辅助设置的配置直接看黑马javaWeb的66集就行4jdbc和mybatis比较jdbc的连接地址是写死在代码内的用户名 和密码也是写死在代码内这样不利于后期的修改jdbc的连接流程过于繁琐需要创建请求连接的对象创建执行sql的对象获取返回值jdbc需要频繁开启和关闭资源导致资源的浪费mybatis是将连接地址用户名称密码都写到配置文件内修改起来简单且不需要重新编译mybatis的连接流程简单select就能自动匹配到对应的数据库并获取返回值mybatis底层使用连接池方法这样就不需要频繁启动和释放连接对象5连接池一连接池的概念连接池就是一个容器用于管理分配数据库的连接他是一个允许程序重复使用的一个数据库连接而不是重复创建释放空闲时间超过最大空闲时间的连接来避免因为没有释放连接而引起的数据库连接遗漏其实就是类似线程池的功能优势1资源的重复利用2提升系统的响应速度创建连接和释放连接是很耗费时间的3避免数据库连接的遗漏就是假设数据库连接已经占满数据库连接池就会检查哪一个连接空闲只要超过一定时间的空闲数据库连接池就会将这个连接断开将连接交给新的用户二连接池的使用接口DataSource官方sun提供的数据库连接池接口由第三方组织实现此接口功能获取连接Connection getConnection() throws SQLException常见产品C3P0 DBCP现在少用Druid Hikariidea自带的方法后两个最常使用三切换数据库连接池修改配置文件然后注入依赖6Mybatis的增删改一删除操作删除数据的语法和sql一样就是占位符不一样delete from user where id#{id}有两种占位符#{}${}建议使用第一种#{}因为这个占位符底层和一样防止注入的操作而且效率高使用占位符然后方法内传参会自动将这个参数的值添加到占位符中这个代码灵活性高//删除操作假设需要传参就不能将数据写死可以使用占位符#{参数}底层其实就是占位符 Delete(delete from user where id#{id}) public void deleteById(Integer id);Test public void testDeleteById() { userMapper.deleteById(5); }以下是运行时的日志显示显示就是占位符第二种其实就和字符串的拼接一样会有注入风险而且效率低增删改都有参数返回就是受影响的行数的返回//另一种占位符${参数}但是底层使用的是字符串拼接不建议使用会有注入风险 Delete(delete from user where id${id}) public Integer deleteById2(Integer id);Test public void testDeleteById2(){ Integer i userMapper.deleteById2(4); System.out.println(受影响的行数是i); }以下是运行日志显示显示的就是字符串的拼接二插入操作和之前的删除操作一样但是假如插入的参数过多就可以传入的参数包装成对象//插入操作不能将数据写死可以使用占位符#{参数}底层其实就是占位符 //参数过多就可以用一个对象来包装这些参数 Insert(insert into user (username,password,name,age)values(#{username},#{password},#{name},#{age})) public void insert(user u);//测试插入操作 Test public void testInsert(){ //创建一个对象 user user new user(null,gaoyuanyuan,123456,高圆圆,20); userMapper.insert(user); }以下是生成的日志信息数据库的自增长就算是之前将45数据删除底层的计数器依然是5所以自增的下一个就是6三修改数据删除数据的方法就和上面的插入数据一样可以直接使用对象将数据传入//修改数据将id1修改为usernamezhouyuupassword666888name周瑜age18 Update(update user set username#{username},password#{password},name#{name},age#{age} where id#{id}) public void update(user u);//测试修改的操作 Test public void testUpdate(){ user user new user(1,zhouyu,666888,周瑜,18); userMapper.update(user); }以下是日志信息四查找数据多个条件细节其实底层字节码文件是不会记录参数的真正名字的比如方法public void selectString usernameString password那么字节码文件就会改成public void selectString var1String var2那么假设使用注解Select ( select * from user where username#{username} and password#{password} )就会查询不到因为字节码的名字不一样所以需要使用注解Param(参数名)这样就会保存参数名字使用官方的SpringBoost框架底层的配置文件就已经设置好了保留参数所以可以省略但是假设使用其他的比如阿里云的框架就需要写注解前提参数数量2以下是使用官方SpringBoost框架实现的多参数查询//查询数据但是要多个数据 Select(select * from user where username#{username} and password#{password}) public user findByNameAndPassword(String username,String password);//查询数据但是要多个数据 Select(select * from user where username#{username} and password#{password}) public user findByNameAndPassword(String username,String password);以下是日志信息我个人感觉还是写注解比较好这样就不怕切换框架时忘记写这个//查询数据但是要多个数据 Select(select * from user where username#{username} and password#{password}) public user findByNameAndPassword(Param(username) String username,Param(password) String password);7xml配置文件使用sql语言一原因使用注解确实简便但是只能用来解决简单的增删改查的操作如果涉及到复杂的sql操作还强制使用注解的方式解决那么就会导致注解混乱难以维护阅读性差那么就需要使用xml配置文件的方式调用sql语言二xml的使用要求axml 文件名称与Mapper接口的名称一致并且文件的名称要和Mapper的文件名称一样而且文件的路径也要一样bxml 文件的namespace属性要和Mapper定义的接口的全限定名一致cxml文件中 sql 语句的 id 与 mapper 接口中的方法名一致b我的理解就是定义全限定名这样就能根据权限名找到对应的接口c直接在找到的接口下查找对应的方法名这里就只需要方法名就行三使用示例1配置文件框架直接浏览器搜索MyBatis中国官网然后点击入门找到配置文件的格式直接拷贝2文件路径的配置配置的文件父路径必须和调用ssql接口的文件路径一致重点细节在resource文件配置的 directory 文件配置要用符号 / 表示是一个文件夹而创建包class 则是使用符号 . 表示一个文件夹 这个容易出错如下显示就是父路径都一样并且文件名和接口名也是一样的3xml文件配置?xml version1.0 encodingUTF-8 ? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN https://mybatis.org/dtd/mybatis-3-mapper.dtd !--上面的部分是标配一定要有格式也是一样直接使用就行-- !--namespace需要填写对应的接口的全限制名-- mapper namespacecom.itheima.Mapper.UserMapper !-- 选择操作的语言比如selectupdateinsert...-- !-- id就是方法名字要对应接口下的方法名-- !-- resultType表示要存储到的对象的全限制类名表示一会将数据存储到这个对象内-- !-- resultType主要使用在select上返回的是单条记录所对应的封装类型-- select idfindAll resultTypecom.itheima.pojo.user select * from user /select /mapper四辅助配置1配置文件xml映射的文件路径假设xml配置的路径不和对应的接口的路径一样那么就可以在配置文件中配置一个语句mybatis.mapper-locationssclasspath:mapper/*.xml原因是在底层系统会将代码对应的字节码文件放置到class文件下面所以可以直接设置系统查找xml文件路径直接去class字节码文件下查找xml文件2添加辅助工具MyBatisX一旦系统识别到是myBatis就会在前面增加小鸟图标然后点击图标就会自动跳转到对应的方法的文件位置五配置文件的类型1使用ymlyaml配置文件原因一共三种类型propertiesyamlymlproperties系统自动配置的文件类型就是properties但是假设配置的东西过多比如开发一个大型项目就需要配置大量数据那么就会导致配置文件的内容过于臃肿内容重复yamlyml两个之间的区别就是后缀名不一样而已内容都是一样的使用ymlyaml的配置文件能够是文件内容更加简洁层级结构更加清晰2使用ymlyaml格式要求一配置数据格式1数据前面必须有空格作为分隔符2使用缩进的方式表示层级关系缩进时不能使用tab键只能使用空格idea中自动会处理3缩进的空格数量无要求只要保证同一层级的代码靠左对齐就行4# 表示注释二对象的格式1对象名必须置顶然后成员变量的格式就是key:空格value三数组集合的格式1数组的数组名必须置顶2数组内的数据前面必须是缩进空格数-空格value四properties比较yml黄色提示符就是yml的配置文件一眼层级非常清晰并且重复内容没有了绿色提示符就是properties的配置文件