1.MyBatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC。开发时只需关注SQL本身。不需要花费精力去加载驱动、创建连接、创建statementd等繁杂的过程。程序猿直接编写原生态SQL。可以严格控制SQL执行性能,灵活度高。
2.MyBatis可以使用XML和注解方式来配置和映射原生信息,将POJO映射成数据库中的记录,避免了几乎所有的JDBC代码和手动设置参数以及获取结果集
3.通过XML文件或注解的方式要执行的各种statementd配置起来,并通过Java对象和starementdz中的动态参数进行映射生成最终执行的SQL语句。最后由MyBatis执行SQL并将结果映射为Java对象返回。(从执行SQL到result的过程)
二、为什么要使用MyBatis?MyBatis的优势在哪里?1.基于SQL语句编程,相当灵活,不会对应用程序或者数据库现有设计造成任何影响,SQL写在XML里面。解除SQL与代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重用
2.与JDBC相比,减少了50%的以上的代码量,消除了JDBC大量的冗余代码,不需要手动开关连接
3.很好的与数据库兼容,只要支持JDBC支持的数据库,MaBatis都支持。(MyBtis使用JDBC连接数据库)
4.能够与Spring很好的集成
5.提供映射标签,支持对象与数据库的ORM字段映射关系,提供对象关系映射标签,支持对象关系组件支持
三、MyBatis的弊端又是什么?1.SQL语句编写工作量较大,尤其字段较多的情况下、关联表多,对开发人员的编写SQL语句的功底有一定要求。
2.SQL语句依赖数据库,导致数据库移植性差,不能随意更换数据库。(在数据库确定的情况下使用Mybatis效果是非常好的,如果不确定建议先使用hibernate)
四、MyBatis第一个Hello World搭建环境——导入依赖——代码编写——接口测试
项目结构:
数据库如下:
配置文件:
#端口号server.port=8888#数据库账号spring.datasource.username=root#数据库密码spring.datasource.password=root#连接哪个数据库spring.datasource.url=jdbc:mysql://localhost:3306/join#数据驱动 数据库驱动错误把cj删掉或导入时间分区spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver#XML方式spring.jpa.show-sql=true#没有此XML要先注释要不然跑不起来#mybatis.mapper-locations=classpath:mysql/User.xml#spring.jpa.hibernate.ddl-auto=updatespring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
代码编写:
Controller类
@RestController //映射请求,也就是通过它来指定控制器可以处理哪些URL请求public class Controller{ @Autowired Service service; @RequestMapping("/hello") public List
Service接口
public interface Service{ List
Dao接口 也就是我们这篇主角的地方
@Mapper //把Dao交给Spring管理@Repository //声明一个持久类public interface Dao{ @Select("select * from hello") List
ServiceImp实现类
@Servicepublic class ServiceImp implements com.example.mybatis.service.Service{ @Autowired Dao dao; @Override public List
最后打开浏览器地址栏输入http://localhost:8888/hello
下面来看XML文件怎么玩,首先先把之前注释掉的配置文件打开
再创建一个XML文件,值得注意的是得填自己的路径 在地址栏换成http://localhost:8888/helloxml发现效果是一样的有人或许会问了Dao接口可以做到的事情还要多一事干嘛,当时有好处才会有人这样写呀,因为XML文件里可以写流程控制语句,相当灵活。
<?xml version="1.0" encoding="UTF-8" ?>
或许有些初学者和我之前一样喜欢用$,因为$代表的是字符串替换,安全性相当低。有时候写#代码就会给你报错但是换成$他又不会报错了。这是因为#有效的防止了SQL注入。黑客有时候就会利用你的代码不规范给你的系统玩废掉。黑客可以直接在你的文本框中随意插入SQL语句。那样子数据库就会认可哪些语句,照样给你运行。到时候数据库就完蛋了。那什么时候该用、什么时候不该用今天就来讲讲。
${}代表的是字符串替换
告诉 mybatis 使用 $ 包含的“字符串”替换所在位置。使用 Statement 把 sql 语句和${}的,内容连接起来。主要用在替换表名,列名,不同列**排序(order by ${…})**等操作。
举例:
1.需要动态拼接表名时。
select * from ${tablename}
2.动态拼接排序字段。
select * from table order by ${username} de
#{}代表的是预编译处理
告诉MyBatis使用实际参数值代替,会将sql中的#{}替换成?,调用PreparedStatement的set方法来赋值;
2、当实体类属性和表中字段不一致该如何处理?总结#{}和${}的区别:
#使用 ?可以在SQL语句中做占位,使用PreparedStatement执行SQL,有预编译处理,防止SQL注入,效率高。
尽量在不用$的时候千万不要用,因为${}采用字符串拼接方式,使Statement对象执行SQL,效率极低,有SQL注入的风险,缺乏安全性,${}的内容是原样替换的,但是可以替换列名和表名,需要确定数据安全情况下才能使用。
1、可以通过在查询SQL语句中定义字段的别名,让字段名的别名与实体类属性保持一致
2、通过
同时也可以直接在Java类中这样定义映射
@Select("select * from hello") @Results( { @Result(column = "1",property = "1"), @Result(column = "2",property = "3") } )
3、模糊查询的like语句该怎么写?
有些同学就会说了小小的模糊查询,洒洒水啦,先这样再那样不就可以了。
第 1 种:在 Java 代码中添加 sql 通配符。string wildcardname = “%smi%”;list
第 2 种:在 sql 语句中拼接通配符,会引起 sql 注入string wildcardname = “smi”;list
Dao接口即Mapper接口,接口的全限名,就是映射文件中的namespace的值;接口的方法名就是映射Mapper的Statement的id值;接口方法内的参数,就是传递给SQL的参数。
Mapper接口是没有实现类的,当调用SQL方法时,接口全限名+方法拼接字符串作为key值,可唯一定位一个MapperStatement。在MyBatis中,每一个
Mapper接口里面的方法是不可以进行重载的,因为使用的是全限名+方法名的保存和寻找策略。Mapper接口工作原理就是JDK动态代理。MyBatis运行时会使用JDK动态代理为Mapper接口生成代理对象Proxy,代理对象会拦截接口方法,转而执行MapperStatement所代表的SQL,然后将SQL执行语句返回
5、MyBatis动态SQL有什么用?执行原理?有哪些动态SQL?MyBatis动态SQL可以在XML映射文件内,以标签形式编写动态SQL,执行原理是根据表达的值,完成逻辑判断并动态拼接SQL的功能
MyBatis提供了九种动态SQL标签
trim | where | set | foreach | if | choose | when | otherwise | bind6、为什么说MyBatis是半自动ORM映射框架,他与全自动的区别在哪?
Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时。可以根据关系对象模型直接获取,所以他是全自动的,而MyBatis在查询关联对象或关联集合对象时,需要手动编写SQL来完成,所以称之为半自动ORM映射框架。
7、使用MyBatis的Mapper接口调用有哪些要求?(1)MyBatis接口方法名和mapper.xml中定义的每个sql的id相同。
(2)Mapper的接口方法的输入参数类型和mapper.xml中定义的每个SQL的parameterType的类型相同。
(3)Mapper接口方法的输出参数类型和mapper.xml中定义的每个SQL的resultType的类型相同;
(4)Mapper.xml文件中的namespace即是mapper接口的类路径。
8、MyBatis的一级、二级缓存:后续会持续更进~ ~ ~