Mybatis(原始dao开发)

mybaits学习笔记之二

mybaits学习过程及项目需求分析

需求

  • 通过id查询用户
  • 通过名称模糊查询用户
  • 插入用户信息
  • 更新用户信息
  • 删除用户信息

通过id查询用户

创建数据库作查询

优化后的数据库连接池放于单独的文件以便修改操作,学习中自己注意到,url中要正确填写数据库表名

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybaits?characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
jdbc.username=root
jdbc.password=354719
创建User类

User.java类用于将数据库中的信息映射为java对象,set,get,toString方法自动生成

public class User {
    private int id;
    private String name;
    private String sex;
    private Date birthday;
    private String address;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public Date getBirthday() {
        return birthday;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    @Override
    public String toString() {
        return "User [id=" + id + ", name=" + name + ", sex=" + sex + ", birthday=" + birthday + ", address=" + address
                + "]";
    }
}
创建User.xml文件对数据库进行操作,为核心
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd" >
<mapper namespace="test">
    <!-- 在映射文件中配置很多sql语句 -->
    <!-- 需求:通过id查询用户表的记录 -->
    <!-- 通过select执行数据库查询
    id:标识映射文件中的sql
    将sql语句封装到mappedStatement对象中,所以将id称为Statement的id
    parameterType:指定输入参数的类型,这里指定int型
    #{}表示一个占位符号
    #{id}:其中的id表示接收输入的参数,参数名称就是id,如果输入参数是简单类型,#{}中的参数名可以任意
           可以value或其他名称

    resultType:指定sql输出结果所映射的java对象类型,select指定resultType表示将单条记录映射成java对象

     -->

    <select id="findUserById" parameterType ="int" resultType="user">
        SELECT * FROM USER WHERE id=#{id}
    </select>
    <!-- 根据用户名称模糊查询用户信息,可能返回多条
    resultType:指定的就是单条记录所映射的Java对象类型
    ${}:拼接字符串,但是会造成sql注入风险
     -->
    <select id = "findUserByName" parameterType = "String" resultType = "user">
        SELECT * FROM USER WHERE name LIKE #{name}
    </select>
    <!-- 添加用户信息
    parameterType:指定输入参数类型是pojo(包括用户信息)
    #{}中指定pojo的属性名,接收到pojo对象的属性值,mybaits通过OGNL获取对象的属性值
     -->
    <insert id="insertUser" parameterType = "user" >
    <!-- 将插入数据的主键返回,返回到user对象中 
         SELECT LAST_INSERT_ID():得到insert进去记录的主键值,只适用于自增主键
         KeyProperty:将查询到主键值设置到parameterType指定的对象的那个属性
         order:LAST_INSERT_ID()执行顺序,相对于insert语句来说它的执行顺序
         resultType:指定LAST_INSERT_ID()结果类型
    -->
    <selectKey keyProperty = "id" order="AFTER" resultType = "Integer">
         SELECT LAST_INSERT_ID()
    </selectKey>
<!--    非主键的id获取方式
              使用mysql的uuid()生成主键
        执行过程:
        首先通过uuid()得到主键,将主键设置到user对象的id属性中
        其次在insert执行时,从user对象中取出id属性值
        <selectKey keyProperty = "id" order = "BEFORE" resultType = "String">
            SELECT uuid()
        </selectKey> 
        insert into user(id,name,birthday,sex,address) value(#{id},#{name},#{birthday},#{sex},#{address})
        -->
        insert into user(name,birthday,sex,address) value(#{name},#{birthday},#{sex},#{address})
    </insert>
    <!-- 删除用户 
         根据id删除用户,需要输入id值
       -->
    <delete id = "deleteUser" parameterType = "Integer">
        delete from user where id = #{id}
    </delete>
    <!-- 更新用户
         分析:
         需要传入用户的id
         需要传入用户的更新信息
         parameterType指定user对象,包括id和更新信息,注意:id必须存在
         #{id}:从输入的usr对象中获取id属性值
     -->
     <update id = "updateUser" parameterType ="user">
        update user set name=#{name},birthday=#{birthday},sex=#{sex},address=#{address}
        where id = #{id}
     </update>
</mapper>
在SqlMapConfig.xml中进行加载映射文件(很重要)

优化方法将在以后的学习中记录

<!-- 加载映射文件 -->
    <mappers>
    <!-- 通过resource方法加载单个映射文件 -->
    <!-- 通过mapper接口加载
         规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录中(一个包中且同名)
         上边规范的前提是:使用的是mapper代理方法
     -->
        <mapper class = "com.shagou.mybaits.mapper.UserMapper"/>
        <!-- 批量加载
             指定mapper接口的包名,mybaits自动扫描
             规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录中(一个包中且同名)
                上边规范的前提是:使用的是mapper代理方法
         -->
<!--        <package name = "com.shagou.mybaits.mapper"/> -->
        <mapper resource="sqlmap/User.xml"/>
        <!-- 很重要 -->
        <!-- <mapper resource="mapper/UserMapper.xml"/> -->
    </mappers>
创建java类进行测试
  • 注意:若方法对数据库中的数据进行了更改之类的操作,提交事务必不可少,sqlSession.commit();
  • 注意:测试方法结束后记得关闭资源,sqlSession.close();
public class MybaitsFirst {
    @Test
    public void findUserByIdTest() throws IOException{ 
        //mybaits配置文件
        String resource = "SqlMapConfig.xml";
        //得到配置文件流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //创建会话工厂,传入mybaits的配置文件信息
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂得到SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //通过SqlSession操作数据库
        //第一个参数:映射文件中statement的id,等于=namespace+"."+statement的id
        //第二个参数:指定和映射文件中所匹配的parameterType类型的参数
        //sqlSession.selectOne结果是与映射文件中所匹配的resultType类型的对象
        User user = sqlSession.selectOne("test.findUserById",1);

        System.out.println(user);

        //释放资源
        sqlSession.close();
    }

//根据用户名称模糊查询用户列表
    @Test
public void findUserByName() throws IOException {
    //mybaits配置文件
            String resource = "SqlMapConfig.xml";
            //得到配置文件流
            InputStream inputStream = Resources.getResourceAsStream(resource);
            //创建会话工厂,传入mybaits的配置文件信息
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            //通过工厂得到SqlSession
            SqlSession sqlSession = sqlSessionFactory.openSession();
            //list中的user和映射文件中的resultType所指定的类型一致
            List<User> list = sqlSession.selectList("test.findUserByName","%小明%");
            System.out.println(list);
            sqlSession.close();
    }
    //添加用户信息
    @Test
    public void insertUser() throws IOException {
        //mybaits配置文件
                String resource = "SqlMapConfig.xml";
                //得到配置文件流
                InputStream inputStream = Resources.getResourceAsStream(resource);
                //创建会话工厂,传入mybaits的配置文件信息
                SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
                //通过工厂得到SqlSession
                SqlSession sqlSession = sqlSessionFactory.openSession();
                //插入用户对象
                User user = new User();
                user.setName("陈三愣子");
                user.setBirthday(new Date());
                user.setSex("男");
                user.setAddress("北京");
                sqlSession.insert("test.insertUser",user);
                //提交事务
                sqlSession.commit();
                //获取用户信息主键
                System.out.println(user.getId());
                //关闭会话
                sqlSession.close();
        }
    //根据id删除用户信息
        @Test
        public void deleteUser() throws IOException {
            //mybaits配置文件
                    String resource = "SqlMapConfig.xml";
                    //得到配置文件流
                    InputStream inputStream = Resources.getResourceAsStream(resource);
                    //创建会话工厂,传入mybaits的配置文件信息
                    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
                    //通过工厂得到SqlSession
                    SqlSession sqlSession = sqlSessionFactory.openSession();
                    //传入id删除用户
                    sqlSession.delete("test.deleteUser",8);
                    //提交事务
                    sqlSession.commit();
                    //关闭会话
                    sqlSession.close();
            }
        //更新用户信息
        @Test
        public void updateUser() throws IOException {
            //mybaits配置文件
                    String resource = "SqlMapConfig.xml";
                    //得到配置文件流
                    InputStream inputStream = Resources.getResourceAsStream(resource);
                    //创建会话工厂,传入mybaits的配置文件信息
                    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
                    //通过工厂得到SqlSession
                    SqlSession sqlSession = sqlSessionFactory.openSession();
                    //更新用户对象,必须设置id
                    User user = new User();
                    user.setId(4);
                    user.setName("刘晓军");
                    user.setBirthday(new Date());
                    user.setSex("男");
                    user.setAddress("上海");
                    sqlSession.insert("test.updateUser",user);
                    //提交事务
                    sqlSession.commit();
                    //关闭会话
                    sqlSession.close();
            }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值