文章目录
MyBatis入门
- List item
什么是MyBatis
- 持久层框架。
- 避免JDBC代码 :无设置动态参数 和 处理结果集的
getXXX
方法。 - 配置:使用
xml
和注解 配置原生类型,接口 和 Java的POJO为数据库中的记录。sql
代码写在xml
文件当中,完成分离。
获取MyBatis
第一个MyBatis程序
搭建环境:
- 创建数据库。
- 新建项目 :
2.1 : 创建一个空的maven
项目, 无需使用骨架。
2.2 : 删除src目录。 - 导入依赖 : mybatis + mysql 驱动 + Junit。
<!-- 依赖 -->
<dependencies>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</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>
创建模块:
特意说明,这里使用模块儿而不是整个项目是为了方便学习。每个模块儿的pom.xml
都在父级项目当中进行了声明,这样不用频繁进行jar包的导入
。
编写配置文件
在src/main/resouces
目录下面创建一个xml
文件,建议使用`mybatis-config.xml
- 配置文件的内容:
<?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?userSSL=true&userUnicode=ture&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
</configuration>
编写MyBatis工具类
目的是为了将MyBatis
配置文件加载,其他内容进行一次封装。
public class MyBatisUtil {
// 加载配置文件获取工厂
private static SqlSessionFactory sqlSessionFactory = null;
static {
String resource = "mybatis-config.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
} finally {
if(inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static SqlSession getSqlSession() {
return sqlSessionFactory.openSession();
}
}
编写实体类User:
这里的user
属性 和 数据库mybits.user
中的字段是一样(先保持名字一致)。
public class User {
private int id;
private String name;
private String pwd;
// 省略构造 + getter/setter
}
编写 Mapper接口 和 xml
- Mapper接口
package dao;
import pojo.User;
import java.util.List;
public interface UserMapper {
List<User> getAllUser();
}
- Mapper.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 : 指定到绑定到Mapper接口。
-->
<mapper namespace="dao.UserDao">
<!--
id : 对应Mapper接口的方法名字.
resultType : 返回的Pojo类型
-->
<select id="getAllUser" resultType="pojo.User">
select * from mybatis.user;
</select>
</mapper>
注册mapper
<mappers>
<mapper resource="dao/UserMapper.xml"></mapper>
</mappers>
测试
public class UserDaoTest {
@Test
public void test() {
//1. 获得SQLSession对象
SqlSession session = MyBatisUtil.getSqlSession();
//2.
UserMapper mapper = session.getMapper(UserMapper.class);
List<User> userList = mapper.getAllUser();
System.out.println(userList);
}
}
核心API注意事项:
SqlSessionFactoryBuilder
一旦创建了SqlSessionFactory就不再需要了,因此其最佳使用位置是局部方法位置。不应该让其一直存在,以保证所有的XML
解析资源可以被释放给重要的事情。
SqlSessionFactory
被创建就应该一直存在,没有必要抛弃它后重新创建。其最佳作用域是应用的作用区域。很多方法可以做到,比如单例模式,静态单例模式,或者用静态代码块儿进行初始化。
SqlSession
SqlSession是线程不安全,放在局部作用区域使用,确保其在单线程中。应该让每次收到一个请求,打开一个SqlSession,返回响应,然后关闭。
CRUD
select
<!--
id : 对应的接口当中的方法名。
resultType : SQL 语句执行的返回值。
parameterType : 参数的类型。
-->
<! --
需求:根据指定的id查询用户。
UserMapper中存在抽象方法 : User getUserById(int id);
-->
<select id="getUserById" resultType="pojo..User" paramterType="int" >
select * from user where id = #{id}
</select>
isnert
<!--
需求: 插入一个User
在UserMapper中存在抽象方法:insertUser(User user);
insert 没有resultType
参数对象的属性可以直接在sql中使用,不用get方法
-->
<isnert id="insertUser" paramterType="pojo.User">
insert into user (id, name, pwd) values (NULL, #{name}, #{pwd});
</isnert>
- 测试代码
@Test
public void insertUser() {
User user = new User(-1, "张三", "xxxxxx");
SqlSession session = MyBatisUtil.getSqlSession();
UserMapper mapper = session.getMapper(UserMapper.class);
mapper.insertUser(user);
// 提交事务
session.commit();
session.close();
}
update
<!--
UserMapper中存在抽象方法:int updateUser(User user);
-->
<update id="updateUser" paramterType="pojo.User">
update user set name= #{name} where id=#{id};
</update>
- 测试代码
@Test
public void updateUser() {
SqlSession session = MyBatisUtil.getSqlSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = new User(3, "王五", null);
mapper.updateUser(user);
// 提交事务
session.commit();
session.close();
}
delete
<!--
UserMapper当中存在方法:int deleteUser(User user);
-->
<delete id="deleteUserById" paramterType="int">
delete from user where id=#{id}
</delete>
- 测试代码
@Test
public void updateUser() {
SqlSession session = MyBatisUtil.getSqlSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = new User(3, "王五", null);
mapper.updateUser(user);
// 提交事务
session.commit();
session.close();
}
Map作为参数
使用POJO
作为参数的情况下不是很方便,可以使用Map类型作为参数,这样只用填写关键字段就可以了。
- UserMapper.java
int insertUserByMap(Map<String, Object> mp);
- UserMapper.xml
<!-- 使用Map作为参数插入 -->
<insert id="insertUserByMap" parameterType="map">
insert into user (id, name, pwd) values (NULL, #{userName}, #{passWord})
</insert>
- 测试
@Test
public void insertUserByMap() {
SqlSession session = MyBatisUtil.getSqlSession();
UserMapper mapper = session.getMapper(UserMapper.class);
Map<String, Object> data = new HashMap<String, Object>();
data.put("userName", "李白");
data.put("passWord", "123456");
mapper.insertUserByMap(data);
// 提交事务
session.commit();
session.close();
}