MyBatis学习总结(四)

properties属性

需求:将数据库连接参数单独配置在db.properties中,只需要在db.properties中加载db.properties的属性值
在sqlMapConfig.XML中就不需要对数据库连接参数硬编码
将数据库连接参数支配置在db.properties中,原因,方便对参数进行统一管理,其他XML可以引用该db.properties
在src根目录下创建db.properties文件

db.properties代码如下:

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/sql_mybatis?serverTimezone=UTC
jdbc.username=root
jdbc.password=root

在sqlMapConfig.XML加载属性文件

接下来自行测试

附加
<properties resource="db.properties">
   <!-- properties中还可以配置一些属性名和属性值-->
   <!-- <property name="jdbc.driver" value=""/>-->
</properties>

注意:MyBatis将按照下面的顺序来加载属性

  • properties元素体内定义的属性首先被读取
  • 然后会读取properties元素中resourceurl加载的属性,他会覆盖以读取的同名属性
  • 最后读取parameterType传递的属性,他会覆盖以读取的同名属性

因此,通过parameterType传递的属性具有最高优先级,resourceurl加载的属性次之,最低优先级是parperties元素体内定义的属性

typeAliases(别名)

需求
在mapper.xml中,定义很多的statement,statement需要parameterType指定输入参数的类型,需要resultType指定输入结果的映射类型
好处
如果在指定类型时输入类型全路径,不方便进行开发,可以针对parameterType或resultType指定的类型定义一些别名,在mapper.xml中通过别名定义,方便开发

之前写parameterType类型的时候,写int和java.long.Integer都可以,是因为int是java.long.Integer的别名

单个定义别名:

    <typeAliases>
        <!--针对单个别名定义
        type:类型的路径
        alias:别名
        -->
        <typeAlias type="com.mb.domain.User" alias="user" />
    </typeAliases>

引用别名:

之前画红线的地方是:com.mb.domain.User

多个定义别名:

    <typeAliases>
        <!-- 批量定义别名-->
        <!-- 指定报名,mybatis主动把扫描包中的类,自动定义别名,别名就是类型(首字母不分大小写)-->
        <package name="com.mb.domain" />
    </typeAliases>

将userMapper.xml中的resultType返回com.mb.domain.User的,都可以直接写成user或User
自行测试这里不再演示

最后附上全部代码

MyBatis配置文件sqlMapConfig.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>
    <!-- 加载属性文件-->
    <properties resource="db.properties">
        <!-- properties中还可以配置一些属性名和属性值-->
        <!-- <property name="jdbc.driver" value=""/>-->
    </properties>
    <!-- 别名定义-->
    <typeAliases>
        <!--针对单个别名定义
        type:类型的路径
        alias:别名
        -->
        <!-- <typeAlias type="com.mb.domain.User" alias="user" />-->
        <!-- 批量定义别名-->
        <!-- 指定报名,mybatis主动把扫描包中的类,自动定义别名,别名就是类型(首字母不分大小写)-->
        <package name="com.mb.domain" />
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <!-- 配置数据库连接信息 -->
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <!-- 加载映射文件 -->
        <mapper resource="com/mb/mapping/userMapper.xml" />
        <!-- 注册UserMapper映射接口 -->
        <mapper class="com.mb.mapping.UserMapperI" />
    </mappers>

</configuration>

配置SQL语句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">
<!-- mapper:根标签  namespace:命名空间 随便写,随便起名,保证命名空间唯一,建议写地址,包+文件名   -->
<!-- namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离
       注意:使用mapper代理方法开发,namespace有特殊重要的作用
       -->
<mapper namespace="com.mb.mapping.userMapper">
    <!-- 在映射文件中配置很多sql语句-->
    <!--  需求:通过id查询用户表的记录 -->
    <!--通过select执行数据库查询
    id:标识映射文件中的sql,
    将sql语句封装到mappedStatement对象中,所以将id称为statement的id
    parameterType:制定输入参数的类型,这里制定ing型
    #{}表示一个占位符号
    #{id}:其中的id表示接受输入的参数,参数名称就是id,如果输入参数就是简单类型,#{}中的参数名可以任意,可以value或其他名称
    resultType:指定sql输入结果的所映射的Java对象,select指定resultType表示将单条记录映射成Java对象。
    -->
    <select id="getUser" parameterType="int" resultType="user">
        select * from s_user where id=#{id}
    </select>
    <!-- 根据用户名称模糊查询用户信息,可能返回多条  -->
    <!--  resultType:指定就是单条记录所映射的java对象类型  -->
    <select id="findUserName" parameterType="String" resultType="User">
        select * from s_user where name  like '%${value}%'
    </select>
    <!--  添加用户
    parameterType:指定输入参数类型是pojo(包括用户信息)  insert没有返回值-->
    <insert id="insertUser"  parameterType="User">
        <!--
        将插入数据的主键返回,返回到user对象中
        SELECT LAST_INSERT_ID():得到刚insert进去记录的主键值,只适用于自增主键
        keyProperty:将查询到主键设置到parameterType指定对象的哪个属性
        order:select LAST_INSERT_ID()执行顺序,相对于insert来说他的执行顺序(之后)
        resultType:指定SELECT LAST_INSERT_ID()的结果类型
        -->
        <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
            SELECT LAST_INSERT_ID()
        </selectKey>
        insert into s_user(name,age,sex,birthday) values(#{name},#{age},#{sex},#{birthday})
    </insert>
    <!-- 更新用户 -->
    <!-- 分析:
        需要传入用户的id
        需要传入用户的更新信息
        parameterType指定user对象,包括id和更新信息,注意:id必须存在
        #{id}:从输入user对象中获取id属性值
      -->
    <update id="updateUser" parameterType="User">
        update s_user set name=#{name},age=#{age},sex=#{sex},birthday=#{birthday} where id=#{id}
    </update>
    <!-- 删除用户 -->
    <!-- 根据id删除用户,需要输入id的值 -->
    <delete id="deleteUser" parameterType="int">
        delete from s_user where id=#{id}
    </delete>
</mapper>

测试文件MyBatisFirst.java:

package com.mb.domain;

        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.InputStream;
        import java.util.Date;
        import java.util.List;

public class MybatisFirst {
    //根据id查询用户信息,得到一条记录结果
    public  void findUserByIdTest() throws IOException {
        //mybatis配置文件
        String resource ="sqlMapConfig.xml";
        //得到配置文件流
        InputStream inputStream = MybatisFirst.class.getClassLoader().getResourceAsStream(resource);
        //创建会话工厂,传入mybatis的配置文件信息
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂得到sqlSession
        SqlSession sqlSession=sqlSessionFactory.openSession();
        String statement="com.mb.mapping.userMapper.getUser";
        //通过SqlSession操作数据库
        //第一个参数:映射文件中statement的id,等于namespace+"."+statement的id
        //第二个参数:指定和映射文件中所匹配的parameterType类型的参数
        User user=sqlSession.selectOne(statement,1);
        System.out.println(user);
        //释放资源
        sqlSession.close();
    }

    //根据用户名称模糊查询数据
    public void findUserByNameTest() throws IOException{
        //mybatis配置文件
        String resource ="sqlMapConfig.xml";
        //得到配置文件流
        InputStream inputStream = MybatisFirst.class.getClassLoader().getResourceAsStream(resource);
        //创建会话工厂,传入mybatis的配置文件信息
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂得到sqlSession
        SqlSession sqlSession=sqlSessionFactory.openSession();
        String statement="com.mb.mapping.userMapper.findUserName";
        //list中的user和映射文件中resultType所指定的类型一致
        List<User> list=sqlSession.selectList(statement,"三");
        System.out.println(list);
        //关闭会话
        sqlSession.close();
    }

    //添加用户信息
    public void insertUserTest() throws IOException{
        //mybatis配置文件
        String resource ="sqlMapConfig.xml";
        //得到配置文件流
        InputStream inputStream = MybatisFirst.class.getClassLoader().getResourceAsStream(resource);
        //创建会话工厂,传入mybatis的配置文件信息
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂得到sqlSession
        SqlSession sqlSession=sqlSessionFactory.openSession();
        String statement="com.mb.mapping.userMapper.insertUser";
        User user =new User();
        user.setName("李红");
        user.setAge(41);
        user.setSex("女");
        //在使用当前时间如果用new Date(),应当引用java.util.Date  如果用java.sql.Date会有问题
        user.setBirthday(new Date());
        //没有返回值,不用变量接收
        sqlSession.insert(statement,user);
        //提交事务
        sqlSession.commit();
        //显示返回id
        System.out.println(user.getId());
        //关闭会话
        sqlSession.close();
    }

    //删除用户信息
    public void deleteUserTest() throws IOException{
        //mybatis配置文件
        String resource ="sqlMapConfig.xml";
        //得到配置文件流
        InputStream inputStream = MybatisFirst.class.getClassLoader().getResourceAsStream(resource);
        //创建会话工厂,传入mybatis的配置文件信息
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂得到sqlSession
        SqlSession sqlSession=sqlSessionFactory.openSession();
        String statement="com.mb.mapping.userMapper.deleteUser";
        //将id传过去,删除用户。
        sqlSession.delete(statement,6);
        //提交事务
        sqlSession.commit();
        //关闭会话
        sqlSession.close();
    }

    //更新用户
    public void updateUserTest() throws IOException{
        //mybatis配置文件
        String resource ="sqlMapConfig.xml";
        //得到配置文件流
        InputStream inputStream = MybatisFirst.class.getClassLoader().getResourceAsStream(resource);
        //创建会话工厂,传入mybatis的配置文件信息
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂得到sqlSession
        SqlSession sqlSession=sqlSessionFactory.openSession();
        String statement="com.mb.mapping.userMapper.updateUser";
        User user =new User();
        user.setId(8);
        user.setName("wangwang");
        user.setAge(14);
        user.setSex("女");
        //在使用当前时间如果用new Date(),应当引用java.util.Date  如果用java.sql.Date会有问题
        user.setBirthday(new Date());
        //没有返回值,不用变量接收
        sqlSession.update(statement,user);
        //提交事务
        sqlSession.commit();
        //关闭会话
        sqlSession.close();
    }

    public static void main(String[] args) throws IOException {
        /* 实例化MybatisFirst类 */
        MybatisFirst mf=new MybatisFirst();
        /* 通过id查询用户信息*/
        mf.findUserByIdTest();
        /* 通过name模糊查询用户信息*/
        mf.findUserByNameTest();
        /* 插入用户信息*/
        //mf.insertUserTest();
        /* 更新用户信息*/
        //mf.updateUserTest();
        /* 删除用户信息*/
        //mf.deleteUserTest();
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值