mybaits

白昼怎懂夜的黑 提交于 2019-12-27 02:25:13

  • 持久层框架
  • Apache 的开源项目
  • ORM 对象关系映射
  • 持久化 把数据保存到硬盘中

一、Mybaits是什么?

  • 一个支撑框架
  • 以映射sql语句ORM方式来做数据库持久化操作

二、为什么使用

  • jdbc

    • 重复性代码较多
    • 封装对象麻烦
    • 性能低–>要提高效率,需要自己写缓存
  • mybaits(特点)

    • 没有太多的重复代码

    • 封装对象方便(不用手动处理参数)

    • 性能高

    • sql统一管理,维护方便(把sql语句从java代码中抽取出来)

    • 90%企业在使用

三、mybaits的crud

  • 抽取工具类
    public enum MyBatisUtils {
    	INSTANCE;
    	private static SqlSessionFactory sqlSessionFactory;
    	static {
            Reader reader = null;
              try {
                //读取配置文件
                reader = Resources.getResourceAsReader("MyBatis-Config.xml");
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
              } catch (IOException e) {
                //打印堆栈信息
                e.printStackTrace();
                throw new RuntimeException("解析配置文件出错"+e.getMessage());
              }
    	}
        public SqlSession getSqlSession(){
        	return sqlSessionFactory.openSession();
        }
    }
    
  • 新增
	//调用方法 namespace+id
	sqlSession.insert("xx.xxx.dao.IUserDao.save", user);
    //提交事务
    sqlSession.commit();
  • 修改
	//调用方法 namespace+id
	sqlSession.insert("xx.xxx.dao.IUserDao.update", user);
    //提交事务
    sqlSession.commit();
  • 删除
	//调用方法 namespace+id
	sqlSession.insert("xx.xxx.dao.IUserDao.delete", user);
    //提交事务
    sqlSession.commit();
  • 查询
	//调用方法 namespace+id
	User user = sqlSession.selectOne("xx.xxx.dao.IUserDao.queryOne", id);
    return user;
    
    //查询所有
    List<User> users = sqlSession.selectList("xx.xxx.dao.IUserDao.queryAll");
    return users;

四、细节

4.1 获取主键

<!--
        useGeneratedKeys:使用主键
        keyColumn:数据库id列
        keyProperty:程序里面User类的属性
-->
<insert id="save" parameterType="cn.itsource.domain.User"
	useGeneratedKeys="true" keyColumn="id" keyProperty="id">
 	insert into t_user(name) values(#{name})
 </insert>

4.2 log4j日志

- 日志级别:
	- OFF(什么都不输出关闭日志信息)<FATAL<ERROR<WARN<INFO<DEBUG<TRACE < ALL (最低级别 什么信息都要输出)
- 配置文件 log4j.properties
```
# 日志输出级别,输出到控制台
log4j.rootLogger=ERROR, stdout
# 日志什么都不打印
#log4j.rootLogger=NONE
# 打印日志级别
log4j.logger.cn.hx=TRACE
# 输出到控制台的配置信息
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
# 输出到控制台的格式类
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
```

4.3 mybaits别名

- 内置别名,上网查询
- 自定义别名
```
<typeAliases>
   <!-- 配置单独类-->
   <typeAlias type="xx.xxx.domain.User" alias="user"></typeAlias>
   <!--配置包-->
   <package name="cn.itsource.domain"></package>
</typeAliases>
```

4.4 #和$的区别

- $ {id} 找的类参数类的里面 getId这个方法,如果有 就不会报错,没有就会报错
- '# 占位符,$ 拼接字符串形式
- $一般使用在limit+orderby上面 其他情况下 就是使用#

五、批量操作数据

  • 删除
<!--
    delete from t_user where id in ( ? , ? ) 批量删除:
    collection="list":传入的list,相当于map的key,通过list得到传入的整个集合的值;
    index="index" :每次循环的索引
    item="id" :每次循环的这个值
    open="(" :以什么开始
    separator=",":分隔符
    close=")":以什么结束
-->
<!--批量删除-->
<delete id="deleteBatch" parameterType="list">
    delete from t_user where id in
    <foreach collection="list" item="id" open="(" separator="," close=")">
        #{id}
    </foreach>
</delete>
  • 新增
<!--批量新增-->
<!--insert into t_user(name) values ('xxx'),('yyyy')-->
<insert id="saveBatch" parameterType="list">
	insert into t_user(name) values
	<foreach collection="list" item="user" separator=",">
	    (#{user.name})
	</foreach>
</insert>
  • 修改
<!--批量修改-->
<!--update t_user set name=?where id=(?,?)-->
<insert id="saveBatch" parameterType="list">
	insert into t_user(name) values
	<foreach collection="list" item="user" separator=",">
	    (#{user.name})
	</foreach>
</insert>

六、动态sql

<sql id="whereSql">
	<if test="name!=null">
	    and name like #{name}
	</if>
	<if test="age!=null">
	    and age = #{age}
	</if>
 </sql>
 
<!--高级查询方法-->
<select id="queryList" parameterType="userQuery" resultType="User">
    select * from t_user
    <where>
        <include refid="whereSql"></include>
    </where>
</select>
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!