1.Mybatis基于Maven项目QuickStart
- Mybatis是一个优秀的基于java的持久层框架,它内部封装了jdbc,是开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程
- Mybatis通过xml或注解的方式将要执行的各种statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句
- 最后mybatis框架执行sql并将结果映射为java对象并返回。采用ORM思想解决了实体和数据库映射的问题,对jdbc进行了封装,屏蔽了jdbc api底层访问细节,使我们不用与jdbc api打交道,就可以完成对数据库的持久化操作
1.1.MyBatis构建开发步骤
一般基于Maven项目来构建MyBatis的项目环境主要有以下几个步骤:
①创建IDEA Maven项目,添加pom.xml中MyBatis依赖坐标;
②创建数据库表,本例以user表单为例;
③编写Domain实体类,本例以User实体类为例;
④编写数据库实体映射文件UserMapper.xml;
⑤编写核心文件mybatis-config.xml;
⑥编写测试类测试CRUD操作
1.2.MyBatis基于Maven项目环境搭建
①首先在创建新项目时直接选择创建Maven项目,不勾选“Create from archetype”;
②引入MyBatis及相关坐标依赖pom配置如下:
pom.xml文件配置:
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.32</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.1</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.16</version> </dependency>
③创建实体类与数据库表;
user表:
User实体类(省略get/set及toString()):
public class User { private int id; private String username; private String password; }
④编写对应domain下的XxxMapper.xml文件、MyBatis核心配置文件mybatis-config.xml:
UserMapper.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"> <!--namespace表示当前mapper的唯一标识:一般使用domain的全路径名+Mapper来命名--> <mapper namespace="com.fengye.domain.UserMapper"> <!--id:方法表示,一般配置对应的方法; resultType:表示该方法有返回,返回需要封装到对应实体的类型--> <select id="findAll" resultType="com.fengye.domain.User"> select * from user </select> </mapper>
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> <!-- 引入jdbc.properties配置文件 --> <properties resource="jdbc.properties"></properties> <!--MyBatis数据源环境配置--> <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> <!--加载Mapper.xml映射文件配置--> <mappers> <!--注意在IDEA构建Maven项目中有些特殊:resource属性不能配置成:com/fengye/mapper/UserMapper.xml--> <mapper resource="com.fengye.mapper/UserMapper.xml"/> </mappers> </configuration>
⑤抽取出jdbc.properties配置文件:
jdbc.properties:
driver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/mybatisreview_0216
username = root
password = admin
完成上述步骤后一个最简单的MyBatis的Maven项目环境就搭建好了,项目构建如下图所示:
1.3.构建测试类测试环境
完成上述操作之后,我们编写了一个findAll进行数据库的查询,下面我们可以编写一个Junit语句来执行数据库查询操作:
查询项目构建如下图所示:
具体测试类如下:
public class MyBatisQuickTest { /** * MyBatis环境搭建测试:测试查询语句 * @throws IOException */ @Test public void test1() throws IOException { //加载核心配置文件 InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); //获得sqlSession工厂对象 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //获得sqlSession对象 SqlSession sqlSession = sqlSessionFactory.openSession(); //执行sql语句 List<User> users = sqlSession.selectList("com.fengye.domain.UserMapper.findAll"); //打印结果 System.out.println(users); //释放资源 sqlSession.close(); } }
在实际过程中要注意一个问题,UserMapper.xml文件是放在resources资源文件夹下,在mybtais-config.xml中引入这个Mapper文件时一定要右键选择”Copy Relative Path”的路径进行配置:
如果使用resource=”com/fengye/mapper/UserMapper.xml”,有时会因为IDEA中Maven项目构建出现找不到XxxMapper.xml文件错误:
正确配置如下:
<!--加载Mapper.xml映射文件配置--> <mappers> <!--注意在IDEA构建Maven项目中有些特殊:resource属性不能配置成:com/fengye/mapper/UserMapper.xml--> <mapper resource="com.fengye.mapper/UserMapper.xml"/> </mappers>
运行测试后查询数据库打印输出数据如下:
此外,上述问题还有另外一种情况是XxxMapper.xml文件放在src/java目录的子目录之下,造成项目编译运行后在target文件包中未被编译,此时需要在pom.xml中添加如下配置即可:
<build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> </resources> </build>
问题定位参考博客原文:https://blog.csdn.net/weixin_42323802/article/details/83717814
1.4.MyBatis执行简单CRUD操作
之前在构建Maven项目环境时已经执行了全表查询的配置操作,下面进行简单地增删改及查询一条数据操作:
增删改查映射配置与API:
对应在UserMapper.xml与查询代码中做如下配置操作:
查询一条数据:
Mapper.xml
<!--id:方法表示,一般配置对应的方法; resultType:表示该方法有返回,返回需要封装到对应实体的类型--> <select id="findAll" resultType="com.fengye.domain.User"> select * from user </select>
//执行sql语句 User user = sqlSession.selectOne("com.fengye.domain.UserMapper.findOneById", 2);
添加一条数据:
Mapper.xml
<insert id="insert" parameterType="com.fengye.domain.User"> insert into user values (#{id}, #{username}, #{password}) </insert>
//执行sql语句 User user = new User(); user.setId(6); user.setUsername("lily"); user.setPassword("7652"); //命令空间namespace+id,参数传递要插入的User int insertId = sqlSession.insert("com.fengye.domain.UserMapper.insert", user); //增删改需要提交事务 sqlSession.commit();
修改一条数据:
Mapper.xml
<update id="update" parameterType="com.fengye.domain.User"> <!--注意多个修改参数之间使用","隔开,而不是用and隔开--> update user set username = #{username} , password = #{password} where id = #{id} </update>
//执行sql语句 User user = new User(); user.setId(6); user.setUsername("mike"); user.setPassword("1110"); int updateId = sqlSession.update("com.fengye.domain.UserMapper.update", user); //增删改需要提交事务 sqlSession.commit();
删除一条数据:
Mapper.xml
<delete id="deleteById" parameterType="java.lang.Integer"> delete from user where id = #{id} </delete>
//执行sql语句 int deleteId = sqlSession.delete("com.fengye.domain.UserMapper.deleteById", 6); //增删改需要提交事务 sqlSession.commit();
参考文档:
MyBtais 3.0中文官方文档:
https://mybatis.org/mybatis-3/zh/index.html
本博客中项目示例代码均已上传至github:
https://github.com/devyf/MyBatisReview/tree/master/fengye_mybatis_quickstart