什么是Mybatis? Mybatis是一款优秀的持久层框架,用于简化JDBC开发。
传统JDBC开发的缺点 1 2 3 4 5 6 7 8 9 10 Class.forName("com.mysql.jdbc.Driver" ); String url="jdbc:mysql://192.168.31.5:3306/mydb?characterEncoding=utf-8" ; String user="root" ; String password="password" ; conn=DriverManager.getConnection(url, user, password); Statement statement = conn.createStatement();ResultSet rs = statement.executeQuery("select * from user" );while (rs.next()) { System.out.println(rs.getString("user_name" )); }
硬编码 => 将字符串放到代码外
操作繁琐
普通mybatis项目
创建表,添加数据
定义pojo类
成员变量对应数据库中的字段,注意类型也要。
设置getter和setter方法,养成习惯重写toString()方法。 3. 创建模块,导入坐标(maven项目)
1 2 3 4 5 6 7 8 9 10 11 <dependency > <groupId > org.mybatis</groupId > <artifactId > mybatis</artifactId > <version > x.x.x</version > </dependency > <dependency > <groupId > mysql</groupId > <artifactId > mysql-connector-java</artifactId > <version > x.x.x</version > </dependency >
配置核心配置文件mybatis-config.xml
配置文件解决了硬编码
的问题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "https://mybatis.org/dtd/mybatis-3-config.dtd" > <configuration > <environments default ="development" > <environment id ="development" > <transactionManager type ="JDBC" /> <dataSource type ="POOLED" > <property name ="driver" value ="${driver}" /> <property name ="url" value ="${url}" /> <property name ="username" value ="${username}" /> <property name ="password" value ="${password}" /> </dataSource > </environment > </environments > <mappers > <mapper resource ="org/mybatis/example/Mapper.xml" /> </mappers > </configuration >
mappers 元素则包含了一组映射器(mapper),这些映射器的 XML 映射文件包含了 SQL 代码和映射定义信息。
!!! info mapper命名规范 一般习惯为表名+Mapper.xml
。
配置Mapper,SQL映射文件
1 2 3 4 5 6 7 8 9 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace ="org.mybatis.example.Mapper" > <select id ="selectTable" resultType ="Blog" > select * from table where id = #{id} </select > </mapper >
加载核心配置文件,获取SqlSessionFactory对象
1 2 3 String resource = "org/mybatis/example/mybatis-config.xml" ;InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder ().build(inputStream);
获取SqlSession对象或Map对象,执行SQL语句,操作数据库
1 2 3 SqlSession session = sqlSessionFactory.openSession();
释放资源
增删改查
mapper中进行配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <insert id ="addCategory" parameterType ="Category" > insert into category_ ( name ) values (#{name}) </insert > <delete id ="deleteCategory" parameterType ="Category" > delete from category_ where id= #{id} </delete > <select id ="getCategory" parameterType ="_int" resultType ="Category" > select * from category_ where id= #{id} </select > <update id ="updateCategory" parameterType ="Category" > update category_ set name=#{name} where id=#{id} </update > <select id ="listCategory" resultType ="Category" > select * from category_ </select >
java代码
1 2 3 4 5 Category c = new Category ();c.setName("新增加的Category" ); session.insert("addCategory" ,c); session.commit(); session.close();
创建Maven项目,导入依赖
依赖清单
1 2 3 4 5 6 7 8 9 10 Spring核心 MyBatis核心 MySQL JDBC驱动 log4j日志 JUnit单元测试 Lombok插件 Druid数据库连接池 Spring和的MyBatis整合包 Spring和ORM框架的整合包—此依赖项会自动导入spring-orm,spring-jdbc,spring-tx三个jar包 Spring和JUnit的整合包
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 <dependencies > <dependency > <groupId > junit</groupId > <artifactId > junit</artifactId > <version > 4.12</version > <scope > test</scope > </dependency > <dependency > <groupId > org.mybatis</groupId > <artifactId > mybatis</artifactId > <version > 3.4.6</version > </dependency > <dependency > <groupId > mysql</groupId > <artifactId > mysql-connector-java</artifactId > <version > 5.1.47</version > </dependency > <dependency > <groupId > org.projectlombok</groupId > <artifactId > lombok</artifactId > <version > 1.18.12</version > <scope > provided</scope > </dependency > <dependency > <groupId > org.springframework</groupId > <artifactId > spring-context</artifactId > <version > 5.3.3</version > </dependency > <dependency > <groupId > org.springframework</groupId > <artifactId > spring-test</artifactId > <version > 5.3.3</version > <scope > test</scope > </dependency > <dependency > <groupId > org.slf4j</groupId > <artifactId > slf4j-log4j12</artifactId > <version > 1.7.25</version > </dependency > <dependency > <groupId > com.alibaba</groupId > <artifactId > druid</artifactId > <version > 1.1.10</version > </dependency > <dependency > <groupId > org.springframework</groupId > <artifactId > spring-orm</artifactId > <version > 5.3.3</version > </dependency > <dependency > <groupId > org.mybatis</groupId > <artifactId > mybatis-spring</artifactId > <version > 1.3.2</version > </dependency > </dependencies >
建表,新建pojo类包和实体类
以银行账户为例
MySQL
1 2 3 4 5 6 7 8 9 10 11 12 # 建表 DROP TABLE IF EXISTS `account`;CREATE TABLE `account` ( `id` int NOT NULL AUTO_INCREMENT, `account_name` char (32 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL , `money` int DEFAULT NULL , PRIMARY KEY (`id`,`account_name`) ) ENGINE= InnoDB AUTO_INCREMENT= 3 DEFAULT CHARSET= utf8mb4 COLLATE = utf8mb4_0900_ai_ci; # 插入数据 INSERT INTO `account` VALUES ('1' , 'lucy' , '5000' );INSERT INTO `account` VALUES ('2' , 'tom' , '5000' );
com.pojo.account
1 2 3 4 5 6 7 package com.pojo;@Data public class Account { private Integer id; private String accountName; private float money; }
配置持久层,新建mapper包和对应实体类(AccountMapper)
的Mapper接口
1 2 3 4 5 package com.mapper;public interface AccountMapper {}
新建resource资源文件夹(用于存放配置文件),新建jdbc.properties,设置数据库驱动以及连接信息
1 2 3 4 jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://192.168 .31 .5 :3306 /managerSys?serverTimezone=GMT%2B8 &useSSL=false &characterEncoding=utf-8 &allowPublicKeyRetrieval=true jdbc.username=root jdbc.password=root
新建mybatis.xml配置文件
在spring中集成
使用Spring集成Mybatis可以摒弃
mybatis.xml配置文件,也可以只设置如下内容
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd" ><configuration > <settings > <setting name ="lazyLoadingEnabled" value ="true" /> <setting name ="cacheEnabled" value ="true" /> </settings > </configuration >
默认内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd" > <configuration > <environments default ="development" > <environment id ="development" > <transactionManager type ="JDBC" /> <dataSource type ="POOLED" > <property name ="driver" value ="${jdbc.driver}" /> <property name ="url" value ="${jdbc.url}" /> <property name ="username" value ="${jdbc.username}" /> <property name ="password" value ="${jdbc.password}" /> </dataSource > </environment > </environments > <mappers > <mapper resource ="" /> </mappers > </configuration >
新建log4j .properties日志配置文件(可选)
内容为日志的输出类型和其他配置信息
1 2 3 4 5 6 7 8 9 10 log4j.rootLogger=DEBUG, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p %d %C: %m%n log4j.logger.java.sql.ResultSet=INFO log4j.logger.org.apache=INFO log4j.logger.java.sql.Connection=DEBUG log4j.logger.java.sql.Statement=DEBUG log4j.logger.java.sql.PreparedStatement=DEBUG
新建对应实体类(Account)
的映射文件mapper.xml(AccountMapper.xml)
在resources下新建包
包名和上方的mapper接口的包名要一致
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" ><mapper namespace ="com.mapper.UserMapper" > <cache size ="1024" eviction ="LRU" flushInterval ="60000" readOnly ="true" /> <select id ="findAcountList" resultType ="Account" > select * from account </select > </mapper >
在Mapper接口(AccountMapper接口)
中编写映射文件对应的方法
1 2 3 4 5 6 7 8 9 package com.mapper;import java.util.List;import com.pojo.Account;public interface AccountMapper { List<Account> findAccountList () ; }
配置spring主配置文件(applicationContext.xml或SpringConfig配置类)
applicationContext.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 <?xml version="1.0" encoding="UTF-8" ?> <beans xmlns ="http://www.springframework.org/schema/beans" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xmlns:context ="http://www.springframework.org/schema/context" xsi:schemaLocation ="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd" > <context:property-placeholder location ="classpath:jdbc.properties" /> <bean id ="dataSource" class ="com.alibaba.druid.pool.DruidDataSource" > <property name ="driverClassName" value ="${jdbc.driver}" /> <property name ="url" value ="${jdbc.url}" /> <property name ="username" value ="${jdbc.username}" /> <property name ="password" value ="${jdbc.password}" /> </bean > <bean id ="sessionFactory" class ="org.mybatis.spring.SqlSessionFactoryBean" > <property name ="dataSource" ref ="dataSource" /> <property name ="configLocation" value ="classpath:mybatis.xml" /> <property name ="typeAliasesPackage" value ="com.pojo" /> </bean > <bean class ="org.mybatis.spring.mapper.MapperScannerConfigurer" > <property name ="basePackage" value ="com.mapper" /> </bean > </beans >
测试
SpringBoot整合Mybatis
方法一
创建SpringBoot项目,勾选Mybatis Framework
和Mysql Driver
配置连接信息 application.properties或application.yml
application.yml
1 2 3 4 5 6 spring: datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/mydb username: root password: root
application.properties
定义pojo类
定义mapper的接口类和映射配置
增删改查在接口中定义的方法上实现,可以采用配置文件的形式,也可以采用注解的形式。
1 2 3 4 5 @Mapper public interface UserMapper { @Select("...") <pojo类> listAll(); }
测试
方法二,使用Mybatis Plus
创建SpringBoot项目,勾选Mysql Driver
在pom.xml中手动导入Mybatis Plus
1 2 3 4 5 6 <dependency > <groupId > com.baomidou</groupId > <artifactId > mybatis-plus-boot-starter</artifactId > <version > 3.5.2</version > </dependency >
定义pojo类
定义mapper接口类和映射配置
但是!不需要再手动写对应的方法了,直接继承BaseMapper<泛型>
(泛型为定义的pojo类)
1 2 3 4 @Mapper public interface UserMapper extends BaseMapper <User>{ }