欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

MyBatis

时间:2023-07-04
一、什么是MyBatis?  

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 hello(){ return service.hello(); } //XML @RequestMapping("/helloxml") public HelloWorld helloxml(){ return service.mybatis(); }}

Service接口

public interface Service{ List hello(); //XMl HelloWorld mybatis();}

 Dao接口 也就是我们这篇主角的地方

@Mapper //把Dao交给Spring管理@Repository //声明一个持久类public interface Dao{ @Select("select * from hello") List hello(); //XML HelloWorld mybatis();}

ServiceImp实现类 

@Servicepublic class ServiceImp implements com.example.mybatis.service.Service{ @Autowired Dao dao; @Override public List hello() { return dao.hello(); } //XML @Override public HelloWorld mybatis() { return dao.mybatis(); }}

最后打开浏览器地址栏输入http://localhost:8888/hello

下面来看XML文件怎么玩,首先先把之前注释掉的配置文件打开

再创建一个XML文件,值得注意的是得填自己的路径 在地址栏换成http://localhost:8888/helloxml发现效果是一样的有人或许会问了Dao接口可以做到的事情还要多一事干嘛,当时有好处才会有人这样写呀,因为XML文件里可以写流程控制语句,相当灵活。

<?xml version="1.0" encoding="UTF-8" ?> SELECT * FROM hello;

五、MyBatis常见问题  1、#{}和${}的区别?

或许有些初学者和我之前一样喜欢用$,因为$代表的是字符串替换,安全性相当低。有时候写#代码就会给你报错但是换成$他又不会报错了。这是因为#有效的防止了SQL注入。黑客有时候就会利用你的代码不规范给你的系统玩废掉。黑客可以直接在你的文本框中随意插入SQL语句。那样子数据库就会认可哪些语句,照样给你运行。到时候数据库就完蛋了。那什么时候该用、什么时候不该用今天就来讲讲。

${}代表的是字符串替换

告诉 mybatis 使用 $ 包含的“字符串”替换所在位置。使用 Statement 把 sql 语句和${}的,内容连接起来。主要用在替换表名,列名,不同列**排序(order by ${…})**等操作。

举例:

 1.需要动态拼接表名时。

    select * from ${tablename}

 2.动态拼接排序字段。

    select * from table order by ${username} de

#{}代表的是预编译处理

告诉MyBatis使用实际参数值代替,会将sql中的#{}替换成?,调用PreparedStatement的set方法来赋值;

总结#{}和${}的区别:

#使用 ?可以在SQL语句中做占位,使用PreparedStatement执行SQL,有预编译处理,防止SQL注入,效率高。

尽量在不用$的时候千万不要用,因为${}采用字符串拼接方式,使Statement对象执行SQL,效率极低,有SQL注入的风险,缺乏安全性,${}的内容是原样替换的,但是可以替换列名和表名,需要确定数据安全情况下才能使用。

2、当实体类属性和表中字段不一致该如何处理?

1、可以通过在查询SQL语句中定义字段的别名,让字段名的别名与实体类属性保持一致

2、通过 来映射字段名和实体类属性名的一 一对应关系。

select * from orders where order_id=#{id}

同时也可以直接在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 names = mapper.selectlike(wildcardname);select * from foo where bar like "%"#{value}"%"

4、通常一个XML映射文件,都会写一个Dao接口与之对应。也就如上面XML形式写MyBatis一样。那它的工作原理是什么呢,Dao里面方法、参数不同,方法可以进行重载吗?

Dao接口即Mapper接口,接口的全限名,就是映射文件中的namespace的值;接口的方法名就是映射Mapper的Statement的id值;接口方法内的参数,就是传递给SQL的参数。

Mapper接口是没有实现类的,当调用SQL方法时,接口全限名+方法拼接字符串作为key值,可唯一定位一个MapperStatement。在MyBatis中,每一个