Mybatis的增删改查例子及其总结

准备工作
1.新建数据库表
首先新建一个user和user_copy两张数据库表
字段为id,username,birthday,sex,address
(user里的id为自增user_copy里的id不为自增)
2.新建pojo类
user和user2类
以下为user类代码
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 + ", ordersList=" + ordersList + "]";
	}
}
3.新建sqlMapConfig.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>
<!-- 配置数据源 和事务信息 -->
	<environments default="development">
		<environment id="development">
		<!-- 事务管理器 使用jdbc事务 -->
			<transactionManager type="JDBC"></transactionManager>
		<!-- 连接数据池 -->
			<dataSource type="POOLED">
			<!-- 属性 -->
				<property name="driver" value="com.mysql.jdbc.Driver"/>
				<property name="url" value="jdbc:mysql://localhost:3306/mybatis0202?characterEncoding=utf-8"/>
				<property name="username" value="root"/>
				<property name="password" value="zzj6660534"/>
			</dataSource>
		</environment>
	</environments>
	
	<mappers>
		<!-- 加载映射文件 -->
		<mapper resource="sqlmap/Users.xml"/>
	</mappers>
</configuration>
4.新建映射文件信息User.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="test"><!-- 命名空间namespace -->
	<!-- 映射文件信息
		id:映射sql的一个表示
		parameterType 输入参数的类型 int
		#{}表示一个占位符,简单类型里面的参数名任意
		
		resultType sql输出结果映射的对象类型
	 -->
	<select id="findUserById" parameterType="int" resultType="cn.mybatis.po.User">
		select * from user where id=#{value}
	</select>
	
	<!-- 模糊检索 -->
	<!-- ${} 拼接sql串 但是有可能引起sql注入
		${value} 接收输入参数的内容 如果是简单类型 ${} 只能用value
	 -->
	<select id="findUserByName" parameterType="java.lang.String" resultType="cn.mybatis.po.User">
		select * from user where username like '%${value}%'
	</select>
	<!-- 模糊检索使用#{}方式 -->
	<select id="findUserByName1" parameterType="java.lang.String" resultType="cn.mybatis.po.User">
		select * from user where username like "%"#{value}"%"
	</select>
	
	<!-- 添加用户
		parameterType输入参数类型 pojo
		#{}中指定的属性名
	 -->
	<insert id="insertUser" parameterType="cn.mybatis.po.User">
		<!-- 
			主键自增
			将插入数据的主键 返回到user对象里 
			keyProperty将查询到的主键值设置到parameterType指定的那个属性中(这里是id中)
			order: select last_insert_id()执行顺序 相对与insert之后-->
		<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
			select last_insert_id()
		</selectKey>
		insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
	</insert>
	
	<insert id="insertUserByUuid" parameterType="cn.mybatis.po.User2">
		<!--
			插入自动生成主键 
			将插入数据的主键 返回到user对象里 
			keyProperty将查询到的主键值设置到parameterType指定的那个属性中
			order: select last_insert_id()执行顺序 相对与insert之前-->
		<selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
			select uuid()
		</selectKey>
		insert into user_copy(id,username,birthday,sex,address) values(#{id},#{username},#{birthday},#{sex},#{address})
	</insert>
	
	<!-- 使用oracle 用序列当主键 
	<insert id="insertUser" parameterType="cn.mybatis.po.User">
		<selectKey keyProperty="id" order="BEFORE" resultType="java.lang.Integer">
			select 序列名nextval()
		</selectKey>
		insert into user(id,username,birthday,sex,address) values(#{id},#{username},#{birthday},#{sex},#{address})
	</insert>-->
	
	<!-- 删除用户 -->
	<delete id="deleteUser" parameterType="java.lang.Integer">
		delete from user where id = #{id}
	</delete>
	
	<!-- 修改 -->
	<update id="updateUser" parameterType="cn.mybatis.po.User">
		update user set username = #{username},birthday = #{birthday},sex = #{sex},address = #{address}
		where id = #{id}
	</update>
</mapper>
5.在MyBatisFirst类使用Test单元测试
package cn.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.Test;

import cn.mybatis.po.User;
import cn.mybatis.po.User2;

public class MybatisFrist {
	
	@Test
	public void findUserByIdTest() throws Exception{
		//mybatis 配置文件
		String resource = "SqlMapConfig.xml";
		
		//获取文件流
		InputStream inputStream = Resources.getResourceAsStream(resource);
		
		//创建会话工厂 SqlSessionFactoryBuilder构造器
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
		
		//创建会话
		SqlSession sqlSession = sqlSessionFactory.openSession();
		
		//通过sqlSession操作数据库
		//第一个参数 映射文件中statment的id 就是namespace+id
		//第二个参数 映射parameterType的参数
		User user = sqlSession.selectOne("test.findUserById",10);
		
		System.out.println(user);
		
		sqlSession.close();
	}
	
	@Test//模糊查詢
	public void findUserByNameTest() throws Exception  {
		//mybatis 配置文件
		String resource = "SqlMapConfig.xml";
		
		//获取文件流
		InputStream inputStream = Resources.getResourceAsStream(resource);
		
		//创建会话工厂
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
		
		//创建会话
		SqlSession sqlSession = sqlSessionFactory.openSession();
		
		//通过sqlSession操作数据库
		//第一个参数 映射文件中statment的id 就是namespace+id
		//第二个参数 映射parameterType的参数
		List<User> list = sqlSession.selectList("test.findUserByName1","明");
		
		System.out.println(list);
		
		sqlSession.close();
	}
	
	
	@Test
	public void insertUserTest() throws Exception{
		//mybatis 配置文件
		String resource = "SqlMapConfig.xml";
		
		//获取文件流
		InputStream inputStream = Resources.getResourceAsStream(resource);
		
		//创建会话工厂
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
		
		//创建会话
		SqlSession sqlSession = sqlSessionFactory.openSession();
		
		User user = new User();
		user.setUsername("tom");
		user.setBirthday(new Date());
		user.setSex("1");
		user.setAddress("天津");
		System.out.println("执行前"+user);
		
		int res = sqlSession.insert("test.insertUser", user);
		System.out.println(res);
		System.out.println("执行后"+user);
		
		sqlSession.commit();
		
		sqlSession.close();
	}
	
	@Test
	public void insertUserByUuidTest() throws Exception{
		//mybatis 配置文件
		String resource = "SqlMapConfig.xml";
		
		//获取文件流
		InputStream inputStream = Resources.getResourceAsStream(resource);
		
		//创建会话工厂
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
		
		//创建会话
		SqlSession sqlSession = sqlSessionFactory.openSession();
		
		User2 user = new User2();
		user.setUsername("jack");
		user.setBirthday(new Date());
		user.setSex("1");
		user.setAddress("天津");
		System.out.println("执行前"+user);
		
		int res = sqlSession.insert("test.insertUserByUuid", user);
		System.out.println(res);
		System.out.println("执行后"+user);
		
		//提交事务
		sqlSession.commit();
		//资源释放
		sqlSession.close();
	}
	
	@Test
	public void deleteUserTest() throws Exception{
		//mybatis 配置文件
		String resource = "SqlMapConfig.xml";
		
		//获取文件流
		InputStream inputStream = Resources.getResourceAsStream(resource);
		
		//创建会话工厂
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
		
		//创建会话
		SqlSession sqlSession = sqlSessionFactory.openSession();
		
		sqlSession.delete("test.deleteUser",31);
		
		sqlSession.commit();
		
		sqlSession.close();
	}
	
	@Test//更新必须设置id
	public void updateUserTest() throws Exception{
		//mybatis 配置文件
		String resource = "SqlMapConfig.xml";
		
		//获取文件流
		InputStream inputStream = Resources.getResourceAsStream(resource);
		
		//创建会话工厂
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
		
		//创建会话
		SqlSession sqlSession = sqlSessionFactory.openSession();

		User user = new User();
		user.setUsername("zhangsan123");
		user.setBirthday(new Date());
		user.setSex("1");
		user.setAddress("天津");
		user.setId(30);
		
		sqlSession.update("test.updateUser", user);
		
		sqlSession.commit();
		
		sqlSession.close();
	}
}
总结
1.parameterType 在映射文件中通过parameterType指定输入参数类型

2.resultType 在映射文件中通过resultType指定输出结果类型

3.#{}/${}
	1.#{}表示一个占位符号,接收输入参数,类型可以是简单类型,pojo hasmap。
	如果接收简单类型,可以写成value或其他名称;
	接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性……的方式来获取对象属性
	2.${}表示一个拼接符号,会引入sql注入(所以不建议使用)接收输入参数 可以是简单类型,pojo,hasmap 
	如果接收简单类型 只能写value 
	接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性……的方式获取对象属性值
	
4.selectOne和selectList
	1.selectOne表示查询出一条记录进行映射。如果使用selectOne可以实现(list中也只有一个对象)
	2.selectList表示查询出一个列表(多条记录)进行映射。如果使用selectList查询多条记录,不能使用selectOne
	
5.mybatis和hibernate本质区别和应用场景
	1.hibernate是一个标准ORM框架(对象映射关系)。不需要程序写sql,sql语句自动生成。对sql语句进行优化,修改比较困难的。
	应用适用于需求变化不多的中小型项目,如后台管理系统 erp orm oa……
	2.mybatis专注是sql本身,需要程序员自己编写sql语句,sql修改,优化比较方便。
	mybatis是一个不完全的orm框架,虽然程序员自己写sql,mybatis也可以实现映射(输出映射,输入映射)
	使用与需求变化较多的项目,如互联网项目
	
5.mybatis解决jdbc编程问题
	1.数据库链接创建,释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接尺可以解决此问题
		解决:在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接
	2.sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql改变需要改变java代码
		解决:将sql语句配置在XXXXmapper.xml文件中与java代码分离
	3.向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应
		解决:mybatis自动将java对象映射至sql语句,通过statement中的parameterType定义参数的类型
	4.对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便
		解决:mybatis自动将sql执行结果映射至java对象,通过statement中的resultType定义输出结果类型
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值