二、第一个Mybatis程序
思路:搭建环境–>导入Mybatis–>编写代码–>测试
1. 搭建环境
1.1搭建数据库
CREATE database `mybatis`; use `mybatis`; create table `user`( `id` int(20) not null primary key, `name` varchar(30) default null, `pwd` varchar(30) default null )engine=innodb default charset=utf8; insert into `user`(`id`, `name`, `pwd`) values(1,'hxl', '123456'),(2,'laoer', '123456'),(3,'laosan', '123456')
1.2 新建项目
1.2.1 新建一个普通的maven项目
这个之前有发过博客,所以这里就不赘述了,如果不知道请点击传送门❤️“一篇文章教你解决maven”从环境到应用–非常值得阅读❤️
1.2.2 删除src目录,将我们这个作为父工程
1.2.3 导入maven依赖
一般我们都会设置自动导入,但是新版2020.X的IDEA没有这个,所以我们写完文件后点击右上方的该图案
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!--父工程--> <groupId>com.hxl</groupId> <artifactId>Mybatis-Study</artifactId> <version>1.0-SNAPSHOT</version> <!--导入依赖--> <dependencies> <!--mysql驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.26</version> </dependency> <!--mybatis--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.7</version> </dependency> <!--junit--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies> </project>
2. 新建一个module
我们创建一个名字为mybatis-01的module,使用普通的maven创建,注意是在Mybatis项目中创建module。这样的好处是我们不需要每次都需要导入mybatis等包了。
2.1 编写mybatis的核心配置文件
我们连接一下数据库。这个地方我也发过,如果连接的时候出现时区问题,我们需要去设置一下时区,设置成GMT(可以直接点击set,去修改即可),然后连接即可。
在这个地方我们可以找到下面配置需要的url。
然后我们需要在src->main->resources->添加一个mybatis-config.xml然后添加下面的东西。
注意里面的vlaue要改成和自己相关的,不要照抄,
<?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="jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=UTF-8"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <!--每一个Mapper.xml都需要在Mybatis核心配置文件中注册--> <mappers> <mapper resource="com/hxl/dao/UserMapper.xml"/> </mappers> </configuration>
2.2 编写mybatis的工具类
import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.InputStream; //sqlSessionFactory -->用来构建sqlSession public class MybatisUtils { private static SqlSessionFactory sqlSessionFactory; static{ try { //使用mybatis第一步这是获取sqlSessionFactory对象 String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } //既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。 //SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。 public static SqlSession getSqlSession() { return sqlSessionFactory.openSession(); } }
3. 编写代码
3.1 实体类
public class User { private int id; private String name; private String pwd; public User() { } public User(int id, String name, String pwd) { this.id = id; this.name = name; this.pwd = pwd; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", pwd='" + pwd + '\'' + '}'; } }
3.2 Dao接口
List<User> getUserList();
3.3 接口实现类
由原来的UserDaoImpl装换为Mapper配置文件
这里的mybatis.user是因为idea中连接了数据库,如果没连直接写表名
在dao下创建一个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=绑定一个对应的Dao/Mapper接口--> <mapper namespace="com.hxl.dao.UserDao"> <!--select查询语句--> <!--这里的id对应的方法名, resultType=结果,返回地类型要写全--> <select id="getUserList" resultType="com.hxl.pojo.User"> select * from mybatis.user </select> </mapper>
4. 测试
成功结果:
最好在test下创建一个和dao相同的目录进行测试
public class UserDaoTest { @Test public void test(){ //获得SqlSession对象 SqlSession sqlSession = MybatisUtils.getSqlSession(); //我们获得到对象,要拿到sql要么去dao拿要么去mapper中拿,但其实都一样 //下面我们通过mapper获取到他的类,然后接口就可以用了,返回接口类型 //方式1:getMapper 执行sql UserDao userDao = sqlSession.getMapper(UserDao.class); List<User> userList = userDao.getUserList(); //方式2:直接通过里面的select,根据返回值的来进行。不推荐使用 //List<User> userList = sqlSession.selectList("com.hxl.dao.UserDao.getUserList"); for (User user : userList) { System.out.println(user); } //关闭SQLSession sqlSession.close(); } }
官方推荐的测试要包在try catch中
public class UserDaoTest { @Test public void test(){ //获得SqlSession对象 SqlSession sqlSession = MybatisUtils.getSqlSession(); try{ //我们获得到对象,要拿到sql要么去dao拿要么去mapper中拿,但其实都一样 //下面我们get到他的接口,返回接口类型 //方式1:getMapper 执行sql UserDao userDao = sqlSession.getMapper(UserDao.class); List<User> userList = userDao.getUserList(); //方式2:直接通过里面的select,根据返回值的来进行。不推荐使用 //<User> userList = sqlSession.selectList("com.hxl.dao.UserDao.getUserList"); for (User user : userList) { System.out.println(user); } }finally { //关闭SQLSession sqlSession.close(); } } }
注意点:
问题1:Type interface com.hxl.dao.UserDao is not known to the MapperRegistry.
在Mybatis-config核心配置文件中需要进行下面的注册
<!--每一个Mapper.xml都需要在Mybatis核心配置文件中注册--> <mappers> <mapper resource="com/hxl/dao/UserMapper.xml"/> </mappers>
问题2:### The error may exist in com/hxl/dao/UserMapper.xml。找不到这个资源
maven约定大于配置,我们写出的配置文件无法被导出或生效
在pom.xml中添加。添加之后刷新一下maven
<build> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>true</filtering> </resource> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> </resource> </resources> </build>
问题3:绑定接口错误
问题4:方法名不对
问题5:返回类型不对
5. 将Dao改成Mapper
我们之前是UserDao,然后我们将其修改成UserMapper。同时我们还需要将UserMapper.xml以及Test中的相关代码修改。






