user.java

package cn.itcast.mybatis.po;

import java.util.Date;

public class User {
private int id;
private String username;// 用户姓名
private String sex;// 性别
private Date birthday;// 生日
private String address;// 地址 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 getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", sex=" + sex
+ ", birthday=" + birthday + ", address=" + address + "]";
} }

uese.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">
<!-- namespace命名空间,为了分类管理sql语句,对sql语句进行隔离,方便管理 ,在后面采用mapper开发dao这种方式时使用namespace有特殊作用...
mapper代理开发时将namespace指定为mapper接口的全限定名
-->
<mapper namespace="test">
<!-- 在mapper.xml文件中配置很多的sql语句,每个sql语句封装为一个MappedStatement对象
mapper.xml(就是这里的User.xml)
--> <!-- 根据id查询用户信息 -->
<!--
id:唯一标识 一个statement
#{}:表示 一个占位符(?也表示一个占位符),如果#{}中传入简单类型的参数,#{}中的名称随意
parameterType:输入 参数的类型,通过#{}接收parameterType输入 的参数
resultType:输出结果 类型,不管返回是多条还是单条,指定单条的pojo类型
-->
<select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User">
SELECT * FROM USER WHERE id= #{id} </select> <!-- 根据用户名称查询用户信息,可能返回多条,模糊查询,
${}:表示sql的拼接,通过${}接收参数,将参数的内容不加任何修饰拼接在sql中。 -->
<select id="findUserByName" parameterType="java.lang.String" resultType="cn.itcast.mybatis.po.User">
select * from user where username like '%${value}%'
</select> <!-- 添加用户
parameterType:输入 参数的类型,User对象 包括 username,birthday,sex,address
#{}是占位符可以把字符串的日期类型自动转换为Date类型
#{}接收pojo数据,可以使用OGNL解析出pojo的属性值(OGNL对象导航语言,struts2可以使用OGNL,如果username是一个对象,则可以用#{username.name})
#{username}表示从parameterType中获取pojo的属性值 需求:user对象插入到数据库后,新记录的主键要通过user对象返回,这样就可以通过user获取主键值。
解决思路:
通过LAST_INSERT_ID()函数获取刚插入记录的自增主键值, selectKey:用于进行主键返回,里面定义了获取主键值的sql,在insert语句执行后,执行select LAST_INSERT_ID()就可以获取自增主键。
order:设置selectKey中sql执行的顺序,相对于insert语句来说,AFTER就是在insert语句执行后执行select LAST_INSERT_ID()
keyProperty:将主键值设置到User对象的哪个属性,
resultType:select LAST_INSERT_ID()的结果 类型,就是要插入User对象的id属性的类型,如果User对象的id属性是string则这里就是String。 -->
<insert id="insertUser" parameterType="cn.itcast.mybatis.po.User">
<selectKey keyProperty="id" order="AFTER" resultType="int">
select LAST_INSERT_ID() <!-- 这条语句可以直接在sqldevelop运行 -->
</selectKey> INSERT INTO USER(username,birthday,sex,address) VALUES(#{username},#{birthday},#{sex},#{address})
</insert> <!-- mysql的uuid生成主键 -->
<!-- <insert id="insertUser" parameterType="cn.itcast.mybatis.po.User">
<selectKey keyProperty="id" order="BEFORE" resultType="string">
select uuid() <!-- 这条语句可以直接在sqldevelop运行
</selectKey> INSERT INTO USER(id,username,birthday,sex,address) VALUES(#{id},#{username},#{birthday},#{sex},#{address})
</insert> --> <!-- oracle
在执行insert之前执行select 序列.nextval() from dual取出序列最大值((select 序列.nextval()得到oracle的序列值),将值设置到user对象 的id属性
-->
<!-- <insert id="insertUser" parameterType="cn.itcast.mybatis.po.User">
<selectKey keyProperty="id" order="BEFORE" resultType="int">
select 序列.nextval() from dual <!-- 这条语句可以直接在sqldevelop运行 -->
</selectKey> INSERT INTO USER(id,username,birthday,sex,address) VALUES(#{id},#{username},#{birthday},#{sex},#{address})
</insert> --> <!-- 用户删除 -->
<delete id="deleteUser" parameterType="int">
delete from user where id=#{id}
</delete>
<!-- 用户更新
要求:传入的user对象中包括 id属性值
-->
<update id="updateUser" parameterType="cn.itcast.mybatis.po.User">
update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}
</update> </mapper>

SqlMapConfig.xml

<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration> <!-- 属性定义
加载一个properties文件
在 properties标签 中配置属性值
-->
<properties resource="db.properties">
<!-- <property name="" value=""/> -->
</properties> <!-- 定义 别名 -->
<typeAliases>
<!--
单个别名的定义
alias:别名,type:别名映射的类型 -->
<!-- <typeAlias type="cn.itcast.mybatis.po.User" alias="user"/> -->
<!-- 批量别名定义
指定包路径,自动扫描包下边的pojo,定义别名,别名默认为类名(首字母小写或大写)
-->
<package name="cn.itcast.mybatis.po"/> </typeAliases> <!-- 和spring整合后 environments配置将废除-->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理-->
<transactionManager type="JDBC" />
<!-- 数据库连接池-->
<dataSource type="POOLED">
<!-- 数据库连接参数 -->
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments> <!--加载mapper映射
如果将和spring整合后,可以使用整合包中提供的mapper扫描器,此处的mappers不用配置了。
-->
<mappers>
<!-- resource是classpath,通过resource加载mapper的映射文件 -->
<mapper resource="sqlmap/User.xml" />
<!-- <mapper resource="mapper/UserMapper.xml" /> -->
<!-- 通过class引用mapper接口
class:配置mapper接口全限定名
要求:需要mapper.xml和mapper.java同名并且在一个目录 中
-->
<!-- <mapper class="cn.itcast.mybatis.mapper.UserMapper"/> -->
<!-- 批量mapper配置
通过package进行自动扫描包下边的mapper接口,
要求:需要mapper.xml和mapper.java同名并且在一个目录 中 -->
<package name="cn.itcast.mybatis.mapper"/> </mappers> </configuration>

Test.java

package cn.itcast.mybatis.first;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List; 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.junit.Before;
import org.junit.Test; import cn.itcast.mybatis.po.User; public class MybatisFirst { // 会话工厂
private SqlSessionFactory sqlSessionFactory; // 创建工厂
@Before //before注解
public void init() throws IOException { // 配置文件(SqlMapConfig.xml)
String resource = "SqlMapConfig.xml"; // 加载配置文件到输入 流
InputStream inputStream = Resources.getResourceAsStream(resource); // 创建会话工厂
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } // 测试根据id查询用户(得到单条记录)
@Test
public void testFindUserById() { // 通过sqlSessionFactory创建sqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // 通过sqlSession操作数据库
// 第一个参数:statement的位置,等于namespace+statement的id
// 第二个参数:传入的参数
//返回user
User user = null;
try {
user = sqlSession.selectOne("test.findUserById", );
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭sqlSession
sqlSession.close();
} System.out.println(user); } // 测试根据id查询用户(得到单条记录)
@Test
public void testFindUserByName() { // 通过sqlSessionFactory创建sqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // 通过sqlSession操作数据库
// 第一个参数:statement的位置,等于namespace+statement的id
// 第二个参数:传入的参数
List<User> list = null;
try {
list = sqlSession.selectList("test.findUserByName", "小明");
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭sqlSession
sqlSession.close();
} System.out.println(list.get().getUsername()); } // 测试根据id查询用户(得到单条记录)
@Test
public void testInsertUser() { // 通过sqlSessionFactory创建sqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // 通过sqlSession操作数据库
// 创建插入数据对象
User user = new User();
user.setUsername("浪子燕青");
user.setAddress("河南郑州");
user.setBirthday(new Date());
user.setSex(""); try {
sqlSession.insert("test.insertUser", user);
// 因为没有设置成自动提交,所以需要提交事务,以后与spring 自动整合之后通过spring管理这些类就自动提交了。
//调试的时候把myeclips编译好的控制台打印的sql语句放入sqlserver软件中进行手动调试
sqlSession.commit(); } catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭sqlSession
sqlSession.close();
}
//打印主键,比如2个表关联,把副表插入数据库之后把外键插入主表中
//不用<selectKey/>就没有主键id返回(此时id为null),
//需求:user对象插入到数据库后,新记录的主键要通过user对象返回,这样就可以通过user获取主键值。
System.out.println("用户的id=" + user.getId()); } // 测试根据id删除用户(得到单条记录)
@Test
public void testDeleteUser() { // 通过sqlSessionFactory创建sqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // 通过sqlSession操作数据库
try {
sqlSession.delete("test.deleteUser", );
// 需要提交事务
sqlSession.commit(); } catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭sqlSession
sqlSession.close();
} } // 测试根据id更新用户(得到单条记录)
@Test
public void testUpdateUser() { // 通过sqlSessionFactory创建sqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // 通过sqlSession操作数据库
// 创建更新数据对象,要求必须包括 id
User user = new User();
user.setId();
user.setUsername("燕青");
user.setAddress("河南郑州");
// user.setBirthday(new Date());
user.setSex(""); try {
sqlSession.update("test.updateUser", user);
// 需要提交事务
sqlSession.commit(); } catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭sqlSession
sqlSession.close();
} System.out.println("用户的id=" + user.getId()); } }

mybatis06 增删改差 源码的更多相关文章

  1. ssh框架实现员工部门增删改查源码

    http://pan.baidu.com/s/1qYLspDM 备注:IDE是eclipse,前端使用bootstrap,数据库是mysql

  2. IBatis增删改差的实现以及注意点

    此次进讲述对表操作的实现细节.废话不多说,代码见真章. <?xml version="1.0" encoding="utf-8" ?> <sq ...

  3. android 35 ListView增删改差

    MainActivity package com.sxt.day05_11; import java.util.ArrayList; import java.util.List; import and ...

  4. python与mongodb的交互 增删改差

    首先引入包: pip install pymongo需要用到如下对象: MongoClient对象:用于与MongoDB服务器建立连接 client=MongoClient('主机ip',端口) Da ...

  5. mangodb的基本操作:增删改差

    MongoDB三元素: 1 数据库: 和关系型数据库中数据库的层次相同,内部可以有多个集合. 2 集合: 相当于关系型数据库中的表,存储若干文档,结构不固定 3 文档: 相当于关系型数据库中的行,是J ...

  6. EntityFrameWork简单操作 EF数据上下文对象操作数据增删改差及批处理

    /// <summary> /// EF针对 留言数据库 的 数据上下文对象!!!! /// </summary> static LeaveWordBoradEntities ...

  7. 源码分析 | 手写mybait-spring核心功能(干货好文一次学会工厂bean、类代理、bean注册的使用)

    作者:小傅哥 博客:https://bugstack.cn - 汇总系列原创专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言介绍 一个知识点的学习过程基本分为:运行helloworld ...

  8. 2014年5月份第4周51Aspx源码发布详情

    最基本wcf服务器与客户端交互源码  2014-5-26 [VS2003]源码描述:本示例讲解的是最基本的wcf语法,示例浏览请先运行服务端,然后在运行客户端,适合想要学习wcf的初学者.仅供借鉴,欢 ...

  9. 2014年4月底至5月初51Aspx源码发布详情

    精灵豆会员管理系统源码  2014-4-21 [VS2010]功能介绍:精灵豆会员管理系统业务管理平台采用微软选进的C#语言开发,采用大型数据库,具有比较高的执行效率和高安全性.系统分为消费管理,会员 ...

随机推荐

  1. [原博客] POJ 2975 Nim 统计必胜走法个数

    题目链接题意介绍了一遍Nim取石子游戏,可以看上一篇文章详细介绍.问当前状态的必胜走法个数,也就是走到必败状态的方法数. 我们设sg为所有个数的Xor值.首先如果sg==0,它不可能有必胜走法,输出0 ...

  2. C盘瘦身,可以让你的电脑C盘恢复到刚安装时的大小

    @echo offecho 正在清理系统垃圾文件,请稍等......del /f /s /q %systemdrive%\*.tmpdel /f /s /q %systemdrive%\*._mpde ...

  3. 【Uvalive4960】 Sensor network (苗条树,进化版)

    [题意] 给出N个点,M条边,问这N个点形成的生成树的最大权值边-最小权值边的最小值 InputThe input consists of several test cases, separated ...

  4. linux使用ps1设置命令行提示符

    要自定义命令行提示,需要ps1来设置.完成自定义需要以下几个步骤: 1.编辑~/.bashrc文件 vi ~/.bashrc 2.在.bashrc文件中添加以下一行自定义内容 export PS1=& ...

  5. 通过live555实现H264 RTSP直播

    http://blog.csdn.net/firehood_/article/details/16844397

  6. Win7新建ftp快捷方式(原XP网上邻居中客户端图标)

      2014-6-2 XP逐渐隐退,新机器一般都是Win7或者Win8了.有很多朋友反映在这两个新系统中找不到类似XP网上邻居中的ftp链接图标.故稍微研究了下,以Win7为例,总结如下. 1.骨灰级 ...

  7. TC598 div2

    题意:给一些物品item[],这些物品的重量在101至300之间,要将这些物品全部放进若干个bins中,已知bins盛的重量为300,可以将bins装满也可以不装满, 问放这些物品最少需要几个bins ...

  8. 【转】你应该知道的十个VirtualBox技巧与高级特性

    原文网址:http://www.searchvirtual.com.cn/showcontent_76463.htm VirtualBox集成的许多功能你可能从来没有使用过,即使你经常用它来运行虚拟机 ...

  9. PHP重构之函数上移

    参考<重构> <?php abstract class Customer { public function addBill($date, $amount) { echo " ...

  10. 监控CPU和内存的使用

    监控CPU和内存的使用: #!/bin/bash #script to capture system statistics outfile=/home/rainbow/test/file.csv da ...