今天是学习MyBatis的第二天,在这里把入门的程序进行总结,也是对使用MyBatis的步骤的一个总结。
1.环境搭建,导入jar包。
MyBatis的前身是Ibatis,是一个web开发持久层的框架。使用SSM(Spring+SpringMVC+MyBatis)进行web开发,是目前较为流行的一种趋势。MyBatis是Apache的一个顶级的项目。现在是把它放在GitHub进行托管,因此我们搭建环境所需要的jar包需要到GitHub上进行下载。下载的网址是:http://github.com/mybatis/mybatis-3/releases
将下载下来的压缩包进行解压,解压后得到的文件夹如下图所示:
分析一下这个文件夹。其中,mybatis-3.3.1.jar是mybatis的本身的一个核心jar包,lib目录下的jar包都是这个核心jar包的依赖jar包。
pdf文件则是mybatis的使用文档,在后面配置mybatis-config.xml,mapper.xml以及配置日志文件log4j时,可以从使用文档中获得帮助。
将以上jar包全部导入,另外,MyBatis也是对JDBC的封装,因此不要忘了导入Mysql-connector.jar包,jar包一览图如下:
至此环境搭建完毕。
2.配置mybatis-config.xml文件
这个文件是mybatis项目的核心文件,贯穿整个项目的始终。
在这边主要干了三个事情,首先是为POJO类User,定义了一个别名user。接着配置了数据库的信息,设置采用JDBC进行事务的管理,并且配置了连接池DataSource。最后定义了映射器,映射器的功能是代替了以前DAO里的userServiceImpl(),是一个功能的具体实现,现在把它写到了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>
<!--1. 定义别名为user -->
<typeAliases>
<typeAlias alias="user" type="com.learn.chapter2.po.User.User"/>
</typeAliases>
<!-- 2.定义数据库信息,默认使用development 数据库构建环境 -->
<environments default="development">
<environment id="development">
<!-- 采用JDBC事务管理 -->
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/taobao?serverTimezone=GMT%2B8"/>
<property name="username" value="root"/>
<property name="password" value="shenCHENG520145"/>
</dataSource>
</environment>
</environments>
<!-- 3.定义映射器 -->
<mappers>
<mapper resource="com/learn/chapter2/mapper/userMapper.xml"/>
</mappers>
</configuration>
这个配置文件也可以看作一个大纲,接下来可以一一来实现POJO类以及功能接口。
2.编写POJO类
package com.learn.chapter2.po.User;
public class User {
int userId;
String userName;
String password;
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
POJO类很简单,三个属性,分别设置了必备的get和set方法。
3.编写UserMapper()接口,相当于以前的UserService()接口。
package com.learn.chapter2.mapper;
import com.learn.chapter2.po.User.User;
public interface UserMapper {
public User getUser(int userId);
public int deleteUser(int userId);
public int insertUser(User user);
}
也很简单,主要包括三个功能,根据userId查询用户,删除用户,以及增加用户。
4.编写userMapper.xml文件,相当于UserMapper()接口的具体实现。
namespace命名空间是指要实现的Mapper接口,命名空间的起到隔离的功能。
<select>、<delete>等标签分别指示要进行的操作。其中id是指对应的具体接口,parameterType是指实现的此接口的参数类型,resultType是指返回值的类型。
<?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.learn.chapter2.mapper.UserMapper">
<!-- 由于前面在mybatis-config.xml里已经为类User起了别名,所以下面参数类型或者返回类型是User时,一律写成user -->
<select id="getUser" parameterType="int" resultType="user">
select uid as userId, uname as userName, password from user where uid=#{userId}
</select>
<delete id="deleteUser" parameterType="int">
delete from user where uid=#{id}
</delete>
<insert id="insertUser" parameterType="user">
insert into user(uname,password) values (#{userName},#{password})
</insert>
</mapper>
5.编写log4j.properties文件
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# MyBatis logging configuration...
log4j.logger.org.mybatis=DEBUG
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p %d %C: %m%n
此文件的模板可以在mybatis的使用文档里找到。配置此文件,Log4j会为我们打印出Mybatis的运行轨迹,这个功能非常贴心,它将你增加用户,删除用户的过程直接翻开呈现在你的面前。
6.编写SqlSessionFactoryUtil类
这个类的功能也是非常关键的。首先,SqlSessionFactoryBuider根据mybatis-config.xml来创建一个SqlSessionFactory对象,然后调用SqlSessionFactory的openSession()方法,返回一个SqlSeesion。
package com.learn.chapter2.util;
import java.io.IOException;
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;
//import org.eclipse.jdt.internal.compiler.ast.NullLiteral;
public class SqlSessionFactoryUtil {
private SqlSessionFactory sqlSessionFactory=null;
public SqlSessionFactoryUtil() {
String resource = "mybatis-config.xml";
InputStream inputStream=null;
try {
inputStream=Resources.getResourceAsStream(resource);
this.sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public SqlSession openSqlSession() {
return this.sqlSessionFactory.openSession();
}
}
7.编写测试类,其中包括一个Main()方法。
package com.learn.chapter2.main;
import java.io.IOException;
import org.apache.ibatis.session.SqlSession;
import com.learn.chapter2.mapper.UserMapper;
import com.learn.chapter2.po.User.User;
import com.learn.chapter2.util.SqlSessionFactoryUtil;
public class chapter2Main {
public static void main(String[] args) throws IOException{
SqlSession sqlSession=null;
SqlSessionFactoryUtil sqlSessionFactoryUtil=new SqlSessionFactoryUtil();
try {
sqlSession=sqlSessionFactoryUtil.openSqlSession();
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
User user=new User();
user=userMapper.getUser(2);
System.out.println(user.getUserId());
System.out.println(user.getUserName());
System.out.println(user.getPassword());
user.setUserName("sssccc");
user.setPassword("sc520145");
userMapper.insertUser(user);
userMapper.deleteUser(3);
sqlSession.commit();
} catch (Exception e) {
System.err.println(e.getMessage());
sqlSession.rollback();
}finally {
sqlSession.close();
}
}
}
注意:在对数据库有修改的操作时,必须调用sqlSession.commit()方法,否则不会提交数据,更新不起作用。
8.运行结果
DEBUG 2019-04-13 13:06:37,961 org.apache.ibatis.logging.LogFactory: Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.
DEBUG 2019-04-13 13:06:37,974 org.apache.ibatis.datasource.pooled.PooledDataSource: PooledDataSource forcefully closed/removed all connections.
DEBUG 2019-04-13 13:06:37,974 org.apache.ibatis.datasource.pooled.PooledDataSource: PooledDataSource forcefully closed/removed all connections.
DEBUG 2019-04-13 13:06:37,974 org.apache.ibatis.datasource.pooled.PooledDataSource: PooledDataSource forcefully closed/removed all connections.
DEBUG 2019-04-13 13:06:37,974 org.apache.ibatis.datasource.pooled.PooledDataSource: PooledDataSource forcefully closed/removed all connections.
DEBUG 2019-04-13 13:06:38,047 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Opening JDBC Connection
DEBUG 2019-04-13 13:06:38,526 org.apache.ibatis.datasource.pooled.PooledDataSource: Created connection 1710989308.
DEBUG 2019-04-13 13:06:38,526 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@65fb9ffc]
DEBUG 2019-04-13 13:06:38,530 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==> Preparing: select uid as userId, uname as userName, password from user where uid=?
DEBUG 2019-04-13 13:06:38,554 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==> Parameters: 2(Integer)
DEBUG 2019-04-13 13:06:38,571 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: <== Total: 1
2
sc520145
520145
DEBUG 2019-04-13 13:06:38,573 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==> Preparing: insert into user(uname,password) values (?,?)
DEBUG 2019-04-13 13:06:38,574 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==> Parameters: sssccc(String), sc520145(String)
DEBUG 2019-04-13 13:06:38,578 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: <== Updates: 1
DEBUG 2019-04-13 13:06:38,578 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==> Preparing: delete from user where uid=?
DEBUG 2019-04-13 13:06:38,578 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: ==> Parameters: 3(Integer)
DEBUG 2019-04-13 13:06:38,580 org.apache.ibatis.logging.jdbc.BaseJdbcLogger: <== Updates: 1
DEBUG 2019-04-13 13:06:38,581 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Committing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@65fb9ffc]
DEBUG 2019-04-13 13:06:38,588 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@65fb9ffc]
DEBUG 2019-04-13 13:06:38,588 org.apache.ibatis.transaction.jdbc.JdbcTransaction: Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@65fb9ffc]
DEBUG 2019-04-13 13:06:38,588 org.apache.ibatis.datasource.pooled.PooledDataSource: Returned connection 1710989308 to pool.
可以看到,Log4j将过程信息全部的打印出来,运行无错误。