第一个mybatis程序 mybatis CRUD
mybatis网址:https://mybatis.org/mybatis-3/zh/getting-started.html
mybatis在GitHub上面的源码地址:https://github.com/mybatis/mybatis-3/releases/tag/mybatis-3.5.6
maven仓库:https://mvnrepository.com/artifact/org.mybatis/mybatis/3.5.2
1.2 什么是持久层?
1.2.1数据持久化
-
持久化就是将程序的数据支持就状态和瞬时状态转化的过程
-
内存:断电即失
-
数据库(jdbc),io文件持久化
-
生活列子:冷藏(解冻),
为什么需要持久化?
-
完成持久化工作的代码块
-
层是界限十分明显
1.2.3为什么需要mybatis
思路:搭建环境-》导入mybatis-》编写代码-》测试!
2.1 搭建环境
搭建数据库
2.2新建项目
1.新建一个普通的maven项目
2.删除src目录
3.导入项目依赖
<?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-study</artifactId>
<version>1.0-SNAPSHOT</version>
<!--导入依赖-->
<dependencies>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
2.2创建一个模块
- 编写mybatis的核心配置文件
<!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?useSSL=false&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
</configuration>
package com.liang.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;
//工具类 sqlSessionFactory --》sqlsession 工厂模式
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;//提升作用域
static {
try {
//使用mybatis第一步 通过mybatis获取sqlsessionfactory对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}catch (IOException e){
e.printStackTrace();
}
}
//既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例
//SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。
public static SqlSession getSqlSession(){
// SqlSession sqlSession = sqlSessionFactory .openSession();
// return sqlSession; 进行优化,看起来太繁杂
return sqlSessionFactory.openSession();
}
}
可以代码已经可以连接上数据库了
2.3 编写代码
-
实体类
package com.liang.pojo; public class User { private int id; private String name; private String pwd; public int getId() { return id; } public String getName() { return name; } public String getPwd() { return pwd; } public User(int id, String name, String pwd) { this.id = id; this.name = name; this.pwd = pwd; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", pwd='" + pwd + '\'' + '}'; } public void setId(int id) { this.id = id; } public void setName(String name) { this.name = name; } public void setPwd(String pwd) { this.pwd = pwd; } }
-
Dao接口
public interface UserDao { List<User> getUserList(); }
-
接口实现类 由原来的jdbc中的userdaoimpl转变为一个mapper的配置文件。
<?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.liang.dao.UserDao"> <!--select这是一个查询语句--> <select id="getUserList" resultType="com.liang.pojo.User" > /*返回的结果,一定要写它的路径*/ select * from mybatis.user </select> </mapper>
2.4 测试
注意:绑定异常
org.apache.ibatis.binding.BindingException: Type interface com.liang.dao.UserDao is not known to the MapperRegistry.
在maven中约定大于配置,我们之后遇到我们写的配置文件,无法被导出或者生效的问题
当加载无法包,可能出现问题说明:Maven静态资源过滤问题
在依赖中直接导入更新,即可代入包
<!--在build中配置resoures,来防止我们导出失败的问题-->
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
3.CRUD
1.namespace:命名空间
namespace中的包名要和dao/mapper接口中的包名一致!
2.select
-
编写接口
//根据id查询 User getUserById(int id);
-
编写对应得mapper中的sql
<select id="getUserById" parameterType="int" resultType="com.liang.pojo.User"> select * from user where id=#{id}; </select>
-
测试
@Test public void getUserById(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = mapper.getUserById(1); System.out.println(user); sqlSession.close(); }
选择,查询语句
-
id:就是对应namespace中的方法名
-
resultType:sql执行的返回值 !
-
parameterType:参数类型
3.insert
<!--对象中的属性,可以直接取出来--> <insert id="addUser" parameterType="com.liang.pojo.User"> insert into user (id,name,pwd) values (#{id},#{name },#{pwd}); </insert>
4.update
<update id="updateUser" parameterType="com.liang.pojo.User"> update user set name=#{name},pwd=#{pwd} where id=#{id}; </update>
5.delete
<delete id="deleteUser" parameterType="com.liang.pojo.User" > delete from user where id=#{id}; </delete>
注意点:增删改需要提交事务!
sqlSession.commit();//提交事务## 标题