mybatis框架入门

1.mybatis框架入门

1.1 mybatis框架的认识:

Java的持久层框架

它是ORM(对象关系映射)的框架

Mybatis是一个支撑框架,它以映射sql语句orm方式来数据库持久化操作.

1.2 mybatis的特点(与jdbc相比)

jdbc:

重复性代码比较多

封装对象 insert(User user) select 比较麻烦

没有性能控制 如果要提高效率 需要自己写缓存 一级缓存 二级缓存 EntityManagerFactory(配置才能使用)

mybatis 特点:

没有太多重复代码

封装对象(不用手动处理参数) -->select User对象

性能控制 缓存

(把sql从代码抽取出来)sql统一管理,维护比较方便

企业90%都在使用mybatis – 大型项目在使用

2.使用mybatis

2.1 导包

导入mybatis相关包和日志相关包
在这里插入图片描述

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)
     -->
    <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/hr/domain/UserMapper.xml" />
    </mappers>
</configuration>
2.3 配置jdbc.properties文件
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///mybatis
jdbc.username=root
jdbc.password=****
2.4 数据库自行建表不要忘记!!!

3.mybatis完成简单的crud

3.1 创建domain
public class User {

    private Long id;
    private String name;

3.2 在domain包下配置UserMapper.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">
<!-- orm框架 sql的映射
namespace:命名空间  namespace路径+ id值
          namespace怎么配置 包名.接口名 + queryAll
          parameterType:参数类型
-->
<mapper namespace="cn.hr.dao.IUserDao">
    <!-- 查询 queryAll()
        resultType 返回类型
    -->
    <select id="queryAll" resultType="cn.hr.domain.User">
        select * from t_user
    </select>
    <!-- java.lang.Long mybatis内置别名-->
    <select id="queryOne" parameterType="long" resultType="cn.hr.domain.User">
        select * from t_user where id=#{id}
    </select>

    <!-- 新增 name-->
    <insert id="save" parameterType="cn.hr.domain.User">
        insert into t_user(name) values(#{name})
    </insert>

    <!-- 修改-->
    <update id="update" parameterType="cn.hr.domain.User">
        update t_user set name=#{name} where id=#{id}
    </update>

    <!-- 删除-->
    <delete id="delete" parameterType="long">
        delete from t_user where id=#{id}
    </delete>
3.3 创建dao daoimpl
public interface IUserDao {
    void save(User user) throws IOException;
    void update(User user) throws IOException;
    void delete(Long id) throws IOException;
    User queryOne(Long id) throws IOException;
    List<User> queryAll() throws IOException;
}

 @Override
    public User queryOne(Long id) throws IOException {
        //调用mapper.xml的select方法
        Reader reader = Resources.getResourceAsReader("MyBatis-Config.xml");
        //得到SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        //通过sqlSessionFactory得到sqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //调用方法 namespace+id
        User user = sqlSession.selectOne("cn.hr.dao.IUserDao.queryOne", id);
        return user;
    }
    @Override
    public void save(User user) throws IOException {
        //调用mapper.xml的select方法
        Reader reader = Resources.getResourceAsReader("MyBatis-Config.xml");
        //得到SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        //通过sqlSessionFactory得到sqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //调用方法 namespace+id
       sqlSession.insert("cn.hr.dao.IUserDao.save", user);
       //提交
        sqlSession.commit();
    }

    @Override
    public void update(User user) throws IOException {
        //事务
        //调用mapper.xml的select方法
        Reader reader = Resources.getResourceAsReader("MyBatis-Config.xml");
        //得到SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        //通过sqlSessionFactory得到sqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //调用方法 namespace+id
        sqlSession.update("cn.hr.dao.IUserDao.update", user);
        sqlSession.commit();
    }

    @Override
    public void delete(Long id) throws IOException {
        //事务
        //调用mapper.xml的select方法
        Reader reader = Resources.getResourceAsReader("MyBatis-Config.xml");
        //得到SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);

        //通过sqlSessionFactory得到sqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //调用方法 namespace+id
        sqlSession.delete("cn.hr.dao.IUserDao.delete", id);
        sqlSession.commit();
    }
3.4 由于重复代码太多 抽取公共代码
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();
    }
}
3.4 调用工具类方法
 @Override
    public List<User> queryAll() throws IOException {
        SqlSession sqlSession = MyBatisUtils.INSTANCE.getSqlSession();
        //调用方法 namespace+id
        List<User> users = sqlSession.selectList("cn.hr.dao.IUserDao.queryAll");
        return users;
    }

4.1 测试

在这里就不测了~~~~

5 mybatis细节点

5.1 主键

如何在能操作时拿到我们的主键,并打印在控制台
在UserMapper.xml中加入配置

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

参数可自行修改 不会请百度

# 日志输出级别 输出到控制  
log4j.rootLogger=ERROR, stdout
#log4j.rootLogger=NONE
log4j.logger.cn.hr=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.3 别名
5.3.1 内置别名 (见图)

在这里插入图片描述

5.3.2 自定义别名(在MyBatis-Config.xml中配置)
<typeAliases>
       <!-- 配置单独类
         <typeAlias type="cn.hr.domain.User" alias="user"></typeAlias>
       -->
       <!--配置包 项目,添加了包之后,类名就是别名-->
       <package name="cn.hr.domain"></package>
    </typeAliases>

测试使用别名

//别名前的保存方法
 <insert id="save" parameterType="cn.hr.domain.User">
        insert into t_user(name) values(#{name})
    </insert>
//别名后的保存方法
<select id="queryOne" parameterType="long" resultType="User">
        select * from t_user where id=#{id}
    </select>
5.3.3 #和$的区别

(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上面 其他情况下 就是使用#

6 批量操作(修改UserMapper.xml)

6.1 批量删除(与批量修改差不多)
 <delete id="deleteBatch" parameterType="list">
        delete from t_user where id in
        <foreach collection="list" item="id" open="(" separator="," close=")">
            #{id}
        </foreach>
    </delete>
6.2 批量新增
<insert id="saveBatch" parameterType="list">
        insert into t_user(name) values
        <foreach collection="list" item="user"  separator="," >
            (#{user.name})
        </foreach>

    </insert>

7 mybatis动态修改(修改UserMapper.xml)

<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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值