mybatis入門學習
一、背景
很久以前聽說過ibatis,後來知道ibatis改名mybatis了,之前只是簡單的接觸過mybatis,沒有使用太多,不是太瞭解。所以趁着週末看了看。
本文主要參考網站:
https://mybatis.org/mybatis-3/zh/index.html
https://www.cnblogs.com/benjieqiang/p/11183580.html
http://www.mybatis.cn/679.html
網上關於mybatis的入門文章很多,但是經過實踐,發現許多寫的都不全。有些代碼根本就只是一個示例,根本就無法執行。
寫這篇文章,一方面是記錄自己的學習,另一方面是給像我這樣的小白參考。能夠真正執行的代碼。
(文章是有目錄的,在右下角。。可能需要滾動一下屏幕纔出來)
二、mybatis簡單使用
1、引入依賴
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${mybatis.version}</version> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.0</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency>
全部依賴請查看文末的git源碼。
2、對象類
@Data //使用了lombok,自動生成get/set方法 public class User { private Long id; private String name; private Integer age; }
3、對應的數據庫表語句
CREATE TABLE `t_user` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵', `name` varchar(255) NOT NULL DEFAULT '' COMMENT '名稱', `age` int(15) unsigned NOT NULL DEFAULT 0 COMMENT '年齡', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='用戶表';
4、在resources目錄下創建Mapper
<?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"> <!--namespace:用來區別不同的類的名字 --> <mapper namespace="test"> <!-- 通過Id查詢一個用戶 --> <select id="findUserById" parameterType="Integer" resultType="com.shuimutong.learn.mybatis.domain.User"> select * from t_user where id = #{v} </select> </mapper>
5、在resources下創建mybatis連接數據庫的配置文件
1)mybatis-config.xml
<?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> <properties resource="mysql.properties"></properties> <environments default="mysql"> <environment id="mysql"> <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="mapper/UserMapper.xml"/> <mapper resource="mapper/User2Mapper.xml"/> </mappers> </configuration>
2)相同目錄下創建對應的mysql.properties
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/simple?useUnicode=ture&characterEncoding=UTF-8&serverTimezone=GMT%2B8 jdbc.username=simple jdbc.password=123456
這一步主要是想把經常變動的部分和變的部分分開,也可以選擇不要這個文件,直接寫在mybatis-config.xml中。如果直接在xml文件中,需要主要“&”的轉義,應該使用“&”(大概是這個,我是根據IDEA提示改的),不然文件會報錯。
6、代碼調用
public class UserTest { public static void main(String[] args) throws IOException { //1.讀取配置文件 InputStream in = Resources.getResourceAsStream("mybatis-config.xml"); //2.創建SqlSessionFactory工廠 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in); //3.使用工廠生產SqlSession對象 SqlSession session = sqlSessionFactory.openSession(); //4.執行Sql語句 User user = session.selectOne("test.findUserById", 2); //5. 打印結果 System.out.println(JSON.toJSONString(user)); //6.釋放資源 session.close(); in.close(); } }
小結:
代碼寫到這裏,你應該已經學會了mybatis的基本使用。
但是工作中如果用到,許多情況下會跟其他框架一起使用,比如說springboot。
三、mybatis+springboot使用
1、引入依賴
因爲我引入的依賴較多,所以請直接通過git查看,那裏最全。
2、User對象和sql
和(二)中的一樣。
3、創建User3Mapper接口
已經使用spring了,不能再通過Session工廠找方法了,要通過定義的接口去訪問。(工作中要保證少出錯,雖然代碼會一些)
package com.shuimutong.learn.mybatis.dao; import com.shuimutong.learn.mybatis.domain.User; import org.apache.ibatis.annotations.Mapper; @Mapper public interface User3Mapper { User selectUser(long id); }
4、創建User3Mapper對應的xml
<?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.shuimutong.learn.mybatis.dao.User3Mapper"> <!--java對象和數據庫中表字段的映射關係--> <resultMap id="User3Map" type="com.shuimutong.learn.mybatis.domain.User"> <id column="id" property="id" jdbcType="BIGINT"/> <result column="name" property="name" jdbcType="VARCHAR"/> <result column="age" property="age" jdbcType="INTEGER"/> </resultMap> <sql id="BaseColumn"> id, name, age </sql> <select id="selectUser" parameterType="java.lang.Long" resultMap="User3Map"> SELECT <include refid="BaseColumn" /> FROM t_user WHERE id = #{id, jdbcType=BIGINT} </select> </mapper>
5、創建application.yml
在resources目錄下創建此文件。
server: port: 8080 spring: #數據庫連接 datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/simple?useUnicode=ture&characterEncoding=UTF-8&serverTimezone=GMT%2B8 username: simple password: 123456 mybatis: type-aliases-package: com.shuimutong.learn.mybatis.domain mapperLocations: classpath:mapper/*.xml
6、創建UserService方法
前面的User3Mapper接口相當於是UserDao,User3Mapper.xml相當於UserDao的實現。
DAO層寫了,所以這裏就是service層了。
package com.shuimutong.learn.mybatis.service.impl; import com.alibaba.fastjson.JSON; import com.shuimutong.learn.mybatis.dao.User3Mapper; import com.shuimutong.learn.mybatis.domain.User; import com.shuimutong.learn.mybatis.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class UserServiceImpl implements UserService { @Autowired private User3Mapper user3Mapper; @Override public User findById(long id) { System.out.println("user3MapperIsNull?"); System.out.println(JSON.toJSONString(user3Mapper)); return user3Mapper.selectUser(id); } }
UserService代碼這裏就不貼了。
7、創建UserController
創建controller代碼,咱這可是springboot項目。
package com.shuimutong.learn.mybatis.controller; import com.shuimutong.learn.mybatis.domain.User; import com.shuimutong.learn.mybatis.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class UserController { @Autowired private UserService userService; @GetMapping("/getUser") public User getUser(long id) { return userService.findById(id); } }
8、最後是spring的啓動類MybatisApplication
package com.shuimutong.learn.mybatis; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @MapperScan("com.shuimutong.learn.mybatis.dao") //這個註解從運行結果看:加不加都行 //如果不加,只掃描和主類處於同包下的Class https://blog.csdn.net/lisheng19870305/article/details/102816358 public class MybatisApplication { public static void main(String[] args) { SpringApplication.run(MybatisApplication.class, args); } }
關於MapperScan註解,我在項目裏試了,不加也能運行。具體說明參考對應的鏈接文章。
9、啓動項目請求連接
http://localhost:8080/getUser?id=1
{"id":1,"name":"trans-634541697","age":6}
最後,git地址:https://github.com/shuimutong/spring_learn/tree/master/mybatis(項目較多,需要點開後才能clone)
祝大家生活開心、工作順利。