最近玩的有点厉害,需要检讨一下自己了。MyBatis的学习开始了,本篇文章介绍使用MyBatis完成一个基本表的CRUD操作。先来陈述一下开发步骤:搭建好开发环境后,接下来的步骤就是固定的了。我大致的总结了一下如下:
MyBatis开发指南
第一步创建核心配置文件
第二步创建数据库表对应的实体类
第三步创建Mapper配置文件,再加入核心配置文件
第四步加载核心配置文件,创建SqlSessionFactory,使用工厂产生SqlSession
第五步使用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>
<!-- 这里使用开发模式,其他的模式如work模式 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
<property name="" value="" />
</transactionManager>
<!-- 不使用连接池 -->
<dataSource type="UNPOOLED">
<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>
</configuration>
然后是实体类:
package edu.ctgu.mybatis.entity;
public class User {
private int id;
private String name;
private int age;
public User(){
}
public User(String name, int age) {
this.name = name;
this.age = age;
}
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 int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
接下来是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">
<mapper namespace="userMapper">
<select id="getUser" parameterType="int" resultType="edu.ctgu.mybatis.entity.User">
<!-- #{}是OGNL表达式 -->
SELECT * FROM user WHERE id = #{id}
</select>
</mapper>
Mapper配置文件搞好了,然后在核心配置文件中将其包含进去,需要在核心配置文件中增加如下:
<mappers>
<mapper resource="edu/ctgu/mybatis/config/UserMapper.xml" />
</mappers>
一个简单的main函数:
// 测试一,测试mybatis是否可用
public class Main {
public static void main(String[] args) {
String resource = "edu/ctgu/mybatis/config/Configuration.xml";
// 使用类加载器来读取文件
InputStream is = Test.class.getClassLoader().getResourceAsStream(resource);
// 或者这样:读取配置文件获取到数据库的连接信息
// Reader reader = Resources.getResourceAsReader(resource);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
SqlSession session = factory.openSession();
// 在UserMappers没有指定name space的话,就可以直接写id名称getUser
String statement = "userMapper.getUser";
User user = session.selectOne(statement , 2);
System.out.println(user);
}
}
好了,上面就是一个完整的开发步骤了,我们顺便将CRUD四个操作都过一遍,先需要给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">
<mapper namespace="userMapper">
<select id="getUser" parameterType="int" resultType="edu.ctgu.mybatis.entity.User">
<!-- #{}是OGNL表达式 -->
SELECT * FROM user WHERE id = #{id}
</select>
<update id="updateUser" parameterType="edu.ctgu.mybatis.entity.User">
UPDATE user SET name = #{name},age = #{age} WHERE id = #{id}
</update>
<insert id="addUser" parameterType="edu.ctgu.mybatis.entity.User">
INSERT INTO user(name,age) VALUES(#{name},#{age})
</insert>
<delete id="deleteUser" parameterType="int">
DELETE FROM user WHERE id = #{id}
</delete>
<select id="getAllUsers" resultType="edu.ctgu.mybatis.entity.User">
SELECT * FROM user
</select>
</mapper>
为了开发的方便,我们将生成SqlSession的工作放在一个Util类中完成:
public class MapperUtils {
public static SqlSession getSqlSession(){
String resource = "edu/ctgu/mybatis/config/Configuration.xml";
// 使用类加载器来读取文件
InputStream is = Test.class.getClassLoader().getResourceAsStream(resource);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
SqlSession session = factory.openSession();
return session;
}
}
测试类如下:
public class TestCRUD {
@Test
public void testInsert(){
SqlSession session = MapperUtils.getSqlSession();
User user = new User("Tom", 21);
String statement = "userMapper.addUser";
session.insert(statement, user);
session.commit();
}
@Test
public void testUpdate(){
SqlSession session = MapperUtils.getSqlSession();
User user = new User("Tom", 22);
user.setId(4);
String statement = "userMapper.updateUser";
int result = session.update(statement, user);
session.commit();
System.out.println(result);
}
@Test
public void testDelete(){
SqlSession session = MapperUtils.getSqlSession();
String statement = "userMapper.deleteUser";
int result = session.delete(statement, 4);
session.commit();
System.out.println(result);
}
@Test
public void testGetAllUsers(){
SqlSession session = MapperUtils.getSqlSession();
String statement = "userMapper.getAllUsers";
List<User> result = session.selectList(statement);
session.commit();
session.close();
System.out.println(result);
}
}
这里需要注意一个知识点:
* 在MyBatis中执行事务的方式(执行完毕某个操作成功后以后不进行数据回滚)
* 第一种方式:直接在openSession方法中添加参数true,自动提交的方式
* 第二种方式:在完成整个逻辑操作后,添加代码session.commit();,完成事务的手动提交