MyBatis是持久层框架,用于简化JDBC开发,负责将数据保存到数据库,支持自定义SQL,免除了JDBC代码以及设计参数和获取结果集的工作,通过简单的xml文件和注解来配置sql,映射类型,接口,POJO等等作为数据库的记录。
JDBC的步骤固定,且为硬编码,每次改动时都要修改代码,手动设置参数,封装结果集时繁琐。
MyBatis入门
1.创建Maven项目,在pom.xml中导入坐标
2.从mybatis-config.xml中创建SqlSessionFactory
xml中包含获取数据库连接实例的 数据源datasource ,以及事务管理器transactionManager
<dataSource>中包含数据库连接信息,driver的value为 com.mysql.jdbc.Driver
url的value为jdbc:mysql://mybatis?useSSL=false
username的value为用户名,value是用户名称
password的value是密码
3.写映射的SQL文件 XxxMapper.xml
在mapper标签里定义select,update,delete等标签,其中标签有id属性,resultType属性,id是SQL语句的唯一标识,resultType是返回值要包装的类型。
完成后在第二步的mybatis.config.xml中的mapper标签的resource属性中添加XxxMapper.xml构成映射关系,如果使用Mapper代理,则可以使用
4.根据数据库字段,定义对应的POJO类
5.编写mybatis核心测试类
(1).加载mybatis的核心配置文件,获取SqlSessionFactory
(2).通过Factory获取SqlSession对象,用它执行sql
(3).执行sql,参数为对应的 (命名空间.id)
但这样依然避免不了硬编码,所以可以使用以下的Mapper代理
*使用代理时,要先定义一个与SQL映射文件同名的Mapper接口,并放在同一目录下,即在resources目录下创建与Mapper接口同名的路径(用"/"代替"."),然后把XxxMapper.xml放进去。
*然后设置命名空间namespace为Mapper的全限定名。
*在Mapper接口中定义对应的方法,方法名就是sql语句的id,并保持参数类型和返回值类型一致。
*最后通过SqlSession的对象的getMapper方法获取代理实例,执行对应接口中的sql方法。
(4).输出结果集合,并关闭对应的流释放资源
------------------------------------------------------
在核心配置文件mybatis-config.xml中,有许多配置(configuration)信息
1.environments,在其中可以定义<environment>标签,配置多个数据源,其中id不同,通过指定environments的default属性来切换environment
2.dataSource
3.transactionManager
4.typeAliases,在其中定义<package>标签,name为包名,被包裹的包名不再区分大小写
配置标签时需要遵循以下顺序,否则会报错
------------------------------------------
SQL查询时可能会遇到数据库中字段名称和测试类中字段名称不同的情况,此时会导致查询的数据无法封装,可以使用resultmap标签
其中column是数据库的列名,property是测试类的属性名称,编写完成后,将sql语句的返回值类型更改为 resultMap = "XxxResultMap"即可
------------------------------------------
--------------------------------------
动态sql,根据用户不同查询需求来改变sql语句
1.多条件动态查询
2.单条件动态查询
--------------------------------------
主键返回
然后在添加后使用getID返回对应的值。
------------------------------------------------
在springboot中,mybatis已经被整合,创建springboot工程时,只需要勾选mybatis框架
然后在项目的application.properties配置文件中配置数据库连接信息即可,不用在pom文件引入mybatis依赖了
数据源配置:
1.项目创建完成后,在dao层建立mapper包并定义对应的mapper接口(注意添加@mapper注解,这样该接口在运行时会自动生成对应的实现类对象,并通过ioc控制反转,交给spring容器),然后在接口中定义对应的方法,简单的sql语句直接在方法上通过注解完成。
2.根据三层架构的模式,除了mapper层,还需要调用mapper层的service层和控制器controller层,在service层里定义对应的service接口,定义对应的抽象方法,然后在service接口的impl实现类中实现方法,来调用mapper的sql语句,然后进行数据的转换操作。
因为定义的sql语句在接口中,而又不可以直接new一个新的接口对象,但上面提到@mapper注解会在运行时自动生成实现类对象并交给spring容器,成为一个新的bean对象,所以可以通过DI依赖注入的方式完成,即在定义的接口对象前添加@Autowired注解。
一个项目中有时会有多个实现类,定义了相同类型的bean对象,但spring容器一次只能接收一个同类型的bean对象,多于一个时会报错,所以这时不能再使用@Autowired自动装配了,如图,EmpServiceA,EmpServiceB都使用@Autowired注解修饰了相同的EmpDao对象,就会爆红。
可以在想要使其生效的实现类上使用@Primary注解;
或者在controller层,使用@Qualifier在对应的service前标识bean对象名称
或者@Resource直接替换@Autowired,只要指定注入的bean对象名称即可,因为@Autowired根据bean的类型注入,而@Resource根据bean名称注入,不会出现上述问题
注意在service和dao(mapper)层中,要想使用IOC控制反转,就要使用@component注解,把他们的实现类交给容器管理,又因为controller层需要service层的bean对象、service层又需要dao层的bean对象,所以在相应的对象上再使用@Autowired等注解进行依赖注入,
也可以使用下列的注解,controller层使用@Controller,service层使用@Service,dao层使用@Repository,但后续会使用@Mapper注解代替,其中controller层默认已经使用了@Controller,原因是自带的@RestController注解就是@Controller和@ResponseBody的组合
其次,bean对象的名称默认都是实现类的名称的首字母小写;
上述的注解,要想生效,必须遵守三层架构的分层模式,否则无法被扫描到,如果软件包没有分层,还要使用注解,则解决方法是手动添加@ComponentScan注解,指定扫描的包名
-------------------------------------
lombok,是一个简化实体类的插件,可以自动生成pojo实体类的get,set,tostring,equals和hashcode方法,还可以生成无参,全参的构造方法,通过使用注解,免除了手动生成代码的步骤
使用前只要在pom文件添加lombok的依赖,然后添加对应的注解,其中@data是@getter,@setter,@tostring,@equalsandhashcode的综合