版权声明:版权所有,如需转载,请注明出处 https://blog.csdn.net/houdezaiwu1/article/details/83586269
mybatis作为半持久化orm,对sql语句进行了分类,封装了jdbc的使用,本例使用mybatis,实现一个简单的查询。为了进一步分析底层实现,先不整合spring或springboot,仅作为学习,实际开发中已经不这个做了,略显麻烦。
- 先介绍下mybatis的三个核心:
- 核心接口和类:SqlSessionFactoryBuilder(用过即丢,适合在方法体内)、SqlSessionFactory、SqlSession
- 核心配置文件:mybatis-config.xml
- SQL映射文件:Mapper.xml
创建的工厂结构如下:
一、创建持久化类
package com.model;
public class User {
private String userId;
private String userName;
private String belongOrg;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getBelongOrg() {
return belongOrg;
}
public void setBelongOrg(String belongOrg) {
this.belongOrg = belongOrg;
}
public User(String userId, String userName, String belongOrg) {
super();
this.userId = userId;
this.userName = userName;
this.belongOrg = belongOrg;
}
public User() {
super();
}
}
可以简单理解为符合javaBean规范的实体类,不需要和数据库名一样,因为Mybatis是与sql语句的映射,一般情况和字段名一样就可以了。
2. 创建userDao
package com.dao;
import java.util.List;
import com.model.User;
public interface UserDao {
public List<User> getUserList();
}
3. UserMapper.xml文件
<?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.dao.UserDao">
<resultMap type="User" id="UserMap">
<result property="userId" column="USERID"/>
<result property="userName" column="USERNAME"/>
</resultMap>
<select id="getUserList" resultMap="UserMap">
select * from user_info where userId='admin'
</select>
<!--resultType自动映射-->
<!-- <select id="getUserList" resultType="User">
select * from user_info
</select> -->
</mapper>
4. 配置mybatis-config.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mbatis-3-config.dtd">
<configuration>
<!-- 1. 引入database.properties数据库文件 -->
<properties resource="db.properties"/>
<!-- 2.加载外部日志文件 -->
<settings >
<!-- 设置日志记录 -->
<setting name="logImpl" value="LOG4J"/>
</settings>
<typeAliases>
<!-- 指定包名pojo,MyBatis会自动扫描下面的JavaBean -->
<package name="com.model"/>
</typeAliases>
<!-- 3.配置mybatis多套运行环境 -->
<environments default="development">
<!-- 3.1环境的id值,根据值确定使用哪个 -->
<environment id="development">
<!-- Begin 3.2 配置连接数据库环境 Begin -->
<!-- 事务管理器有JDBC和MANAGED两种可选 -->
<transactionManager type="JDBC"/>
<!-- 数据源类型:UNPOOLED、 POOLED、JNDI,pooled用池的概念将JDBC对象连接,
避免了创建新的连接所必需的初始化和认证时间,数据库连接可复用,不用每次请求都创建,利于快速
响应
-->
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${userName}"/>
<property name="password" value="${password}"/>
</dataSource>
<!-- End 配置连接数据库环境 End -->
</environment>
</environments>
<!-- 4. Begin 把映射文件加载到配置文件中 Begin -->
<mappers>
<mapper resource="com/dao/UserMapper.xml"></mapper>
</mappers>
<!-- End 把映射文件加载到配置文件中 End -->
</configuration>
mybatis的核心配置文件,标签要按照顺序。
5. 创建sqlSession的工具类
package com.util;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class SqlSessionUtil {
//1. 用过即丢
private static SqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder();
private static SqlSessionFactory factory;
/**
* 1. 创建工厂对象
*/
static {
try{
InputStream is = Resources.getResourceAsStream("mybatis-config.xml"); //读取mybatis配置文件
factory = factoryBuilder.build(is);
} catch(Exception e){
e.printStackTrace();
}
}
/**
* 2. 得到session对象,用来操作数据库
* @return
*/
public static SqlSession getSqlSession(){
SqlSession sqlSession = factory.openSession();
return sqlSession;
}
/**
* 3.关闭session
* @param sqlSession
*/
public static void close(SqlSession sqlSession){
if(sqlSession!=null) sqlSession.close();
}
}
SqlSession 是用于执行持久化操作的对象,类似于JDBC的connection,对应一次会话,所以每次访问数据库都要创建,生命周期不是永久的,最佳作用域是request或方法体内,用完关闭也十分重要。
SqlSessionFactory是创建 SqlSession 的工厂,所有mybatis都是以它为中心得,通过静态,保证了只被创建一次,application作用域。
6. 接口实现类UserImpl
package com.service;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import com.dao.UserDao;
import com.model.User;
import com.util.SqlSessionUtil;
public class UserImpl implements UserDao {
public List<User> getUserList() {
// TODO Auto-generated method stub
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
List<User> userList = sqlSession.getMapper(UserDao.class).getUserList();
// List<User> userList = sqlSession.selectList("getUserList", UserDao.class); 这种方式也可以,但是手动输入的getUserList,容易出错
SqlSessionUtil.close(sqlSession);
return userList;
}
}
7.demo测试
public class Demo {
public static void main(String[] args) {
UserImpl userImpl = new UserImpl();
List<User> userList = userImpl.getUserList();
for(User user:userList){
System.out.println("userId is : "+user.getUserId()+";userName is : "+user.getUserName());
}
}
}
控制台输出结果:
userId is : admin;userName is : admin
完成!
后记:DTD文件有两个需要引入,不然编辑的时候没有自动提示。