mybatis实现增加操作
------------------------------------在Java将数据存入数据库的功能已经实现的情况下, 将项目文件中的JDBCDao替换为使用MybatisDao
核心部件介绍
sqlSessionFactory–顾名思义, 这是一个sqlSession工厂可以产生很多sqlSession
mybatis与hibernate在使用方面的比较
在让mybatis知道数据库的位置, 并且写入相应SQL语句, 将对象交付给sqlSession, 由sqlSession来负责将将对象转化, 并将转化后的对象存放进数据库
与之相比hibernate只需知道数据库的位置, 将对象交付给它, 它就会自动生成SQL语句, 但自动生成的SQL语句往往不尽如人意, 一些SQL语句往往无法通过DBA(数据库管理员)的审核
因此, 我们更多建议使用mybatis
连接池(connection pool)
数据池化, 所有数据库连接会一次取出很多数据放在连接池中缓存,可以大幅提高创建连接的效率
数据源本质上就是连接池, 一个存储结构, 内部放了很多连接对象
mybatis的使用
配置包
新建包, 包名为"edu.mju.stuwork.config"
配置mybatis-config.xml文件
新建xml文件
一般mybatis的配置文件我们命名为mybatis-config.xml
mybatis文件中记录了: 1.数据库位置等信息
注:并不是在文件中直接把数据的接口, 地址, 操作用户直接写死. 具体的信息一般放在一个名为db.properties的文件中, mybatis文件只需与之关联, 就可以获取相应的数据. 当数据库位置修改时,只需要修改db.properties文件中的数据即可
2.说明mybatis映射文件所在位置(mapper文件信息)(一个Dao一个映射文件, 可能一般放在domain文件夹中)
注:映射文件中存放所有业务需要的SQL语句
新建xml文件, 命名为mybatis-config
将头文件信息复制出来
接下来配置db.properties文件
配置db.properties文件之后
导入和关联数据库信息存储的属性文件(导入db.properties), 文件路径通过"Copy Qualified Name"复制, 并将最前面的工程名路径与src删除
设置数据库环境
配置多种数据库, 一般使用两个数据库, 一个为"开发库", 一个为"产品库", 一般会将默认数据库环境设置为开发库, 让工程师测试运行, 产品"上线"的时候会将默认数据库设定为"产品库", 从开发到上传上去给用户使用, 这个过程被称为"上线"
设置数据源
设置数据源的类型, 为POLLED(池化)(连接池)
根据变量名, 使用$将数据从数据库信息存储的属性文件中取出, 架构透过name进而获取到value的值, 进而获取数据库信息存储的属性
接下来配置映射文件
配置映射文件后
将映射文件导入, 文件地址设定为, 相对包的根目录的路径, 以将映射文件导入
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>
<properties resource="edu/mju/stuwork/config/db.properties"></properties>
<!-- 设置默认实体包路径, 以避免之后在Mapper文件中书写完整实体路径的繁琐 -->
<typeAliases>
<package name="edu.mju.stuwork.domain"/>
</typeAliases>
<environments default="mysql-dev">
<environment id="mysql-dev">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${mysql.driver}"/>
<property name="url" value="${mysql.url}"/>
<property name="username" value="${mysql.username}"/>
<property name="password" value="${mysql.password}"/>
</dataSource>
</environment>
</environments>
<!-- 导入mapper(映射文件) -->
<mappers>
<!-- 使用Copy Qualified Name复制StudentMapper.xml的路径防止出错-->
<mapper resource="edu/mju/stuwork/domain/StudentMapper.xml"/>
</mappers>
</configuration>
配置db.properties文件
在文件里填写用于连接数据库的信息, 包括数据库的IP, 端口, 用于连接数据库的用户名以及密码
db.properties文件内容如下:
############### mysql connection profile ###############
#Copy Qualified Name about jdbc
mysql.driver=com.mysql.cj.jdbc.Driver
#Set the database url
mysql.url=jdbc:mysql://127.0.0.1:3306/mydb?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=UTC
#set username
mysql.username=root
#set password
mysql.password=123456
配置映射文件(存放SQL语句)
新建映射文件
一般来说, 一个domain一个映射文件
在domain包下新建一个xml文件, 命名为StudentMapper.xml
映射文件当中包含着所有的Dao操作
对映射文件进行设置
将相应头文件信息复制出来, 对mapper设定namespace, 这是这个mapper唯一的名字.
目的是为了标识当前Mapper, 避免执行时, 本Mapper与其他Mapper下的映射条目名称相同, 进而产生冲突.
设定映射条目, 映射条目的标签名对应你想要的操作, 例如: insert, update, select, delete.
映射文件中存放着所有的Dao方法, Dao方法中有几个, 映射条目就有几个
对映射条目设定id, 一般设定为具体的操作目的, 例如: “addStudent”
设定映射条目的parameterType, 要求内容为完全路径, mapper 的"namespace" + “.” + 映射条目的"id"
但为了书写方便, 并且能够不重复写那么长一串类名, 我们通常在配置文件里设定一个默认package, 默认选用这个包
之后在映射条件中书写SQL语句, 其中原本SQL语句中的问号改为"#{实体类型中的数据变量名}"
映射文件内容如下:
<?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="edu.mju.stuwork.StudentMapper">
<!-- 此处parameterType应该写上完整的类的路径, 但我们在"配置文件"中写好默认路径之后就可以简写,只写类的名称即可 -->
<insert id="addStudent" parameterType="Student">
insert into tbl_student values(#{stuNo}, #{stuName}, #{stuMark})
</insert>
</mapper>
配置MybatisUtils工具类
该类主要作用时启动mybatis, 得到session, 及关闭session
在Utils包下新建一个类, 命名为"MybatisUtils"
在导入包之前应先导入mybatis库
导入Mybatis库之后
声明相应SQL session Factory对象, eclipse中使用CTRL+shift+o组合键自动导入相应库
此时会发现库文件名称里居然有"ibatis"而没有"mybatis"—据说"mybatis"以前叫"ibatis"
MybatisUtils工具类内容如下:
/**
*
*/
package edu.mju.stuwork.utils;
import java.io.IOException;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
/**
* @author XKF
*
*/
public class MybatisUtils {
// 声明SQL Session Factory对象, 初始化值为null
private static SqlSessionFactory sessionFactory = null;
// 设置静态类
static {
Reader reader;
try {
// 读取mybatis文件
reader = Resources.getResourceAsReader("edu/mju/stuwork/config/mybatis-config.xml");
// 使用读取进来的配置文件建立一个SQL Session Factory
sessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("mybatis Sql Session Factory is created ok!");
}
/**
* 提供一个mybatis session
* @return
*/
public static SqlSession getSession() {
return sessionFactory.openSession();
}
/**
* 释放一个mybatis session
* @param session
*/
public static void closeSession(SqlSession session) {
session.close();
}
}
导入Mybatis库
在GitHub下载,点击链接
Releases · mybatis/mybatis-3 · GitHub
选择版本下载压缩包并解压, 在解压后的文件夹中找到(我下载的是3.5.6)
mybatis-3.5.6.jar
打开文件夹lib, 在文件夹中找到
log4j-1.2.17.jar
commons-logging-1.2.jar
这两个库mybatis在运行过程中用来做日志
将这三个文件复制到工程中的WebContent->WEB-INF->lib中
设置StudentDaoMybatisImpl类
在dao包中新建StudentDaoMybatisImpl类, 添加接口StudentDao
将函数重写
public class StudentDaoMybatisImpl implements StudentDao {
@Override
public void addStu(Student stu) {
// TODO Auto-generated method stub
// 新建一个SQL session
SqlSession session = MybatisUtils.getSession();
// 将对象通过session进行新增
// 括号中的字符串代表的是使用的映射条目全称, stu是要导入数据库的实体
session.insert("edu.mju.stuwork.StudentMapper.addStudent", stu);
// 将对数据库的修改进行提交
session.commit();
// 通过相应函数将session释放
MybatisUtils.closeSession(session);
}
}
将原来的使用的JDBCDao替换
找到原来调用JDBCDao进行新增的函数, 将JDBCDao替换为StudentDaoMybatisImpl
public void regStudent(Student stu) {
// StudentDao stuDao = new StudentDaoJDBCImpl();
// 替换Dao, 接口的好处显现出来了, 除了修改了类其他什么都不影响
StudentDao stuDao = new StudentDaoMybatisImpl();
stuDao.addStu(stu);
// TODO Auto-generated method stub
}
打印Mybatis的日志信息
建立一个log4j.properties文件, 将以下内容粘贴至项目的src目录下
并将
log4j.appender.dailyRollingFile.File = 此处替换为你为日志文件设置的存储路径/log.txt
里的中文替换为你为日志文件设置的存储路径
注:电脑文件管理器地址栏中复制进来的路径不可直接使用
原因是: Java中的 ”\“ 为转义字符, 无法用来表示路径
因此: 需将电脑文件管理器地址栏中复制进来的路径中的所有 “\” 替换为 “/” 才可以达到目的效果
#
# Log4J Settings for log4j 1.2.x (via jakarta-commons-logging)
#
# The five logging levels used by Log are (in order):
#
# 1. DEBUG (the least serious)
# 2. INFO
# 3. WARN
# 4. ERROR
# 5. FATAL (the most serious)
# Set root logger level to WARN and append to stdout
log4j.rootLogger=debug, stdout,dailyRollingFile
#appender: stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %5p (%c:%L) - %m%n
#appender: dailyRollingFile
log4j.appender.dailyRollingFile = org.apache.log4j.DailyRollingFileAppender
log4j.appender.dailyRollingFile.File = 此处替换为你为日志文件设置的存储路径/log.txt
log4j.appender.dailyRollingFile.Append = true
log4j.appender.dailyRollingFile.Threshold = DEBUG
log4j.appender.dailyRollingFile.layout = org.apache.log4j.PatternLayout
log4j.appender.dailyRollingFile.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
# Print only messages of level ERROR or above in the package noModule.
log4j.logger.noModule=FATAL
#log4j.logger.com.opensymphony.xwork2=INFO
#log4j.logger.com.abc.test=debug
最后执行项目, 测试是否能够成功执行增加操作