Mybatis入门
Posted JunMain
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis入门相关的知识,希望对你有一定的参考价值。
Mybatis入门
先创建空的Maven项目
先Maven的pom.xml中添加Mybatis的依赖
<?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>org.example</groupId>
<artifactId>Mybatis</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<resources>
<resource>
<directory>scr/main/resource</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>
<filtering>true</filtering>
</resource>
</resources>
</build>
<dependencies>
<!-- mybatis的依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!-- mysql连接依赖 6以下的 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!-- Junit单元测试依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- mybatis分页依赖 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.10</version>
</dependency>
<!-- log4j日志 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
</dependencies>
<!--
原因:中文操作系统编码为GBK,MAVEN安装后默认使用系统编码GBK,导致在编译UTF-8格式的源代码文件时出现编码不匹配的问题。
-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
在src/main/resource/下面创建mybatis-config.xml配置文件
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">
<!--cofiguration核心配置文件 -->
<configuration>
<environments default="development"> <!-- 环境配置-->
<environment id="development">
<transactionManager type="JDBC"></transactionManager> <!--事务管理默认JDBC -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<!-- 如果是驱动6以上url还要加一个时区-->
<property name="url" value="jdbc:mysql://localhost:3306/mybatis? useSSL=true&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="${database.username}"/>
<property name="password" value="${database.password}"/>
</dataSource>
</environment>
</environments>
<!-- 每一个Mapper.xml文件都要在configuration核心配置文件中配置-->
<mappers>
<mapper resource="com/lzj/dao/xxxMapper.xml"></mapper>
</mappers>
</configuration>
编写Mybatis的工具类
package com.lzj.utils;
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;
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static{
try {
//获取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命令所需要的方法
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
dao接口
package com.lzj.dao;
import com.lzj.entity.User;
import java.util.List;
public interface UserDao {
//获取所有用户对象
List<User> getUserList();
}
接口实现类.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 namespace="com.lzj.dao.UserDao">
<!-- id是实现的方法名字-->
<!-- resultType返回的是一个对象全类名-->
<!--
resultType 将查询的结果返回User对象
由于是select * from user
返回的是User对象的集合
所以自动创建了一个User的 线性表
所以接口是List<User>
-->
<select id="getUserList" resultType="com.lzj.entity.User">
select * from mybatis.user
</select>
</mapper>
Junit单元测试
package com.lzj.dao;
import com.lzj.entity.User;
import com.lzj.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class UserMapperTest {
@Test
public void test(){
//1. 获取SqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
//2. 执行sql
UserDao userDao = sqlSession.getMapper(UserDao.class);
List<User> users= userDao.getUserList();
for (User user : users){
System.out.println(user);
}
//3. 关闭SqlSession
sqlSession.close();
}
}
注意点:org.apache.ibatis.binding.BindingException: Type interface com.lzj.dao.UserDao is not known to the MapperRegistry.
Mapper.xml没有在Mybatis核心配置文件中注册
/*
报错:绑定异常
org.apache.ibatis.binding.BindingException: Type interface com.lzj.dao.UserDao is not known to the MapperRegistry.
*/
<!-- 配置-->
<mappers>
<mapper resource="com/lzj/dao/UserMapper"></mapper>
</mappers>
还是报错
Could not find resource com/lzj/dao/UserMapper
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)没有找到资源路径
由于Maven约定大于配置,我们写的配置文件可能到处失败,因为默认的资源目录是在resource目录下
资源过滤问题
我们发现target下面没有UserMapper.xml文件除非自己拷贝,但是每一次自己拷贝太麻烦了
解决办法,手动导入pom.xml之中
<!-- 在build中配置resource, 防止我们导出资源失效-->
<build>
<resources>
<resource>
<directory>scr/main/resource</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>
<filtering>true</filtering>
</resource>
</resources>
</build>
但是又报错了
因为我们数据库里面有中文
在pom.xml里面加上
<!--
原因:中文操作系统编码为GBK,MAVEN安装后默认使用系统编码GBK,导致在编译UTF-8格式的源代码文件时出现编码不匹配的问题。
-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
最后结果
MyBatis如何执行sql语句
SqlSessionFactoryBuilder 获取SqlSessionFactory
SqlSessionFactory 获取SqlSession
SqlSession.getMapper(Dao.class) 获取接口的实现类
调用实现类的函数-----》执行sql
此外,每次执行SqlSession都要关闭
创建一个Mybatis程序的步骤
首先我们先创建一个空的Maven项目 1.先配置pom.xml文件 注意事项: (1)先导入Mybatis的依赖 (2)<build>标签进行resources的配置将java路径下的配置文件相当于放到resources目录下 (3) <properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> 解决中文乱码编译不通过的报错 2. 配置Mybatis-config.xml配置文件 注意事项: (1) configuration核心配置文件联建数据库 (2) <mappers><mapper resource="com/lzj/dao/xxxMapper.xml"></mapper></mappers> 将xxxMapper.xml再核心配置文件中注册绑定,相当于告诉系统xxxMapper.xml是xxx接口的实现类 后期系统自动创建 3. 获取SqlSession 自己写一个工具列MyBatis获取SqlSession SqlSessionFactoryBuilder->SqlSessionFactory->SqlSession 4. 编写DAO接口 5. 编写实现类 xxxMapper.xml 注意事项: (1) <mapper namespace = "com.lzj.dao.xxxDAO"> 绑定接口 (2) 各个查询标签的id对应着接口中的方法 6. 如何执行sql语句 先调用Mybatis获取SqlSession实现对象 sqlSession.getMapper(xxxDAO.class)获取接口的实现类 调用实现类的的函数,------>调用sql语句
增删改查
1.namespace的绑定的包名,要和接口的包名一致
2.select 选择查询
-
id: 对应namespace的方法名
-
resultType: 返回值得类型
-
parameterType: 传递参数的类型
举例 通过id查询user //只要该三个地方, 接口, Mapper添加一个标签, 测试了获取Sqlsession //测试类 @Test public void test01(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserDao userDao = sqlSession.getMapper(UserDao.class); User user = userDao.getUserById(688); System.out.println(user); sqlSession.close(); } //接口 public interface UserDao { //获取所有用户对象 List<User> getUserList(); //通过id获取对象 User getUserById(int id); } //Mapper.xml添加标签 <select id="getUserById" resultType="com.lzj.entity.User" parameterType="int"> select * from user where id = #{id} </select>
3.insert 插入操作
注意增删改都需要提交事物才能执行 sqlSession.commit()
测试类
@Test public void testAddUser(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserDao userDao = sqlSession.getMapper(UserDao.class); userDao.addUser(new User("沙冕","899","20010118")); sqlSession.commit(); sqlSession.close(); }
接口类
package com.lzj.dao; import com.lzj.entity.User; import java.util.List; public interface UserDao { //获取所有用户对象 List<User> getUserList(); //通过id获取对象 User getUserById(int id); //插入一个对象 void addUser(User user); }
接口Mapper.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 namespace="com.lzj.dao.UserDao"> <!-- id是实现的方法名字--> <!-- resultType返回的是一个对象全类名--> <select id="getUserList" resultType="com.lzj.entity.User"> select * from user </select> <select id="getUserById" resultType="com.lzj.entity.User" parameterType="int"> select * from user where id = #{id} </select> <insert id="addUser" parameterType="com.lzj.entity.User" > insert into
以上是关于Mybatis入门的主要内容,如果未能解决你的问题,请参考以下文章
markdown [mybatis参考]关于mybatis #mybatis的一些片段