实体类:

package com.etc.entity;

public class News
{
private int id;
private String title;
private String content;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
@Override
public String toString() {
return "News [content=" + content + ", id=" + id + ", title=" + title
+ "]";
}
}
========================================================================
dao类: package com.etc.dao; import java.util.List; import com.etc.entity.News; public interface NewsDao
{
List<News> findAll();
News findById(int id);//精确查询
void add(News news);//添加
void update(News news);//修改
void delete(Integer id);//删除
}
==========================================================================
工具类: package com.etc.utils; import java.io.InputStream;
import java.sql.Connection; 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.apache.log4j.lf5.util.Resource; //实现获取、释放mybatis数据库连接的工具类
public class MyBatisSessionFactory {
//定义常量
private static String CONFIG_FILE_LOCATION="mybatis-config.xml"; //考虑到该工具类允许被多线程执行。因为封装1个线程池,让每个线程从线程池中获取1个连接。让1个线程对应
//1条数据库连接,这样更安全
//ThreadLocal的作用:让"线程"绑定"资源",这样就不会出现多个线程同享资源的情况。更安全。牺牲内存,换取”安全“
private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>(); private static InputStream is; //用于读取配置文件的流对象 private static SqlSessionFactory fac;//用于管理多个连接的工厂。一个工厂对应1个数据库。 //在该类的静态段中加载配置文件,这样可以确保只执行1次。
static
{
try {
is = Resources.getResourceAsStream(CONFIG_FILE_LOCATION);//读取配置文件
fac = new SqlSessionFactoryBuilder().build(is);//通过配置文件创建1个连接工厂
} catch (Exception e)
{
e.printStackTrace();
} }
//获取1条连接
public static SqlSession getSession()
{
SqlSession s = threadLocal.get(); //找线程池要1条连接
if(s==null) //第1次时,拿不到,则由工厂获取1条连接并放入线程池
{
s = fac.openSession();//由工厂获取1条连接并放入线程池
threadLocal.set(s);//放入线程池
}
return s;
} //关闭连接
public static void closeSession()
{
SqlSession s = threadLocal.get();//找线程池要本线程对应的连接
threadLocal.set(null);//将该连接从线程池中清除
if(s!=null)
s.close();//物理关闭连接
}
}
=======================================================================
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>
<typeAliases>
<typeAlias type="com.etc.entity.News" alias="News"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="url" value="jdbc:mysql://127.0.0.1/java?characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
<property name="driver" value="com.mysql.jdbc.Driver"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/etc/mapper/News-mapper.xml"/>
</mappers>
</configuration>
========================================================================
News-mapper.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">
<!-- 既是实体的映射文件。类似orm。同时又是dao的实现代码 -->
<mapper namespace="com.etc.dao.NewsDao">
<!-- 配置实体和数据表的映射关系 -->
<resultMap type="News" id="NewsResult">
<id column="id" property="id"/> <!-- 主键 -->
<result column="title" property="title"/>
<result column="content" property="content"/>
</resultMap>
<!-- 查询全部,实现findAdd方法 -->
<select id="findAll" resultMap="NewsResult">
select * from news
</select>
<!-- 精确查询 ,实现findbyid的方法-->
<select id="findById" parameterType="java.lang.Integer" resultType="News">
select * from news where id=#{id}
</select>
<!-- 添加 -->
<insert id="add" parameterType="News" >
insert into news (title,content) values(#{title},#{content})
</insert>
<!-- 修改-->
<update id="update" parameterType="News" >
update news set title=#{title},content=#{content} where id=#{id}
</update>
<!-- 删除 -->
<delete id="delete" parameterType="java.lang.Integer">
delete from news where id=#{id}
</delete>
</mapper>
==========================================================================
测试类: package com.etc.test;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import com.etc.dao.NewsDao;
import com.etc.entity.News;
import com.etc.utils.MyBatisSessionFactory;
public class TestNewsDao {
@Test
public void testFindAll()
{
// 1 获取连接
SqlSession session = MyBatisSessionFactory.getSession();
//2 执行查询
List<News> list = session.getMapper(NewsDao.class).findAll();
for(News n:list)
System.out.println(n);
//3 关闭
MyBatisSessionFactory.closeSession();
}
//@Test
public void testFindById()
{
// 1 获取连接
SqlSession session = MyBatisSessionFactory.getSession();
//2 执行查询
News n = session.getMapper(NewsDao.class).findById(2);
System.out.println(n);
//3 关闭
MyBatisSessionFactory.closeSession();
}
//@Test
public void testadd()
{
// 1 获取连接
SqlSession session = MyBatisSessionFactory.getSession(); //2 执行添加
News n = new News();
n.setTitle("新的主题");
n.setContent("新的内容");
try {
session.getMapper(NewsDao.class).add(n);
session.commit();
System.out.println("添加成功");
} catch (Exception e)
{
System.out.println("添加失败:");
e.printStackTrace();
session.rollback();
}
//3 关闭
MyBatisSessionFactory.closeSession();
}
//@Test
public void testupdate()
{
// 1 获取连接
SqlSession session = MyBatisSessionFactory.getSession(); //2 执行添加
News n = new News();
n.setId(4);
n.setTitle("全新的主题");
n.setContent("全新的内容");
try {
session.getMapper(NewsDao.class).update(n);
session.commit();
System.out.println("修改成功");
} catch (Exception e)
{
System.out.println("修改失败:");
e.printStackTrace();
session.rollback();
}
//3 关闭
MyBatisSessionFactory.closeSession(); }
//@Test
public void testdelete()
{
// 1 获取连接
SqlSession session = MyBatisSessionFactory.getSession();
//2 执行添加
try {
session.getMapper(NewsDao.class).delete(4);
session.commit();
System.out.println("删除成功");
} catch (Exception e)
{
System.out.println("删除失败:");
e.printStackTrace();
session.rollback();
}
//3 关闭
MyBatisSessionFactory.closeSession();
}
}
=========================================================================

  

mybatis---demo1--(单表增删改查)----bai的更多相关文章

  1. Django框架(八)--单表增删改查,在Python脚本中调用Django环境

    一.数据库连接配置 如果连接的是pycharm默认的Sqlite,不用改动,使用默认配置即可 如果连接mysql,需要在配置文件中的setting中进行配置: 将DATABASES={} 更新为 DA ...

  2. Django框架(九)—— 单表增删改查,在Python脚本中调用Django环境

    目录 单表增删改查,在Python脚本中调用Django环境 一.数据库连接配置 二.orm创建表和字段 三.单表增删改查 1.增加数据 2.删除数据 3.修改数据 4.查询数据 四.在Python脚 ...

  3. Mybatis实现部门表增删改查以及排序

    废话不说,直接开门见山! 需要在WebContent下的lib下导入两个包 mybatis-3.2.5.jar ojdbc6.jar package com.xdl.entity; import ja ...

  4. $Django orm增删改字段、建表 ,单表增删改查,Django请求生命周期

    1 orm介绍  ORM是什么   ORM 是 python编程语言后端web框架 Django的核心思想,“Object Relational Mapping”,即对象-关系映射,简称ORM.  一 ...

  5. mysql数据库单表增删改查命令

    数据库DB-database-mysql 课程安排 第一天: 1.数据库定义以及设计 2.mysql服务端的安装 3.mysql-dos操作 库的操作 表的操作 4.mysql客户端navicate工 ...

  6. Django ORM基本的单表增删改查

    创建表 步骤: 1.app下models.py里创建类(继承models.Model) from django.db import models class UserInfo(models.Model ...

  7. ORM之单表增删改查

    ORM之单表增删改查 在函数前,先导入要操作的数据库表模块,model from model所在的路径文件夹 import model   在views文件中,加的路径: #就一个app01功能的文件 ...

  8. MySQL初步理解,简易单表增删改查

    什么是数据库? 存储数据的仓库,本质是一个文件系统,封装了算法和文件之前数据的存储模式 阶段1:集合 数组 变量 缺点:数据存储在内存中,不能实现数据的持久化存储 阶段2:IO流 结合文件 .txt ...

  9. django(七)之数据库表的单表-增删改查QuerySet,双下划线

    https://www.cnblogs.com/haiyan123/p/7738435.html https://www.cnblogs.com/yuanchenqi/articles/6083427 ...

  10. Django ORM字段类型 单表增删改查 万能的双下划线

    1.ORM三种模型 模型之间的三种关系:一对一,一对多,多对多. 一对一:实质就是在主外键(author_id就是foreign key)的关系基础上,给外键加了一个UNIQUE=True的属性: 一 ...

随机推荐

  1. MYSQL数据库字段命名及设计规范

    1.设计原则 1) 标准化和规范化数据的标准化有助于消除数据库中的数据冗余.标准化有好几种形式,但 Third Normal Form(3NF)通常被认为在性能.扩展性和数据完整性方面达到了最好平衡. ...

  2. 算法总结之 在数组中找到出现次数 > N/K的数

    题目1 给定一个整型数组arr,  打印其中出现次数大于一半的数, 如果没有这样的数,打印提示信息 进阶 给定一个整型数组arr, 再给定一个整数K, 打印所有出现次数大于 N/K的数,如果没有这样的 ...

  3. Luogu-4774 [NOI2018]屠龙勇士

    这题好像只要会用set/平衡树以及裸的\(Excrt\)就能A啊...然而当时我虽然看出是\(Excrt\)却并不会...今天又学了一遍\(Excrt\),趁机把这个坑给填了吧 现预处理一下,找出每条 ...

  4. HBase-scan简介及优化(缓存与批量处理)

    扫描(scan) 这种技术类似于数据库系统中的游标(cursor),并利用到了HBase提供的底层顺序存储的数据结构. 扫描操作的使用跟get方法非常类似.由于扫描操作的工作方式类似于迭代器,所以用户 ...

  5. QT paintevent 事件, update()槽函数

    一界面重载函数 使用方法: 1在头文件里定义函数 protected: void paintEvent(QPaintEvent *event); 2 在CPP内直接重载 void ---------- ...

  6. 修改SpringBoot 默认的小叶子图标

    Springboot 项目,在浏览器中访问时,浏览器上导航栏的图标是一片绿色的叶子,我们可以修改它. 将格式为.ico的图片放入以下任一项目文件夹即可.但,图片命名必须为favicon.ico 1.类 ...

  7. springboot项目支持war部署tomcat

    最近在学校spring boot 在网络上学校到简单的启动spring boot项目,也搭建好了,但时实际情况我的spring boot项目是要发布到tomcat中的,今天,随意打了个war包发布到t ...

  8. numpy random 生成随机矩阵

    import numpy as np np.random.rand(a, b): >>> np.random.rand(4,3) array([[ 0.06679473, 0.710 ...

  9. Quartz实现定时任务实例

    1首先实现Job接口,创建任务 public class HelloJob implements Job{ @Override public void execute(JobExecutionCont ...

  10. review39

    不可以在非同步方法中使用wait().notify()和notifyAll().