1.第一个Mybatis程序
mybatis文档连接https://mybatis.org/mybatis-3/zh/getting-started.html
创建第一个mybatis程序
第一步:创建(maven)项目 删除src 创建模块 (mybatis_01)
maven工程:maven_java_study
- 父项目中的pom.xml文件中配置以下信息
<?xml version="1.0" encoding="utf8"?>
<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>maven_java_study</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>mybatis_01</module>
</modules>
<!-- 导入依赖 -->
<dependencies>
<!-- mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<!-- 导入mybatis驱动-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<!-- 导入juint驱动-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
<!--在build中配置resources,防止资源导出失败-->
<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>
<filtering>true</filtering>
</resource>
</resources>
</build>
</project>
第二步:编写main–>resources中mybatis核心配置信息(一般resources目录下的mybatis核心配置文件名为:" mybatis-config-xml ")
<?xml version="1.0" encoding="utf8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--configuration 核心配置文件-->
<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?useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="001129"/>
</dataSource>
</environment>
</environments>
<!--每一个Mapper.xml配置文件都需要在mybatis核心配置文件中注册!-->
<mappers>
<mapper resource="com/dao/UserMapper.xml"/>
</mappers>
</configuration>
第三步: 在java目录下创建一个utils工具类
package com.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;
/**
* @author shkstart
* @create 2020-04-08 11:00
*/
public class MybatisUtils {
//通过sqlSessionFactory 拿到 sqlSession
//使用mybatis第一步 获取sqlSessionFactory对象
private static SqlSessionFactory sqlSessionfactory;
static {
try{
//获取核心配置文件路径
String resource = "mybatis-config.xml";
//将核心配置文件以流的形式输出
//Resources 是mybatis下的工具类
InputStream inputStream = Resources.getResourceAsStream(resource);
//通过sqlSessionFactoryBuilder 获取 sqlSessionFactroy
sqlSessionfactory = new SqlSessionFactoryBuilder().build(inputStream);
}catch(IOException e){
e.printStackTrace();
}
}
//顾名思义 既然获取到了sqlSessionFactory 接下来纪要通过sqlSessionFactory获取sqlSession对象实例
//SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。
//你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。例如:
public static SqlSession getSqlSession(){
SqlSession sqlSession = sqlSessionfactory.openSession();
return sqlSession;
}
}
第四步: 创建pojo包,编写用于和数据库进行关系映射的实体类(book类=book表 新手将字段名和属性名一 一对应)
tring password) {
this.password = password;
}
public Integer getId() {
return id;
}
public String getName() {
return name;
}
public String getPassword() {
return password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", password='" + password + '\'' +
'}';
}
}
表信息如下:
第五步: 创建dao包 -->创建user对应的dao接口(DAO == Mapper)
package com.dao;
import com.pojo.User;
import java.util.List;
/**
* @author shkstart
* @create 2020-04-08 11:20
*
* DAO接口 定义规则
*/
public interface UserDao {
List<User> getUserList();
}
第六步: 在dao包下创建userDao对应的userMapper.xml配置文件(以前的userDaoImpl 实现类 现改为userMapper.xml配置文件)
<?xml version="1.0" encoding="utf8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace命名空间 ===> 绑定一个对应的DAO/Mapper接口 -->
<mapper namespace="com.dao.UserDao">
<!--select ===> 查询语句 id ===> 对应方法名 resultType ===> 返回的结果集-->
<select id="getUserList" resultType="com.pojo.User">
select * from mybatis.user
</select>
</mapper>
第七步: 编写测试类Junit 在test–>java包下创建 userDaorTest
package com.dao;
import com.pojo.User;
import com.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
/**
* @author shkstart
* @create 2020-04-08 11:37
*/
public class UserDaoTest {
private SqlSession sqlSession ;
@Test
public void test() {
try{
//获取sqlSession对象
sqlSession = MybatisUtils.getSqlSession();
//获取UserDao
UserDao userDao = sqlSession.getMapper(UserDao.class);
List<User> list = userDao.getUserList();
for (User user : list) {
System.out.println(user);
}
}catch(Exception e){
e.printStackTrace();
}finally{
sqlSession.close();
}
//org.apache.ibatis.binding.BindingException:
// Type interface com.dao.UserDao is not known to the MapperRegistry
//此错误 Mapper.xml文件没有在mybatis核心配置文件中注册
}
}
常见错误:
1. org.apache.ibatis.binding.BindingException: Type interface com.it.Dao.UserMapper is not known to the MapperRegistry.
此错误是因为userMapper.xml文件没有在mybatis核心配置文件中注册
具体配置在第二步 -----每一个mapper.xml配置文件都需要在mybatis核心配置文件中注册(很常见)
2. The error may exist in org/mybatis/example/BlogMapper.xml
Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration.
Cause: java.io.IOException: Could not find resource org/mybatis/example/BlogMapper.xml
此错误是因为maven项目中可能存在资源导出失败的问题,我们可以配置以下内容到mybatis核心配置文件 和 父项目的pom.xml配置文件中
<!--在build中配置resources,防止资源导出失败-->
<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>
<filtering>true</filtering>
</resource>
</resources>
</build>
3. 一般这种错误会显示------ 1字节的UTF-8序列的字节1 无效
这种错误我们只需要将mybatis核心配置文件中<?xml version="1.0" encoding="UTF-8" ?> 的 encoding=‘UTF-8’ 改写成为 encoding="utf8"即可
2.Mybatis的CRUD操作
模块mybatis_01
1.namespace
- namespace中的包名要和 Dao/Mapper 接口的包名一致↓
2. select
- 选择、查询
- id : 对应namespace中接口的方法名
- resultType : 对应方法返回值类型(返回的结果集)
- parameterType : 对应的参数值
因为数据库映射类(pojo) 和 工具类(utils) 和 mybatis核心配置文件(resources–>mybatis-config.xml) 已将创建好 无需修改
我们只需要修改接口类 和 接口实现.xml 配置文件就好
操作实例:
- 带参数操作select
接口中定义的方法(UserMapper)
//根据id查询用户
User getUserById(Integer id);
接口实现.xml --->UserMapper.xml配置文件中配置信息
id=要操作的方法名(接口中)
resultType=返回值类型(如果是对象需要写“全类名”)
parameterType=参数值类型(如果是对象需要写“全类名”)
<select id="getUserById" parameterType="Integer" resultType="com.pojo.User">
<!--这里用 #{
参数} 来获取参数 和以往jdbc方式不同-->
select * from mybatis.user where `id` = #{
id};
</select>
- 测试
·····可以注意一下代码改变程度,只有中间改变 获取sqlSession 对象\获取UserMapper接口/关闭sqlSession并没有改变
@Test
public void getUserById(){
try{
//1.获取sqlSession对象实例
sqlSession = MybatisUtils.getSqlSession();
//2.通过sqlSession.getMapper 获取到userMapper
//下面的操作相当于userMapper userMapper = new userMapperImpl();
UserMapper usermapper = sqlSession.getMapper(UserMapper.class);
//3.执行userMapper的方法
User user = usermapper.getUserById(2);
System.out.println(user);
}catch(Exception e){
e.printStackTrace();
}finally{
sqlSession.close();
}
}
3.insert
- 插入数据
- id : 对应namespace中接口的方法名
- parameterType : 对应的参数值
操作实例:
接口中定义的方法
//插入一个用户
int addUser(User user);
接口实现.xml配置文件
<!--对象中的属性可以直接取出来作为参数-->
<!-- insert ===> 插入数据操作-->
<insert id="addUser" parameterType="com.pojo.User" >
insert into mybatis.user(`id`,`name`,`password`)values(#{
id},#{
name},#{
password});
</insert>
测试
这里要值得注意的是 “增删改” 三种操作需要提交数据库事务!
// “增删改”需要提交事务
@Test
public void testAddUser(){
try{
sqlSession = MybatisUtils.getSqlSession();
UserMapper usermapper = sqlSession.getMapper(UserMapper.class);
int count = usermapper.addUser(new User(4,"黄继光","000000"));
System.out.println(count);
sqlSession.commit();
}catch(Exception e){
e.printStackTrace();
}finally{
sqlSession.close();
}
}
4.update
-
更改数据
-
id : 对应namespace中接口的方法名
-
parameterType : 对应的参数值
操作实例:
接口中定义的方法
//修改用户:
int updateUser(User user);
接口实现.xml配置文件
<!--update ====> 更改数据操作-->
<update id="updateUser" parameterType="com.pojo.User" >
update mybatis.user set `name` = #{
name} ,`password` = #{
password} where `id`