它是一款半自动的ORM持久层框架,具有较高的SQL灵活性,支持高级映射(一对一,一对多),动态SQL,延迟加载和缓存等特性,但它的数据库无关性较低。Mybatis也是SSM中唯一一个官方有中文文档的框架。
文档地址:https://mybatis.org/mybatis-3/zh/index.html
可以简化对数据库操作的动作、简化了JDBC操作、可以灵活的操作数据库、操作事务。
Mybatis是操作数据库的框架、要使用Mybatis得先有个库才能玩起来!所以我们得先弄个存储数据的数据表!
//创建数据库 create database mybatis use mybatis //创建用户表 create table user( id int, name varchar(20), paw varchar(20) ) //插入数据 insert into user values(1,'刘德华','666666'),(2,'张学友','888888'),(3,'彭于晏','686868');
接下来是Java这边的环境搭建、创建maven项目、导入相关jar包、jar包最好用稳定的版本、一味追求高版本是在替后人找bug。
<!--mybatis包-jar --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.2</version> </dependency> <!--数据库连接驱动jar --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <!--单元测试jar --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency>
编写配置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"> <!-- 配置数据库连接环境 --> <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"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <!-- 映射配置文件,SqlMapper.xml配置文件下主要是配置对数据库的操作 --> <mappers> <mapper resource="com/ling/dao/SqlMapper.xml"/> </mappers> </configuration>
创建工具类将配置文件加载进Mybatis的SqlSessionFactoryBuilder类中构建出SqlSessionFactory,从SqlSessionFactory中获取SqlSession,SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。
public class MybatisUtils { private static SqlSessionFactory sqlSessionFactory; static { String resource = "mybatis_config.xml"; try { InputStream input = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(input); } catch (IOException e) { e.printStackTrace(); } } //开启会议、返回一个会议得以操作数据库 public static SqlSession getSession(){ return sqlSessionFactory.openSession(); } }
创建一个用户实体类对象
public class User { private Integer id; private String name; private String pw; public User() { } public User(Integer id, String name, String pw) { this.id = id; this.name = name; this.pw = pw; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPw() { return pw; } public void setPw(String pw) { this.pw = pw; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", pw='" + pw + '\'' + '}'; } }
创建dao层操作接口,先来个CRUD(增删改查)操作
public interface UserDao { //查询所有用户 public List<User> selectUser(); //添加用户 public int addUser(User user); //删除用户 public int deleteUser(int id); //修改用户 public int updateUser(User user); }
接下来就是编写刚刚的Mybatis核心配置文件中的映射文件,数据库操作配置文件,主要的操作还是在这个配置文件里,上面的接口只是媒介方便我们调用。
<?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"> <mapper namespace="com.ling.dao.UserDao"> <!-- 查询所有用户信息,返回类型resultType--> <select id="selectUser" resultType="com.ling.pojo.User"> select * from user </select> <!--添加一个用户--> <insert id="addUser" parameterType="com.ling.pojo.User" > insert into user values(#{id},#{name},#{pw}) </insert> <!--修改一个用户信息--> <update id="deleteUser" parameterType="int" > delete from user where id = #{id} </update> <!--删除一个用户--> <delete id="updateUser" parameterType="com.ling.pojo.User" > update user set name = #{name},pw = #{pw} where id = #{id} </delete> </mapper>
最后测试操作
//获取session SqlSession session = MybatisUtils.getSession(); //由session得到相对的映射 UserDao mapper = session.getMapper(UserDao.class); /* 测试查询所有用户 * */ @Test public void selectuser(){ //操作映射中对应的执行方法 List<User> users = mapper.selectUser(); for (User s:users) { System.out.println(s.toString()); } } /* 测试添加用户 * */ @Test public void adduser(){ //操作映射中对应的执行方法 User user = new User(4, "黄凯芹", "123456"); int i = mapper.addUser(user); System.out.println(i == 1? "添加成功!":"添加失败!"); //提交事务 session.commit(); //关闭内存 session.close(); } /* 测试查询所有用户 * */ @Test public void updateUser(){ //操作映射中对应的执行方法 User user = new User(3, "刘德华", "68686"); int i = mapper.updateUser(user); System.out.println(i == 1 ? "修改成功!":"修改失败!"); session.commit(); session.close(); } /* 测试查询所有用户 * */ @Test public void deleteUser(){ //操作映射中对应的执行方法 int i = mapper.deleteUser(4); System.out.println(i == 1? "删除成功!":"删除失败!"); session.commit(); session.close(); } Caused by: java.io.IOException: Could not find resource com/ling/dao/SqlMapper.xml
注意点:增、删、改操作需要提交事务!不提交事务的话操作将无法在数据库生效、程序返回的提示并不能说明已经成功修改数据库、要数据库发生改变才是。
可能出现Maven静态资源过滤问题、出错代码类似
Caused by: java.io.IOException: Could not find resource com/ling/dao/SqlMapper.xml
出现这个问题就在项目的pox文件中加入以下代码
<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>
如有错漏地方望指点!