mybatis的使用和基本注意事项

@Mybatis注意事项
#1.1创建Mybatis-Config.xm,导入相应的jar包

slf4j-log4j12-1.7.2.jar
slf4j-api-1.7.2.jar
mysql-connector-java-5.1.26-bin.jar
mybatis-3.2.1.jar
log4j-1.2.17.jar
javassist-3.17.1-GA.jar
commons-logging-1.1.1.jar
cglib-2.2.2.jar
asm-3.3.1.jar
<?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>
        <!--给类设置别名-->
        <!--<typeAlias type="cn.itsource.domain.User" alias="User"></typeAlias>-->
        <!--给包设置别名-->
        <package name="cn.itsource.domain"></package>
        <package name="cn.itsource.query"></package>
    </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>
1.2配置jdbc.properties`
1.3创建对应的mapper.xml
	namespace的命名空间:持久层(dao)+接口名,dao层的实现类通过namespace和根据不同同条件命名的id唯一确认
```java
<?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的主要功能就是写sql
	mapper:根
	namespace:命令空间 (用来确定唯一) 以前这个是可以不加的,现在必需加 dao层+接口名
     namespace的值,规则的:映射文件XxxMapper.xml所在的包+domain类名+Mapper
 -->
<mapper namespace="cn.itsource.dao.IUserDao">
    <!--
        select : 这里面写查询语句
        id:用来确定这条sql语句的唯一
               以后我们确定唯一,也就是找sql语句 : namespace +.+ id,实现类通过namespace+id唯一确定
             例: cn.itsource.mybatis.day1._1_hello.ProductMapper.get
        parameterType : 传入的参数类型  long:大Long  _long:long (具体的对应请参见文档)
        resultType : 结果类型(第一条数据返回的对象类型) 自己的对象一定是全限定类名
     -->
    <!--传入的参数类型或者返回值可以通过别名来代替
         <typeAliases>
        <package name="cn.itsource.domain"></package>
    </typeAliases>
     -->
    <!--查询所有数据-->
    <select id="queryAll"  resultType="User">
        select * from t_user
    </select>
    <sql id="whereQuery">
        <where>
            <if test="name!=null">
                and name like #{name}
            </if>
            <if test="age!=null">
                and age=#{age}
            </if>
        </where>
    </sql>
    <!--高级查询-->
    <select id="queryList" parameterType="userQuery" resultType="User">
        select * from t_user
        <include refid="whereQuery"></include>
    </select>
    <!--查询单个数据-->
    <select id="queryOne" parameterType="long" resultType="User">
        select * from t_user where id=#{id}
    </select>
    <!--新增
        获取主键,通过主键做其他一些操作
        keyColumn:获取到数据库中主键id,
        keyProperty:指对象中得字段id
        useGeneratedKeys:生成主键
        keyColumn获取到主键,然后传给对象中的id字段(keyProperty),最后通过useGeneratedKeys生成
    -->
    <insert id="save" parameterType="User"
            useGeneratedKeys="true" keyColumn="id" keyProperty="id">
        insert into t_user(name) values(#{name})
    </insert>
    <!--
    <!--修改-->
    <update id="update" parameterType="User">
        update t_user set name=#{name} where id=#{id}
    </update>
    <!--删除-->
    <delete id="delete" parameterType="long">
        delete from t_user where id=#{id}
    </delete>
    <!--
        批量删除,传入的是一个list集合
        collection:说明传入的是什么类型
        open:以什么开始   separator:分隔符  close:以什么结束
        item:每次循环获取到值
        以“(”开始,循环一次获取一个id得值,在添加一个“,",以”)“结束,直到循环结束
        -->
    <delete id="deleteBatch" parameterType="list">
        delete from t_user where id in
        <foreach collection="list" item="id" open="(" separator="," close=")">
            #{id}
        </foreach>

    </delete>
    <!--
        批量新增,传入得是对象
    -->
    <insert id="saveBatch" parameterType="list">
        insert into t_user(name) values
        <foreach collection="list" item="user" separator=",">
            /*添加得是对象姓名,insert into t_user(name) values("xxx"),("yyy")*/
            (#{user.name})
        </foreach>
    </insert>
    <!--批量修改-->
    <update id="updateBatch" parameterType="hashMap">
        update t_user set name="曹操" where id in
        <foreach collection="mapList" item="id" open="(" separator="," close=")">
            #{id}
        </foreach>
    </update>

</mapper>
2.#和$的区别
	   ${id}找的是类里面getId中是否存在id,如果存在则不会报错,不存在则报错
        '#相当于占位符,${name}这相当于拼接
        '#可以解决sql注入问题,相当于PreparedStatement  ${id}相当于Statement
        update t_user set name=${name} where id=#{id}
        生成之后的效果
        update t_user set name=豪哥 where id=-->
 3.获取主键,解决一些后续操作,
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191126234049402.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3pjOTYxNzM=,size_16,color_FFFFFF,t_70)

4.获取日志文件方式
	4.1直接输出打印
	4.2使用日志框架
	导入相应的jar包
	创建log4j.properties资源文件
```java
#OFF(什么都不输出关闭日志信息)< FATAL<ERROR<WARN<INFO<DEBUG<TRACE < ALL (最低级别 什么信息都要输出)
#可以直接从网上搜索
#日志级别,打印到控制台
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

5.mybatis自定义别名

<typeAliases>
        <!--给类设置别名-->
        <!--<typeAlias type="cn.itsource.domain.User" alias="User"></typeAlias>-->
        <!--给包设置别名-->
        <package name="cn.itsource.domain"></package>
        <package name="cn.itsource.query"></package>
    </typeAliases>

6.业务层的使用,需要sqlSesion调用相应的方法
6.1 通过获取reader,连接数据库,读取资源
Reader reader = Resources.getResourceAsReader(“Mybatis-Config.xml”);
6.2 获取到sqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
6.3 获取sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
6.4 通过sqlSession调用相应的方法操作数据库
6.5由于以上四句代码,具有重复性,因此我们可以将其抽取出来,写一个工具类,以后可以直接调用该工具类即可。这里使用的是枚举

public enum  MybatisUtil {
    //枚举
    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();
            System.out.println("配置文件出错!!!"+e.getMessage());
        }
    }
    public SqlSession getSqlSession(){

        return sqlSessionFactory.openSession();
    }
}
 6.6工具类的几种写法

工具类写法:

​ (1) 单例模式

​ 一个类保证只有一个实例

​ 懒汉 饿汉 枚举 线程安全单例

​ (2) 静态方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值