码迷,mamicode.com
首页 > 其他好文 > 详细

Mybatis入门

时间:2019-12-03 21:23:43      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:ase   sql   命名   参数类型   sel   有一个   classname   static   级别   

Mybatis


1.MyBatis简介

  • Java的持久层框架
  • ORM(对象关系映射)框架

2.MyBatis简单使用

2.1 导包

技术图片

2.2 配值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>
    <!--引入jdbc.propeties文件-->
    <properties resource="jdbc.properties" />
    <!-- 环境们 (很多环境的意思)
        default:默认使用哪一个环境(必需对应一个环境的id)
     -->
   <!--  取别名 typeAliases:配置别名
    注:别名不区别大小写  -->
    <typeAliases>
        <!--单个类的配置-->
       <!--<typeAlias type="cn.itsource.domain.User" alias="xx"/>-->
  <!--以包的形式配置别名,别名就是类名-->
        <package name="cn.itsource.domain" />
    </typeAliases>

    <environments default="development">
        <!--
            一个环境  id:为这个环境取唯一一个id名称
        -->
        <environment id="development">
            <!--
                事务管理   type:JDBC(支持事务)/MANAGED(什么都不做)
            -->
            <transactionManager type="JDBC" />
            <!-- 数据源, 连接池  type(POOLED):MyBatis自带的连接池 -->
            <dataSource type="POOLED">
                <!-- 连接数据库的参数 -->
                <property name="driver" value="${jdbc.driverClassName}" />
                <property name="url" value="${jdbc.url}" />
                <property name="username" value="${jdbc.username}" />
                <property name="password" value="${jdbc.password}" />
            </dataSource>
        </environment>
    </environments>
    <!-- 这个mappers代表的是相应的ORM映射文件 -->
    <mappers>
        <mapper resource="cn/itsource/domain/UserMapper.xml" />
    </mappers>

</configuration>

2.3 配值UserMapper.xm

<?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框架 sql的映射
namespace:命名空间  namespace路径+ id值
          namespace怎么配置 包名.接口名
-->
<mapper namespace="cn.itsource.dao.IUserDao">

    <!--公共sql抽取-->
    <sql id="query">
        <if test="id!= null">
            and  id = #{id}
        </if>
        <if test="name!= null">
            and name like '%${name}%'
        </if>
    </sql>
    <!--查询所有的方法-->
    <select id="findAll" resultType="cn.itsource.domain.User">
        select * from user
    </select>
    <!--查找一个的方法-->
    <select id="findOne" parameterType="long" resultType="cn.itsource.domain.User">
        select  * from  user  where  id = #{id};
    </select>
    <!--
    添加的方法
    useGeneratedKeys:使用主键
    keyColumn:数据库id列
    keyProperty:程序里面User类的属性
    -->
    <insert id="add" parameterType="cn.itsource.domain.User" useGeneratedKeys="true" keyColumn="id" keyProperty="id" >
        insert  into  user(name) values (#{name});
    </insert>
    <!--
    删除的方法
    ${id} 它使用 类里面属性 getId()
    必须要有get方法
    -->
    <delete id="delete" parameterType="long">
        delete from  user where  id=#{id}
    </delete>
    <!--这里参数类型使用了mybatis配置文件里面的别名xx ,因为配置的扫包,别名就是类名-->
    <update id="update" parameterType="User">
        update  user  set name = #{name} where  id= #{id}
    </update>
    <!--批量删除-->
    <delete id="deleteBatch"  parameterType="list" >
        delete  from  user where  id in
        <foreach collection="list" item="id" open="(" separator="," close=")">
            #{id}
        </foreach>
    </delete>
       <!-- 批量添加-->
    <insert id="addBatch" parameterType="list">
        insert  into  user (name) values
        <foreach collection="list" item="user" separator=",">
            (#{user.name})
        </foreach>
    </insert>
       <!--
       批量修改
         List<Long> ids = Arrays.asList(2L,9L,10L);
        Map map = new HashMap();
        map.put("name","123");
        map.put("list",ids);
        直接属性名就可以获取值
       -->
    <update id="updateBatch" parameterType="map">
        update user set  name = #{name} WHERE  id in
        <foreach collection="list" item="id" open="(" separator="," close=")">
            #{id}
        </foreach>
    </update>
        <!--高级查询方法-->
    <select id="findByConditions"  parameterType="cn.itsource.query.UserQuery" resultType="cn.itsource.domain.User">
        select  * from  user
        <!--注意这里用了一个where标签它会自动判断是否只有一个条件一个就不加and-->
        <where>
        <include refid="query"/>
        </where>
    </select>

</mapper>

2.4 抽取SqlSession用枚举

package cn.itsource.util;

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 java.io.IOException;
import java.io.Reader;

public enum SessionUtil {
    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();
    }
}

2.5 具体实现类

package cn.itsource.dao.impl;

import cn.itsource.dao.IUserDao;
import cn.itsource.domain.User;
import cn.itsource.query.UserQuery;
import cn.itsource.util.SessionUtil;
import org.apache.ibatis.session.SqlSession;

import java.util.List;
import java.util.Map;

public class IUserDaoImpl implements IUserDao {
    @Override
    public List<User> findAll() {

        List<User> users = SessionUtil.INSTANCE.getSqlSession().selectList("cn.itsource.dao.IUserDao.findAll");
        return users;
    }

    @Override
    public User findOne(Long id) {
        User user = SessionUtil.INSTANCE.getSqlSession().selectOne("cn.itsource.dao.IUserDao.findOne",id);
        return user;
    }

    @Override
    public void add(User user) {
        SqlSession sqlSession = SessionUtil.INSTANCE.getSqlSession();
        sqlSession.insert("cn.itsource.dao.IUserDao.add", user);
         sqlSession.commit();
    }

    @Override
    public void update(User user) {
        SqlSession sqlSession = SessionUtil.INSTANCE.getSqlSession();
        sqlSession.update("cn.itsource.dao.IUserDao.update",user);
        sqlSession.commit();
    }

    @Override
    public void delete(Long id) {
        SqlSession sqlSession = SessionUtil.INSTANCE.getSqlSession();
        sqlSession.delete("cn.itsource.dao.IUserDao.delete",id);
        sqlSession.commit();
    }

    @Override
    public void deleteBatch(List<Long> ids) {
        SqlSession sqlSession = SessionUtil.INSTANCE.getSqlSession();
        sqlSession.delete("cn.itsource.dao.IUserDao.deleteBatch",ids);
        sqlSession.commit();
    }

    @Override
    public void addBatch(List<User> users) {
        SqlSession sqlSession = SessionUtil.INSTANCE.getSqlSession();
        sqlSession.insert("cn.itsource.dao.IUserDao.addBatch",users);
        sqlSession.commit();
    }

    @Override
    public void updateBatch(Map map) {
        SqlSession sqlSession = SessionUtil.INSTANCE.getSqlSession();
        sqlSession.update("cn.itsource.dao.IUserDao.updateBatch",map);
        sqlSession.commit();
    }

    @Override
    public List<User> findByConditions(UserQuery uq) {
        SqlSession sqlSession = SessionUtil.INSTANCE.getSqlSession();
       List<User>  o = sqlSession.selectList("cn.itsource.dao.IUserDao.findByConditions", uq);
        sqlSession.commit();
         return  o;
    }


}

3 使用日志包


3.1 导包

技术图片

3.2 log4j.properties 日志文件配置

# 日志输出级别 输出到控制
log4j.rootLogger=ERROR, stdout
#log4j.rootLogger=NONE
log4j.logger.cn.itsource=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 使用${id} 与 #{id}的区别

(1)  $ {id} 找的类参数类的里面 getId这个方法,如果有 就不会报错,没有就会报错

(2)  '# 占位符,$ 拼接字符串形式 -- 比较重要点

userMapper.xml
update t_user set name=${name} where id=#{id}
生成语句
update t_user set name=小秋秋 where id=?

$ 拼接字符串方式  --Statement --存在sql注入问题

'# 占位符 -- PreparedStatement

(3) 平时使用比较多还是 #{id}   

(4)  $一般使用在limit+orderby上面 其他情况下 就是使用#

技术图片


5 细节

5.1 主键

有时候,我们保存一个数据,需要拿到主键的,做一些后续的操作

<insert id="save" parameterType="cn.itsource.domain.User"
            useGeneratedKeys="true" keyColumn="id" keyProperty="id">
        insert into t_user(name) values(#{name})
    </insert>

Mybatis入门

标签:ase   sql   命名   参数类型   sel   有一个   classname   static   级别   

原文地址:https://www.cnblogs.com/qdmpky/p/11979414.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!