MyBatis对数据库的CRUD(一些标签的使用)

来源:互联网 发布:c#怎么读取串口数据 编辑:程序博客网 时间:2024/05/22 17:46

SQL映射文件

 SQL 映射文件结构:
  cache -  配置给定命名空间的缓存。
  cache-ref –  从其他命名空间引用缓存配置。
  resultMap  –  最复杂,也是最有力量的元素,用来描述如何从数据库结果集中来加载对象。l
  sql –  可以重用的SQL 块,也可以被其他语句引用。
  insert –  映射插入语句
  update –  映射更新语句
  delete –  映射删除语句
  select –  映射查询语句


代码演示:

这里继续在上次的项目中写的,所以一些配置文件和工具类这里不再重复贴,可参考上一篇文章。


Demo2.java

package cn.hncu.demo;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import org.apache.ibatis.session.SqlSession;import org.junit.Test;import cn.hncu.domain.User;import cn.hncu.utils.SqlSessionUtils;public class Demo2 {@Test//演示insert操作public void test1() throws SQLException{//先获取SqlSessionSqlSession s=SqlSessionUtils.getSqlSession();System.out.println("AutoCommit: "+s.getConnection().getAutoCommit());// false---mybatis是默认带事务的,即不会自动提交User u=new User();u.setId("6");u.setName("小二");u.setPwd("555555");s.insert("users.insertUser", u);s.commit();//必须手动提交,不然不会写入数据库s.close();}@Test//演示update操作public void test2() throws SQLException{//先获取SqlSessionSqlSession s=SqlSessionUtils.getSqlSession();User u=new User();u.setId("3");u.setName("小李");u.setPwd("548634");s.insert("users.updateUser", u);s.commit();//必须手动提交,不然不会写入数据库s.close();}@Test//演示delete操作public void test3() throws SQLException{//先获取SqlSessionSqlSession s=SqlSessionUtils.getSqlSession();User u=new User();u.setId("6");u.setName("小奇");//u.setPwd("555555");System.out.println(u);s.delete("users.deleteUser", u);s.commit();//必须手动提交,不然不会写入数据库s.close();}@Test//演示sql标记操作的使用public void test4() throws SQLException{//先获取SqlSessionSqlSession s=SqlSessionUtils.getSqlSession();List<User> users=s.selectList("sqlDemo");System.out.println(users);}@Test//演示自动生成主键,并读取生成主键   //方法1:纯jdbc技术public void test5() throws SQLException{//先获取SqlSessionSqlSession s=SqlSessionUtils.getSqlSession(true);//关闭事务---每次操作都会自动提交Connection con=s.getConnection();String sql="insert into cpu(name) values('intel4')";Statement st=con.createStatement();st.executeUpdate(sql,st.RETURN_GENERATED_KEYS);ResultSet set=st.getGeneratedKeys();set.next();int k=set.getInt(1);System.out.println("k: "+k);//s.commit(true);}@Test//演示自动生成主键,并读取生成主键   //方法1:用mybatis方法实现public void test6() throws SQLException{//先获取SqlSessionSqlSession s=SqlSessionUtils.getSqlSession(true);//关闭事务---每次操作都会自动提交Map<String,Object> map=new HashMap<String,Object>();map.put("name", "cmd3");s.insert("autoKeys",map);System.out.println("map: "+map);}/////////////动态sql技术////////////////////////@Test   //<if>public void test7() throws SQLException{//先获取SqlSessionSqlSession s=SqlSessionUtils.getSqlSession(true);//关闭事务---每次操作都会自动提交User user=new User();//user.setId("%2%");//注:% 只有和like匹配才能实现模糊查询user.setName("%小%");user.setPwd("%54%");List<User> users=s.selectList("dyncUser1", user);System.out.println("user: "+users);}@Test   //<where>public void test8() throws SQLException{//先获取SqlSessionSqlSession s=SqlSessionUtils.getSqlSession(true);//关闭事务---每次操作都会自动提交User user=new User();user.setId("2");//注:% 只有和like匹配才能实现模糊查询//user.setName("%小%");//user.setPwd("%54%");List<User> users=s.selectList("dyncUser2", user);System.out.println("user: "+users);}@Test   //<trim>public void test9() throws SQLException{//先获取SqlSessionSqlSession s=SqlSessionUtils.getSqlSession(true);//关闭事务---每次操作都会自动提交User user=new User();user.setId("5");//注:% 只有和like匹配才能实现模糊查询user.setName("%小%");List<User> users=s.selectList("dyncUser3", user);System.out.println("user: "+users);}@Test   //<set>public void test10() throws SQLException{//先获取SqlSessionSqlSession s=SqlSessionUtils.getSqlSession(true);//关闭事务---每次操作都会自动提交User user=new User();user.setId("5");user.setName("%小%");s.update("dyncUpdate1",user);}@Test   //<set>public void test11() throws SQLException{//先获取SqlSessionSqlSession s=SqlSessionUtils.getSqlSession(true);//关闭事务---每次操作都会自动提交List<Object> list=new ArrayList<Object>();list.add(1);list.add("3");list.add("4");List<User> users=s.selectList("dyncQuery",list);System.out.println("users:"+users);}}

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="users"><select id="all" resultType="cn.hncu.domain.User">select * from users</select><!-- 以下演示对数据库的CRUD --><!-- 插入insert --><insert id="insertUser" parameterType="User">insert into users(id,name,pwd) values(#{id},#{name},#{pwd})</insert><!-- 更改update --><update id="updateUser" parameterType="User">update users set name=#{name},pwd=#{pwd} where id=#{id}</update><!-- 删除delete --><delete id="deleteUser" parameterType="User">delete from users where id=#{id}<if test="name!=null">or name=#{name}</if><if test="#{pwd}!=null">and pwd=#{pwd}</if></delete><!-- 演示sql标记(定义sql片段) --><sql id="sql_1">id,name,pwd</sql><select id="sqlDemo" resultType="User">select <include refid="sql_1" /> from users</select><!-- 利用mybatis功能实现自动增长主键并获取该值(返回的主键值放在hashmap中,keyColumn指定数据库表格,keyProperty指定返回值在hashmap的key) --><insert id="autoKeys" parameterType="hashmap"keyColumn="id" keyProperty="rid" useGeneratedKeys="true">insert into cpu(name) values(#{name})</insert><!-- 动态sql技术 --><select id="dyncUser1" parameterType="User" resultType="cn.hncu.domain.User">select * from users where 1=1<if test="id!=null">and id=#{id}</if><if test="name!=null">and name like #{name}</if><if test="pwd!=null">and pwd like #{pwd}</if></select><select id="dyncUser2" parameterType="User" resultType="cn.hncu.domain.User">select * from users <where><!-- 功能相当于 where 1=1 --><if test="id!=null">and id=#{id}</if><if test="name!=null">and name like #{name}</if><if test="pwd!=null">and pwd like #{pwd}</if></where></select><select id="dyncUser3" parameterType="User" resultType="cn.hncu.domain.User">select * from users <trim prefix="where" prefixOverrides="and|or"><!-- 会把where加上并且把第一个and或者是or 剪掉 --><if test="id!=null">or id=#{id}</if><if test="name!=null">and name like #{name}</if><if test="pwd!=null">and pwd like #{pwd}</if></trim></select><update id="dyncUpdate1" parameterType="User">update users <set><if test="name!=null">name=#{name},</if><if test="pwd!=null">pwd=#{pwd},    <!-- 这个 , 是多余的,mybatis会自动清除 --></if></set>where id=#{id}</update><select id="dyncQuery" resultType="User" parameterType="list"><!-- select * from users where id in("1","3","4") -->select * from users where id in<foreach collection="list" item="val" index="idx"open="("separator=","close=")">#{val}</foreach></select></mapper>


SqlSessionUtils有一处改动:即增加了如下一个方法
public static SqlSession getSqlSession(boolean boo){return sessionFactory.openSession(boo);//con.setAutoCommit(boo)}

缓存—cache

缓存技术是一种“以空间换时间”的设计理念,利用内存空间资源来提高数据检索速度的有效手段之一。
 MyBatis默认情况下是没有开启缓存的,除了局部的session 缓存。要开启二级缓存,你需要在你的SQL映射文件中添加一行:

    <cache/>


例如:
<cache 
eviction="FIFO" 
flushInterval="60000" 
size="512" 
readOnly="true"/> 
  这个配置创建了一个 FIFO 缓存,并每隔 60 秒刷新,存取512 个结果对象或列表的引用,而且返回的对象为只读,因此在不同线程中的调用者之间修改它们会导致冲突。


可用的收回策略
LRU –  最近最少使用的:移除最长时间不被使用的对象;
FIFO –  先进先出:按对象进入缓存的顺序来移除它;
SOFT –  软引用:移除基于垃圾回收器状态和软引用规则的对象;
WEAK –  弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象;
默认的是 LRU。


注意:mybatis是默认带事务的,即不会自动提交。所以以后用mybatis对数据库进行增删改时要记得手动提交事务!
更多注意细节在代码中已标明。

0 0
原创粉丝点击