MyBatis学习练习
转自:http://ccchhhlll1988-163-com.iteye.com/blog/1415621
基本目的:利用Mybatis完成对一个表简单的select、insert、update、delete操作。达到熟悉MyBatis基本用法的目的。
用到的jar:MyBatis.jar,数据库驱动.jar(如mysql-connector.jar)
MyBatis的配置文件MyBatisConfig.xml。可以进行数据源和事务管理器的配置,以及其他影响MyBatis执行的变量。
MyBatisConfig.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="config.properties"></properties>
<!-- end properties -->
<!-- 定义vo -->
<typeAliases>
<typeAlias alias="User" type="com.mybatis.test.vo.User" />
</typeAliases>
<!-- end define -->
<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="com/mybatis/test/maps/UserMapper.xml" />
</mappers>
</configuration>
MyBatis的映射文件UserMapper.xml。文档中评价这个文件时奇迹发生的地方:
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.mybatis.test.dao.UserDAO">
<select id="selectUser" parameterType="int" resultType="User">
select *
from user where id = #{id}
</select>
<select id="selectAllUser" resultType="User">
select id, username from
user
</select>
<insert id="insertUser" parameterType="User">
insert into user(username)
values ( #{username})
</insert>
<update id="updateUser" parameterType="User">
update user set
username=#{username}, password=#{password} where id = #{id}
</update>
<delete id="deleteUser" parameterType="User">
delete from user where
username=#{username} and password=#{password}
</delete>
</mapper>
UserMapper接口文件,该文件与UserMapper.xml有着某些地方一一对应的关系,注意哦。
代码:
package com.mybatis.test.dao;
import java.util.List;
import com.mybatis.test.vo.User;
public interface UserDAO {
public User selectUser(int id);
public List<User> selectAllUser();
public int insertUser(User user);
public void updateUser(User user);
public void deleteUser(User user);
}
MyBatis文件,其中定义了产生SqlSessionFactory的工厂单例类。
代码:
package com.mybatis.test.util;
import java.io.IOException;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
/**
* @author chl 工厂单例模式,生成SqlSessionFactory实例。
*
*/
public class MyBatis {
private MyBatis() {
};
private static SqlSessionFactory ssf = null;
public static SqlSessionFactory getSessionFactory() throws IOException {
if (null == ssf) {
String resource = "mybatisConfig.xml";
Reader reader = Resources.getResourceAsReader(resource);
ssf = new SqlSessionFactoryBuilder().build(reader);
}// if
return ssf;
}
}
User文件,定义了User javabean实体类。
package com.mybatis.test.vo;
public class User {
private int id;
private String username;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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;
}
@Override
public String toString() {
return "id is:" + id + " name is: " + username;
}
}
userAction类,方法体中获取SqlSessionFactory实例,获得SqlSession,获取SqlMapper,然后调用映射的方法。
package com.mybatis.test.util;
import java.io.IOException;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import com.mybatis.test.dao.UserDAO;
import com.mybatis.test.vo.User;
/**
* @author chl 对user的操作。 其中将SqlSession放于方法级范围。
*/
public class UserAction {
public void insert(User user) {
SqlSessionFactory ssf = null;
SqlSession session = null;
try {
ssf = MyBatis.getSessionFactory();
session = ssf.openSession(true);// 设定事务自动提交(方式一)
UserDAO userDAO = session.getMapper(UserDAO.class);
userDAO.insertUser(user);
selectAll();
System.out.println("==================================");
} catch (IOException e) {
e.printStackTrace();
} finally {
if (null != session) {
session.close();
session = null;
}
}
}
public void update(User user) {
SqlSessionFactory ssf = null;
SqlSession session = null;
try {
ssf = MyBatis.getSessionFactory();
session = ssf.openSession();
UserDAO userDAO = session.getMapper(UserDAO.class);
userDAO.updateUser(user);
session.commit();// 设定事务自动提交(二)
selectAll();
System.out.println("==================================");
} catch (IOException e) {
e.printStackTrace();
} finally {
if (null != session) {
session.close();
session = null;
}
}
}
public void selectAll() {
SqlSessionFactory ssf = null;
SqlSession session = null;
try {
ssf = MyBatis.getSessionFactory();
session = ssf.openSession();
UserDAO userDAO = session.getMapper(UserDAO.class);
List<User> users = userDAO.selectAllUser();
for (User u : users) {
System.out.println(u.getUsername() + " " + u.getId());
}
System.out.println("session is null? " + (session == null));
} catch (IOException e) {
e.printStackTrace();
} finally {
if (null != session) {
session.close();
session = null;
}
}
}
public void delete(User user) {
SqlSessionFactory ssf = null;
SqlSession session = null;
try {
ssf = MyBatis.getSessionFactory();
session = ssf.openSession(true);
UserDAO userDAO = session.getMapper(UserDAO.class);
userDAO.deleteUser(user);
selectAll();
System.out.println("==================================");
} catch (IOException e) {
e.printStackTrace();
} finally {
if (null != session) {
session.close();
session = null;
}
}
}
public static void main(String[] args) {
UserAction userAction = new UserAction();
User user = new User();
user.setUsername("horizon");
user.setPassword("123456");
userAction.delete(user);
}
}
config.properties代码:
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/tt
username=root
password=root
这是参照转载的网站代码修正的,转载的事务处理有点问题,在此进行了修改.....
MyBatis学习练习的更多相关文章
- MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作(转载)
本文转载自:http://www.cnblogs.com/jpf-java/p/6013540.html 上一篇博文MyBatis学习总结(一)--MyBatis快速入门中我们讲了如何使用Mybati ...
- MyBatis学习总结(八)——Mybatis3.x与Spring4.x整合(转载)
孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(八)--Mybatis3.x与Spring4.x整合 一.搭建开发环境 1.1.使用Maven创建Web项目 执行如下命令: m ...
- MyBatis学习总结(七)——Mybatis缓存(转载)
孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(七)--Mybatis缓存 一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的 ...
- (原创)mybatis学习二,spring和mybatis的融合
mybatis学习一夯实基础 上文介绍了mybatis的相关知识,这一节主要来介绍mybaits和spring的融合 一,环境搭建 1,jar包下载,下载路径为jar包 2,将包导入到java工程中 ...
- (原创)mybatis学习一,夯实基础
一,what?(是什么) MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可 ...
- MyBatis学习--简单的增删改查
jdbc程序 在学习MyBatis的时候先简单了解下JDBC编程的方式,我们以一个简单的查询为例,使用JDBC编程,如下: Public static void main(String[] args) ...
- MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作
上一篇博文MyBatis学习总结(一)——MyBatis快速入门中我们讲了如何使用Mybatis查询users表中的数据,算是对MyBatis有一个初步的入门了,今天讲解一下如何使用MyBatis对u ...
- 【Todo】Mybatis学习-偏理论
之前写过好几篇Mybatis相关的文章: http://www.cnblogs.com/charlesblc/p/5906431.html <SSM(SpringMVC+Spring+Myba ...
- MyBatis学习系列三——结合Spring
目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring MyBatis在项目中应用一般都要结合Spring,这一章主要把MyBat ...
- MyBatis学习系列二——增删改查
目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring 数据库的经典操作:增删改查. 在这一章我们主要说明一下简单的查询和增删改, ...
随机推荐
- ps做gif love教程(转)
先看看效果吧: 这是在写部教程的时候,看到一个由方格组成的心.于是试着用PS做成了动画,然后加入了LOVE四个字母,看起来还可以.但是,有些复杂.复杂倒不是技术上的复杂,是做起来复杂. 来试试吧. 1 ...
- C++学习之路--类的构建以及数据转换存储
注意理解下面的代码,数据的处理与转换. 头文件: #ifndef STACK_H #define STACK_H class Stack { struct Link { void* data; Lin ...
- 第三次阅读赵炯博士的《linux内核代码完全注释》:序
这是我第三次阅读linux内核代码完全注释了,当然前两次也没有读完,第一次读到第五章,第二次第七章. 所以说,赵炯博士对我最大的帮助时介绍了intel386的结构,以及内核编程的方法. 至于真正的内核 ...
- sudo 权限问题
窝里个去,不使用sudo吧rvm requirements执行不成功.加上sudo吧rvm requirements调用的brew install又不行.好吧,就按上面说的将brew转换到root模式 ...
- cocos2d-x 3.2 例子文件工程的位置
更新到3.2后突然想要看看官方的例子,忽然发现在test中的cpp工程下面没有了工程的启动配置.奇怪,难道只有代码吗?重新查找后原来启动的工程文件都移动到了build文件夹下面,具体的路径就是 coc ...
- 可变长参数列表误区与陷阱——va_arg不可接受的类型
可变长参数列表误区与陷阱--va_arg不可接受的类型 实现一个有可变长参数列表函数的时候,会使用到stdarg.h(这里不讨论varargs.h)中提供的宏. 例如,我们要实现一个简易的my_pri ...
- 【转】Java transient关键字
Volatile修饰的成员变量在每次被线程访问时,都强迫从主内存中重读该成员变量的值.而且,当成员变量发生变化时,强迫线程将变化值回写到主内存.这样在任何时刻,两个不同的线程总是看到某个成员变量的同一 ...
- POJ1651Multiplication Puzzle(区间DP)
比较好做的区间DP 状态转移方程:DP[i][j] 表示区间[i,j]最小的乘积和. DP[i][j] = MIN{DP[i][k-1]+DP[k+1][j] + a[k]*a[i-1]*a[j+1] ...
- LRESULT与wParam和lParam的问题
在微软vc提供的头文件中有定义在winnt.h中typedef long LONG;在windef.h中typedef LONG LRESULT; 所以LRESULT就是long,也就是长整形之所以取 ...
- CentOS常用查看系统命令
系统 uname -a 查看内核/操作系统/CPU信息head -n 1 /etc/issue 查看操作系统版本cat /proc/cpuinfo 查看C ...