什么是Mybtis?
官方自己介绍说:“MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。”
为了方便,我使用了maven构建项目。
Mybatis环境搭建及简单实例:
1、环境搭建
将下面dependency代码置于pom.xml中
<dependency>
<groupId> org.mybatis </groupId>
<artifactId> mybatis </artifactId>
<groupId> org.mybatis </groupId>
<artifactId> mybatis </artifactId>
<version>
x.x.x
</version>
</dependency>
2、配置log4j和Mybatis
在classpath建立一个log4j的配置文件log4j.properties,再建立一个用于配置Mybatis的配置文件mybatis-config.xml文件。mybatis-config配置如下
<?
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配置文件, 我这里面配置的是数据库相关 -->
<properties resource ="dbconfig.properties" ></properties>
<settings>
<!--指定 MyBatis 所用日志的具体实现,未指定时将自动查找。-->
<setting name ="logImpl" value ="LOG4J" />
</settings>
<typeAliases>
<!--定义别名 类型别名是为 Java 类型设置一个短的名字。它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。-->
<typeAlias type ="hzq.mybatis.source.demo1.entity.User" alias ="User" />
<typeAlias type ="hzq.mybatis.source.demo1.dao.IUserDao" alias ="UserMapper" />
</typeAliases>
<environments default ="development" >
<environment id ="development" >
<transactionManager type ="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>
</environment>
</environments>
<!--映射文件-->
<mappers>
<mapper resource ="hzq/mybatis/source/demo1/UserMapper.xml" />
</mappers>
</configuration>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd" >
<configuration>
<!-- 指定properties配置文件, 我这里面配置的是数据库相关 -->
<properties resource ="dbconfig.properties" ></properties>
<settings>
<!--指定 MyBatis 所用日志的具体实现,未指定时将自动查找。-->
<setting name ="logImpl" value ="LOG4J" />
</settings>
<typeAliases>
<!--定义别名 类型别名是为 Java 类型设置一个短的名字。它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。-->
<typeAlias type ="hzq.mybatis.source.demo1.entity.User" alias ="User" />
<typeAlias type ="hzq.mybatis.source.demo1.dao.IUserDao" alias ="UserMapper" />
</typeAliases>
<environments default ="development" >
<environment id ="development" >
<transactionManager type ="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>
</environment>
</environments>
<!--映射文件-->
<mappers>
<mapper resource ="hzq/mybatis/source/demo1/UserMapper.xml" />
</mappers>
</configuration>
3、简单实例:
①、首先,在mysql数据库mybatis中创建一张sys_users表;
CREATE TABLE `sys_users` (
`userno` int( 11) NOT NULL AUTO_INCREMENT COMMENT '用户序号' ,
`loginname` varchar( 64) DEFAULT NULL COMMENT '登陆名' ,
`passwd` varchar( 64) DEFAULT NULL COMMENT '密码' ,
`username` varchar( 64) DEFAULT NULL COMMENT '姓名' ,
`job` varchar( 64) DEFAULT NULL COMMENT '职务' ,
`phone` varchar( 32) DEFAULT NULL COMMENT '电话' ,
`createtime` datetime DEFAULT NULL COMMENT '创建时间' ,
`lastlgntime` datetime DEFAULT NULL ,
PRIMARY KEY ( `userno`)
) ENGINE=InnoDB AUTO_INCREMENT= 0 DEFAULT CHARSET=utf8 ROW_FORMAT= COMPACT ;
`userno` int( 11) NOT NULL AUTO_INCREMENT COMMENT '用户序号' ,
`loginname` varchar( 64) DEFAULT NULL COMMENT '登陆名' ,
`passwd` varchar( 64) DEFAULT NULL COMMENT '密码' ,
`username` varchar( 64) DEFAULT NULL COMMENT '姓名' ,
`job` varchar( 64) DEFAULT NULL COMMENT '职务' ,
`phone` varchar( 32) DEFAULT NULL COMMENT '电话' ,
`createtime` datetime DEFAULT NULL COMMENT '创建时间' ,
`lastlgntime` datetime DEFAULT NULL ,
PRIMARY KEY ( `userno`)
) ENGINE=InnoDB AUTO_INCREMENT= 0 DEFAULT CHARSET=utf8 ROW_FORMAT= COMPACT ;
②、包目录结构如下:
③编写一个User实体类
public class User {
private String userno ;
private String loginname ;
private String passwd ;
private String username ;
private String job ;
private String phone ;
private String createtime ;
private String lastlgntime ;
public String getUserno() {
return userno ;
}
public void setUserno(String userno) {
this. userno = userno ;
}
public String getLoginname() {
return loginname ;
}
public void setLoginname(String loginname) {
this. loginname = loginname ;
}
public String getPasswd() {
return passwd ;
}
public void setPasswd(String passwd) {
this. passwd = passwd ;
}
public String getUsername() {
return username ;
}
public void setUsername(String username) {
this. username = username ;
}
public String getJob() {
return job ;
}
public void setJob(String job) {
this. job = job ;
}
public String getPhone() {
return phone ;
}
public void setPhone(String phone) {
this. phone = phone ;
}
public String getCreatetime() {
return createtime ;
}
public void setCreatetime(String createtime) {
this. createtime = createtime ;
}
public String getLastlgntime() {
return lastlgntime ;
}
public void setLastlgntime(String lastlgntime) {
this. lastlgntime = lastlgntime ;
}
}
private String userno ;
private String loginname ;
private String passwd ;
private String username ;
private String job ;
private String phone ;
private String createtime ;
private String lastlgntime ;
public String getUserno() {
return userno ;
}
public void setUserno(String userno) {
this. userno = userno ;
}
public String getLoginname() {
return loginname ;
}
public void setLoginname(String loginname) {
this. loginname = loginname ;
}
public String getPasswd() {
return passwd ;
}
public void setPasswd(String passwd) {
this. passwd = passwd ;
}
public String getUsername() {
return username ;
}
public void setUsername(String username) {
this. username = username ;
}
public String getJob() {
return job ;
}
public void setJob(String job) {
this. job = job ;
}
public String getPhone() {
return phone ;
}
public void setPhone(String phone) {
this. phone = phone ;
}
public String getCreatetime() {
return createtime ;
}
public void setCreatetime(String createtime) {
this. createtime = createtime ;
}
public String getLastlgntime() {
return lastlgntime ;
}
public void setLastlgntime(String lastlgntime) {
this. lastlgntime = lastlgntime ;
}
}
④编写IUserDao接口类:
public interface IUserDao {
/**
* 新增
*/
public void insert(User user) ;
/**
* 获取所有的数据
* @return
*/
public List<User> list() ;
/**
* 根据id更新
* @param user
*/
public void update(User user) ;
}
/**
* 新增
*/
public void insert(User user) ;
/**
* 获取所有的数据
* @return
*/
public List<User> list() ;
/**
* 根据id更新
* @param user
*/
public void update(User user) ;
}
⑤编写UserDaoImpl实现类
public class UserDaoImpl
implements IUserDao {
@Override
public void insert(User user) {
SqlSession session = this.getSqlSessionFactory().openSession() ;
session.insert( "UserMapper.insert" ,user) ;
session.commit() ;
session.close() ;
}
@Override
public List<User> list() {
SqlSession session = this.getSqlSessionFactory().openSession() ;
List<User> users = session.selectList( "UserMapper.list") ;
session.close() ;
return users ;
}
@Override
public void update(User user) {
SqlSession session = this.getSqlSessionFactory().openSession() ;
session.update( "UserMapper.update" ,user) ;
session.commit() ;
session.close() ;
}
/**
* 获取 SqlSessionFactory
* Mybatis 通过SqlSessionFactory获取SqlSession, 然后才能通过SqlSession与数据库进行交互
* @return
*/
private SqlSessionFactory getSqlSessionFactory(){
String resource = "mybatis-config.xml" ;
SqlSessionFactory sqlSessionFactory = null;
InputStream stream = null;
try {
stream = Resources. getResourceAsStream(resource) ;
sqlSessionFactory = new SqlSessionFactoryBuilder().build(stream) ;
} catch (Exception e){
e.printStackTrace() ;
}
return sqlSessionFactory ;
}
}
@Override
public void insert(User user) {
SqlSession session = this.getSqlSessionFactory().openSession() ;
session.insert( "UserMapper.insert" ,user) ;
session.commit() ;
session.close() ;
}
@Override
public List<User> list() {
SqlSession session = this.getSqlSessionFactory().openSession() ;
List<User> users = session.selectList( "UserMapper.list") ;
session.close() ;
return users ;
}
@Override
public void update(User user) {
SqlSession session = this.getSqlSessionFactory().openSession() ;
session.update( "UserMapper.update" ,user) ;
session.commit() ;
session.close() ;
}
/**
* 获取 SqlSessionFactory
* Mybatis 通过SqlSessionFactory获取SqlSession, 然后才能通过SqlSession与数据库进行交互
* @return
*/
private SqlSessionFactory getSqlSessionFactory(){
String resource = "mybatis-config.xml" ;
SqlSessionFactory sqlSessionFactory = null;
InputStream stream = null;
try {
stream = Resources. getResourceAsStream(resource) ;
sqlSessionFactory = new SqlSessionFactoryBuilder().build(stream) ;
} catch (Exception e){
e.printStackTrace() ;
}
return sqlSessionFactory ;
}
}
⑥编写UserMapper文件
<?
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" >
<sql id ="tableName" >
sys_users
</sql>
<sql id ="field" >
userno,
loginname,
passwd,
username,
job,
phone,
createtime,
lastlgntime
</sql>
<sql id ="fieldValue" >
#{userno},
#{loginname},
#{passwd},
#{username},
#{job},
#{phone},
#{createtime},
#{lastlgntime}
</sql>
<insert id ="insert" parameterType ="User" >
INSERT INTO
<include refid ="tableName" ></include>
(
<include refid ="field" ></include>
)VALUES (
<include refid ="fieldValue" ></include>
)
</insert>
<select id ="list" resultType ="User" >
SELECT
<include refid ="field" ></include>
FROM
<include refid ="tableName" ></include>
</select>
<update id ="update" parameterType ="User" >
UPDATE
<include refid ="tableName" />
SET
job = #{job}
WHERE
userno = #{userno}
</update>
</mapper>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace ="UserMapper" >
<sql id ="tableName" >
sys_users
</sql>
<sql id ="field" >
userno,
loginname,
passwd,
username,
job,
phone,
createtime,
lastlgntime
</sql>
<sql id ="fieldValue" >
#{userno},
#{loginname},
#{passwd},
#{username},
#{job},
#{phone},
#{createtime},
#{lastlgntime}
</sql>
<insert id ="insert" parameterType ="User" >
INSERT INTO
<include refid ="tableName" ></include>
(
<include refid ="field" ></include>
)VALUES (
<include refid ="fieldValue" ></include>
)
</insert>
<select id ="list" resultType ="User" >
SELECT
<include refid ="field" ></include>
FROM
<include refid ="tableName" ></include>
</select>
<update id ="update" parameterType ="User" >
UPDATE
<include refid ="tableName" />
SET
job = #{job}
WHERE
userno = #{userno}
</update>
</mapper>
⑦编写测试类
public class UserTest {
private IUserDao userDao = new UserDaoImpl() ;
/**
* 新增数据
*/
@Test
public void save(){
User user = new User() ;
user.setLoginname( "admin") ;
user.setPhone( "110") ;
user.setPasswd( "admin") ;
user.setJob( "码农") ;
DateFormat df = new SimpleDateFormat( "yy-MM-dd HH:mm:ss") ;
user.setCreatetime(df.format( new Date())) ;
user.setLastlgntime(df.format( new Date())) ;
userDao.insert(user) ;
}
/**
* 根据id更新
*/
@Test
public void update(){
User user = new User() ;
user.setUserno( 2+ "") ;
user.setJob( "Java工程师") ;
userDao.update(user) ;
}
/**
* 查询所有的数据
*/
@Test
public void list(){
List<User> users = userDao.list() ;
for (User u: users
) {
System. out.println(u.getJob()) ;
}
}
}
private IUserDao userDao = new UserDaoImpl() ;
/**
* 新增数据
*/
@Test
public void save(){
User user = new User() ;
user.setLoginname( "admin") ;
user.setPhone( "110") ;
user.setPasswd( "admin") ;
user.setJob( "码农") ;
DateFormat df = new SimpleDateFormat( "yy-MM-dd HH:mm:ss") ;
user.setCreatetime(df.format( new Date())) ;
user.setLastlgntime(df.format( new Date())) ;
userDao.insert(user) ;
}
/**
* 根据id更新
*/
@Test
public void update(){
User user = new User() ;
user.setUserno( 2+ "") ;
user.setJob( "Java工程师") ;
userDao.update(user) ;
}
/**
* 查询所有的数据
*/
@Test
public void list(){
List<User> users = userDao.list() ;
for (User u: users
) {
System. out.println(u.getJob()) ;
}
}
}
4、demo源码下载链接:
https://code.csdn.net/mmd0308/mybatis-source.git
通过这个简单的demo,初步了解Mybatis 的运行机制。接下来进行深一步的了解和学习Mybatis。