java实战应用:MyBatis实现单表的增删改
MyBatis 是支持普通 SQL查询。存储过程和高级映射的优秀持久层框架。MyBatis 消除了差点儿全部的JDBC代码和參数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old
Java Objects,普通的 Java对象)映射成数据库中的记录。每一个MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory实例能够通过SqlSessionFactoryBuilder获得。SqlSessionFactoryBuilder能够从一个xml配置文件或者一个提前定义的配置类的实例获得。
用xml文件构建SqlSessionFactory实例是非常easy的事情。推荐在这个配置中使用类路径资源(classpath resource)。但你能够使用不论什么Reader实例,包含用文件路径或file://开头的url创建的实例。
MyBatis有一个有用类----Resources,它有非常多方法。能够方便地从类路径及其他位置载入资源。
一、首先建立项目的总体效果图:
下面是MyBatis单表的增删改:
二、项目代码:
1)实体类:News中:
public class News {
private Integer id;
private String title;
private String content;
private Date pubDate;
private Integer typeId;
private String photo;
private String tname;
//get,set方式省去
2)dao层借口层的INewsDAO:
import java.util.List;
import java.util.Map;
import org.liky.vo.News;
public interface INewsDAO {
public void doCreate(News news) throws Exception;
public void doUpdate(News news) throws Exception;
public void doRemove(int id) throws Exception;
public List<News> findAll() throws Exception;
public News findById(int id) throws Exception;
public List<News> findAllSplit(Map<String, Object> map) throws Exception;
public int getAllCount(Map<String, Object> map) throws Exception;
}
3)dao层的实现。INewDAO.xml,正常不是myBatis,这里是写dao层的实现类的:myBatis的优势也是在这里,将sql语句抽调出来单独写入到一个xml中,便于管理数据库。
它是更接近于jdbc的。所以处理的速度非常快,它是外网项目中须要用到框架。
<mapper namespace="org.liky.dao.INewsDAO">
<resultMap type="News" id="NewsResult">
<id column="id" property="id" />
<result column="title" property="title" />
<result column="content" property="content" />
<result column="pub_date" property="pubDate" />
<result column="type_id" property="typeId" />
<result column="photo" property="photo" />
</resultMap>
<insert id="doCreate" parameterType="News">
INSERT INTO news
(id,title,content,pub_date,type_id,photo) VALUES
(news_seq.nextVal,#{title},#{content},#{pubDate},#{typeId},#{photo})
</insert>
<update id="doUpdate" parameterType="News">
UPDATE news
SET title =
#{title},content=#{content},pub_date = #{pubDate},type_id =
#{typeId},photo=#{photo}
WHERE id = #{id}
</update>
<delete id="doRemove" parameterType="java.lang.Integer">
DELETE FROM news WHERE id =
#{id}
</delete>
<select id="findAll" resultMap="NewsResult">
SELECT * FROM news
</select>
<select id="findById" resultType="News" parameterType="java.lang.Integer">
SELECT
id,title,content,pub_date AS pubDate,type_id AS typeId,photo,tname FROM news n,news_type nt
WHERE id = #{id} AND n.type_id = nt.tid
</select>
<select id="findAllSplit" resultType="News" parameterType="java.util.Map">
SELECT temp.* FROM (SELECT
id,title,content,pub_date
AS pubDate,type_id
AS typeId,photo,ROWNUM rn
FROM news WHERE ${column}
LIKE #{keyword} AND
ROWNUM <= #{endNumber}) temp WHERE temp.rn >
#{startNumber}
</select>
<select id="getAllCount" resultType="int" parameterType="java.util.Map">
SELECT
COUNT(*) FROM news WHERE ${column} LIKE #{keyword}
</select>
</mapper>
4)这一步能够写mybatis的总配置文件,初始载入连接数据库。
<configuration>
<typeAliases>
<package name="org.liky.vo" />
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@localhost:1521:ORCL" />
<property name="username" value="sunxun" />
<property name="password" value="123" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/liky/dao/INewsDAO.xml" />
</mappers>
</configuration>
5)建立MyBATISSqlSessionFactory类:
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 MyBATISSqlSessionFactory {
// 配置文件的所在位置和名称
private static String CONFIG_FILE_LOCATION = "mybatis-config.xml";
// 用来实现连接池的。该类相似Map集合。
private static final ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();
// Hibernate用来读取配置文件的类
private static InputStream is;
// 用来建立连接的,该类就是连接池,使用单例设计模式
private static SqlSessionFactory sqlsessionFactory;
// 备用的配置文件位置
private static String configFile = CONFIG_FILE_LOCATION;
// 静态块,类载入时最先运行
static {
try {
// 载入配置文件到内存中
is = Resources.getResourceAsStream(configFile);
// 建立连接池以及里面的连接
sqlsessionFactory = new SqlSessionFactoryBuilder().build(is);
} catch (Exception e) {
System.err.println("%%%% Error Creating SessionFactory %%%%");
e.printStackTrace();
}
}
private MyBATISSqlSessionFactory() {
}
/**
* 取得数据库连接对象
*
* @return Session
* @throws HibernateException
*/
public static SqlSession getSession() {
// 先从ThreadLocal中取得连接。
SqlSession session = (SqlSession) threadLocal.get();
// 假设手头没有连接,则取得一个新的连接
if (session == null) {
session = sqlsessionFactory.openSession();
// 把取得出的连接记录到ThreadLocal中,以便下次使用。
threadLocal.set(session);
}
return session;
}
/**
* 连接关闭的方法
*
* @throws HibernateException
*/
public static void closeSession() {
SqlSession session = (SqlSession) threadLocal.get();
// 将ThreadLocal清空,表示当前线程已经没有连接。
threadLocal.set(null);
// 连接放回到连接池
if (session != null) {
session.close();
}
}
}
6)写service层实现的借口:
import java.util.List;
import java.util.Map;
import org.liky.vo.News;
public interface INewsService {
public void insert(News news) throws Exception;
public News findById(int id) throws Exception;
public List<News> findAll() throws Exception;
public Map<String, Object> list(int pageNo, int pageSize, String column,
String keyword) throws Exception;
}
7)解耦合,写service的工厂:
import org.liky.service.INewsService;
import org.liky.service.impl.NewsServiceImpl;
public class ServiceFactory {
public static INewsService getINewsServiceInstance() {
return new NewsServiceImpl();
}
}
8)service的实现类:
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.liky.dao.INewsDAO;
import org.liky.dbc.MyBATISSqlSessionFactory;
import org.liky.service.INewsService;
import org.liky.vo.News;
public class NewsServiceImpl implements INewsService {
public List<News> findAll() throws Exception {
List<News> all = null;
try {
all = MyBATISSqlSessionFactory.getSession().getMapper(
INewsDAO.class).findAll();
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
MyBATISSqlSessionFactory.closeSession();
}
return all;
}
public News findById(int id) throws Exception {
News news = null;
try {
news = MyBATISSqlSessionFactory.getSession().getMapper(
INewsDAO.class).findById(id);
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
MyBATISSqlSessionFactory.closeSession();
}
return news;
}
public void insert(News news) throws Exception {
try {
MyBATISSqlSessionFactory.getSession().getMapper(INewsDAO.class)
.doCreate(news);
MyBATISSqlSessionFactory.getSession().commit();
} catch (Exception e) {
e.printStackTrace();
MyBATISSqlSessionFactory.getSession().rollback();
throw e;
} finally {
MyBATISSqlSessionFactory.closeSession();
}
}
public Map<String, Object> list(int pageNo, int pageSize, String column,
String keyword) throws Exception {
Map<String, Object> map = new HashMap<String, Object>();
// 设置要向DAO中传递的參数
Map<String, Object> params = new HashMap<String, Object>();
params.put("column", column);
params.put("keyword", "%" + keyword + "%");
params.put("endNumber", pageNo * pageSize);
params.put("startNumber", (pageNo - 1) * pageSize);
try {
map.put("allNews", MyBATISSqlSessionFactory.getSession().getMapper(
INewsDAO.class).findAllSplit(params));
map.put("count", MyBATISSqlSessionFactory.getSession().getMapper(
INewsDAO.class).getAllCount(params));
} catch (Exception e) {
e.printStackTrace();
} finally {
MyBATISSqlSessionFactory.closeSession();
}
return map;
}
}
9)測试类NewsServiceImplTest:
import java.util.Date;
import java.util.UUID;
import org.junit.Test;
import org.liky.factory.ServiceFactory;
import org.liky.vo.News;
public class NewsServiceImplTest {
@Test
public void testFindAll() throws Exception {
System.out.println(ServiceFactory.getINewsServiceInstance().findAll());
}
@Test
public void testFindById() throws Exception {
System.out.println(ServiceFactory.getINewsServiceInstance()
.findById(61).getTname());
}
@Test
public void testInsert() throws Exception {
News news = new News();
news.setTitle("MyBATIS測试");
news.setContent("MyBATIS加入測试");
news.setTypeId(3);
news.setPubDate(new Date());
news.setPhoto(UUID.randomUUID().toString() + ".jpg");
ServiceFactory.getINewsServiceInstance().insert(news);
}
@Test
public void testListSplit() throws Exception {
System.out.println(ServiceFactory.getINewsServiceInstance().list(1, 5,
"title", ""));
}
}
java实战应用:MyBatis实现单表的增删改的更多相关文章
- mybatis入门--单表的增删改操作
单表的增加操作 前面我们看了如何搭建mybatis框架以及查询操作,这里我们说下如何使用mybatis进行增加用户的操作.首先是在user.xml文件中添加insert的方法.代码如下 <!-- ...
- 2.Mybatis入门程序(单表的增删改成)
这里讲的单表的增删改查,是由mapper代理的增删改查,先来看看步骤: 1.jar包的导入 2.配置全局的配置文件 3.建立接口 4.编写mapper.xml 5.测试 工程结构:这个你们自己可以调整 ...
- SpringBoot整合Mybatis对单表的增、删、改、查操作
一.目标 SpringBoot整合Mybatis对单表的增.删.改.查操作 二.开发工具及项目环境 IDE: IntelliJ IDEA 2019.3 SQL:Navicat for MySQL 三. ...
- python全栈开发day61-django简单的出版社网站展示,添加,删除,编辑(单表的增删改查)
day61 django内容回顾: 1. 下载: pip install django==1.11.14 pip install -i 源 django==1.11.14 pycharm 2. 创建项 ...
- hibernate对单表的增删改查
ORM: 对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping) 实现对单表的增删改查 向区域表中增加数据: 第一步: 新建一个Da ...
- Django学习笔记(10)——Book单表的增删改查页面
一,项目题目:Book单表的增删改查页面 该项目主要练习使用Django开发一个Book单表的增删改查页面,通过这个项目巩固自己这段时间学习Django知识. 二,项目需求: 开发一个简单的Book增 ...
- django模型层 关于单表的增删改查
关于ORM MTV或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库, 通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员 ...
- Mybatis(一)实现单表的增删改查
1.1 什么是Mybatis MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并 ...
- 1.SSM整合_单表的增删改查
目标:增删改查 环境:Maven+Eclipse+Tomcat7+JDK7 思维导图: 表结构 目录结构 依赖 <dependencies> <dependency> < ...
随机推荐
- java:集合输出Iterator,ListIterator,foreach,Enumeration
//集合输出,集合的四种输出 Iterator, ListIterator, foreach, Enumeration 只要碰到集合,第一输出选择是Iterator类. Iterator<E&g ...
- Python---TKinter项目实战---屏保
### 项目分析 - 屏保可以自己启动,也可以手动启动 - 一旦敲击键盘或者移动鼠标后,或者其他的引发时间,则停止 - 如果屏保是一幅画的话,则没有画框 - 图像的动作是随机的,具有随机性,可能包括颜 ...
- 消息中间件之 RocketMQ
参考文档: http://jm.taobao.org/2017/01/12/rocketmq-quick-start-in-10-minutes/ http://rocketmq.apache.org ...
- 【leetcode】622. Design Circular Queue
题目如下: Design your implementation of the circular queue. The circular queue is a linear data structur ...
- springboot日期转换器
注:该功能并非springboot特有的功能,springmvc同样具有 一.使用方法 创建一个DateConverter类实现Converter接口 注:importorg. ...
- python-*args、**kargs用法
可变位置参数: *args:是一个元组,传入的参数会被放进元组里.可变关键字参数: **kwargs:是一个字典,传入的参数以键值对的形式存放到字典里. def test1(*args): print ...
- php array_flip()函数 语法
php array_flip()函数 语法 作用:用于反转/交换数组中所有的键名以及它们关联的键值.富瑞联华 语法:array_flip(array); 参数: 参数 描述 array 必需.规定需进 ...
- Windows Server 2003 IIS 使用 Excel.Application
在Server2003服务器系统中,配置ASP调用CreateObject("Excel.Application")对象 1.先在服务器中安装Microsoft Excel 2.打 ...
- 进阶3: zookeeper-3.4.9.tar.gz和hbase-1.2.4-bin.tar.gz 环境搭建(hbase 伪分布式)
前提条件: 成功安装了 jdk1.8, hadoop2.7.3 注意条件: zookeeper,hbase 版本必须要和hadoop 安装版本相互兼容,否则容易出问题: 本次:安装包 zookee ...
- [HDU6403]:Card Game(dfs+DP+基环树)
题目传送门 题目描述 她依然在我不知道的地方做我不知道的事.桌面上摊开着一些卡牌,这是她平时很爱玩的一个游戏.如今卡牌还在,她却不在我身边.不知不觉,我翻开了卡牌,回忆起了当时一起玩卡牌的那段时间.每 ...