在IDEA中使用mybatis进行开发(包括Mapper代理)
本篇是个人观看视频学习后的总结,方便今后重新学习配置,所以十分冗长
1.创建项目,导入mybatis坐标
首先要在idea中配置好maven,然后创建maven项目。在pom.xml中配置依赖,包括mybatis,mysql,junit单元测试,日志等。请看图:
<dependencies>
<!--添加mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<!--junit 单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
<!--添加slf4j日志api-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.20</version>
</dependency>
<!--添加logback-classic依赖-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<!--添加logback-core依赖-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
</dependencies>
可以复制一份以后都能使用。
注意logback需要配置文件,
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--
CONSOLE :表示当前的日志信息是可以输出到控制台的。
-->
<appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>[%level] %blue(%d{HH:mm:ss.SSS}) %cyan([%thread]) %boldGreen(%logger{15}) - %msg %n</pattern>
</encoder>
</appender>
<!--包名-->
<logger name="com.test" level="DEBUG" additivity="false">
<appender-ref ref="Console"/>
</logger>
<root level="DEBUG">
<appender-ref ref="Console"/>
</root>
</configuration>
命名为logback.xml放入resources内就行了。
2.编写mybatis配置文件,
配置文件是用来替代数据库连接信息的。
<?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="com.mysql.jdbc.Driver"/>
<property name="url" value="自己的路径"/>
<property name="username" value="数据库用户名"/>
<property name="password" value="数据库密码"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--加载sql映射文件(xxx.xml),这边可以先看第三点编写sql映射文件后再写-->
<mapper resource="UsersMapper.xml"/>
</mappers>
</configuration>
取名mybatis-config.xml同样放入resources内。
3.编写SQL的映射文件
根据用途取名为xxxMapper.xml,比如我执行SQL是为了查询用户表的,那就可以叫UserMapper.xml方便查找。(最后同样是放入resources内)
<?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="自己取"><!--今后执行sql语句是通过namespace.id查找对应sql的-->
<!--在这里定义自己的SQL语句,id是对应语句的唯一标识,resultType是语句执行后的返回值类型-->
<select id="自己取" resultType="根据自己情况(类的路径)">
select * from tb_user;
</select>
</mapper>
这边的sql映射文件写完后就能在mybatis配置文件里面加载了
4.配置完成后正式写代码
//1.加载mybatis的核心配置文件,获取SqlSessionFactory,要抛出异常
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2.获取SqlSession对象,用它执行sql
SqlSession sqlSession = sqlSessionFactory.openSession();
//3.执行sql
//传入的test.selectAll就是自己在sql映射文件中写的namespace.id
//List<User> users则是我的返回类型,根据自己的sql作用设计
List<User> users = sqlSession.selectList("test.selectAll");
System.out.println(users);
5.使用Mapper代理开发
看上图,如果每次执行sql都要传入 namespace.id,那代码的灵活性就降低了,而且每次都要去查找我要执行的sql语句的id是什么,很麻烦。
所以就有了Mapper开发。
1.首先写一个mapper接口,要求该接口要和对应的.xml映射文件在同一个目录下。但在maven规格下.xml文件和代码都是分开的,所以采取另一种方法。
看图,我们的接口在com.test.mapper包下,所以只要在resource中new一个Directory,然后将sql映射文件放入,注意命名为com/test/mapper,这个很重要,虽然在idea中用/和.隔开后显示的包名一样,但编译后,以/隔开命名的会生成分层的文件夹,如下图
如果命名的时候用 . 隔开,只会生成一个叫com.test.mapper的文件夹。
按照以上方法,接口和对应的.xml映射文件经编译后就在同一个目录下了。
2.修改对应.xml映射文件命名空间的值
<!--
namespace:名称空间
要将namespace的值改成接口的路径
-->
<mapper namespace="com.test.mapper.UserMapper">
<select id="selectAll" resultType="com.test.pojo.User">
select * from tb_user;
</select>
</mapper>
这样的意义是什么呢?也就是我们的UserMapper接口会有一个方法叫做selectAll(就是配置文件中的id),它的返回值就是com.test.pojo包下的User类,当然,因为该sql是为了查表中所有的数据,所以在接口中它的返回值应该写成List< User> 。
由于我们在resources里面加了com.test.mapper包,所以mybatis-config.xml下加载映射文件的配置也要改(就是改UserMapper.xml的路径)
<mappers>
<!--加载sql映射文件(xxx.xml)-->
<mapper resource="com/test/mapper/UserMapper.xml"/>
</mappers>
</configuration>
3.正式编程
//3.执行sql,前面两步都是加载配置获取对象都一样就不再重复
//List<User> users = sqlSession.selectList("test.selectAll");
//获取UserMapper接口的代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> users = userMapper.selectAll();
System.out.println(users);
有些人可能觉得mapper代理也很繁琐,没有感受到它的好处,其实这样写我今后就可以直接面向接口去开发,而不用像之前还要去找到对应的sql的命名空间和id,只要文件配置好了,我们就只需把注意力集中到接口去就行了。
还有,在mybatis-config.xml文件下还要加载sql映射文件,我们今后只要如下图操作
将加载映射文件改成package name使用包扫描,直接将resources下的包导入,以后不管再增加什么sql映射文件,我们都不需要再次手动导入
此外,idea中还有MyBatisX插件供我们使用,在接口中定义方法,还能通过alt+enter在.xml文件中帮你定义,通过鸟的图标快速在接口和映射文件中转换。这边就不再细说了。
本篇是个人观看视频学习后的总结,方便今后重新学习配置