欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Mybatis笔记2

程序员文章站 2022-06-14 17:30:04
使用Mybatis完成的CRUD操作 个人总结的一些小规律 学习过程中碰到的错误: 虽然报错信息提示的 很明显是sql语法报错,不过我一时之间没有没有看出sql语句错在哪里,后来才发现是插入sql语句的括号写错了,不是小括号,而是大括号 JavaBean类 dao层 配置文件 测试类 typeAli ......

使用mybatis完成的crud操作

个人总结的一些小规律

Mybatis笔记2

学习过程中碰到的错误:

org.apache.ibatis.exceptions.persistenceexception: 
### error updating database.  cause: com.mysql.jdbc.exceptions.jdbc4.mysqlsyntaxerrorexception: you have an error in your sql syntax; check the manual that corresponds to your mysql server version for the right syntax to use near '' at line 1

虽然报错信息提示的 很明显是sql语法报错,不过我一时之间没有没有看出sql语句错在哪里,后来才发现是插入sql语句的括号写错了,不是小括号,而是大括号

错误写法:insert  into user(username,address,sex,birthday)value(#(username),#(address),#(sex),#(birthday);

正确写法:insert  into user(username,address,sex,birthday)value(#{username},#{address},#{sex},#{birthday});

javabean类

package com.itheima.domain;

import java.io.serializable;
import java.util.date;

public class user implements serializable {
    private integer id;
    private string username;
    private string address;
    private string sex;
    private date birthday;

    public integer getid() {
        return id;
    }

    public void setid(integer id) {
        this.id = id;
    }

    public string getusername() {
        return username;
    }

    public void setusername(string username) {
        this.username = username;
    }

    public string getaddress() {
        return address;
    }

    public void setaddress(string address) {
        this.address = address;
    }

    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;
    }

    @override
    public string tostring() {
        return "user{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", address='" + address + '\'' +
                ", sex='" + sex + '\'' +
                ", birthday=" + birthday +
                '}';
    }
}

dao层

package com.itheima.dao;

import com.itheima.domain.user;

import java.util.list;

public interface iuserdao {
    //查询所有用户
    list<user> findall();
    //保存用户
    void saveuser(user user);
    //更新用户
    void updateuser(user user);
    //根据id删除用户
    void deleteuser(integer userid);
    //查询一个,根据id查询用户信息
    user findbyid(integer userid);
    //根据名称模糊查询用户信息
    list<user> findbyname(string username);
    //查询总用户数
    int findtotal();
}

配置文件

<?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="com.itheima.dao.iuserdao">
    <!--查询所有用户-->
    <select id="findall" resulttype="com.itheima.domain.user">
      select * from user;
    </select>
<!--保存用户-->
    <insert id="saveuser" parametertype="com.itheima.domain.user">
       <selectkey keyproperty="id" keycolumn="id" resulttype="int" order="after">
           select last_insert_id();
       </selectkey>
        insert  into user(username,address,sex,birthday)value(#{username},#{address},#{sex},#{birthday});
    </insert>
    <!--更新用户-->
    <update id="updateuser" parametertype="com.itheima.domain.user">
        update user set username=#{username},address=#{address},sex=#{sex},birthday=#{birthday} where id=#{id}
    </update>
    <!--删除用户-->
    <delete id="deleteuser" parametertype="integer">
        delete from user where id=#{id}
    </delete>
    <!--根据id查询用户-->
    <select id="findbyid"  parametertype="integer" resulttype="com.itheima.domain.user">
        select * from user where id = #{uid}
    </select>

    <!--根据名称模糊查询-->
    <select id="findbyname" parametertype="string" resulttype="com.itheima.domain.user">
        select * from user where username like #{name}
    </select>
    <select id="findtotal" resulttype="int">
        select count(id) from user;
    </select>
</mapper>

测试类

package com.itheima.test;

import com.itheima.dao.iuserdao;
import com.itheima.domain.user;
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 org.junit.after;
import org.junit.before;
import org.junit.test;

import java.io.ioexception;
import java.io.inputstream;
import java.util.date;
import java.util.list;

public class mybatistest {
    private inputstream in;//读取配置文件
    private sqlsession sqlsession;//操作数据库
    private iuserdao userdao;
    @before//用于在测试方法执行之前执行,在其他方法执行之前执行init方法
    public void init() throws ioexception {
        //读取配置文件,生成字节输入流
        in = resources.getresourceasstream("sqlmapconfig.xml");
        //获取sqlsessionfactory
        sqlsessionfactory factory = new sqlsessionfactorybuilder().build(in);
        //获取sqlsession对象
       sqlsession = factory.opensession();
        //获取dao的代理对象
        userdao = sqlsession.getmapper(iuserdao.class);
    }
    @after//用于测试方法执行之后执行
    public void destroy() throws ioexception {
        //提交事务
        sqlsession.commit();
        //释放资源
        sqlsession.close();
        in.close();
    }
    @test
    //查询所有用户
    public void testfindall() throws ioexception {
        //执行查询方法
        list<user> users = userdao.findall();
        for(user user:users){
            system.out.println(user);
        }
    }
    @test
    //保存用户
    public void testsave(){
        user user = new user();
        user.setusername("王五");
        user.setaddress("北京市");
        user.setsex("男");
        user.setbirthday(new date());
        system.out.println("保存前"+user);
        //执行保存方法
        userdao.saveuser(user);
        system.out.println("保存后"+user);
    }

    @test
    //更新用户
    public void testupdate(){
        user user = new user();
        user.setid(50);
        user.setusername("李四");
        user.setaddress("北京市");
        user.setsex("男");
        user.setbirthday(new date());
        //执行查询方法
        userdao.updateuser(user);
    }
    @test
    //删除用户
    public void testdelete(){

        userdao.deleteuser(48);
    }
    @test
    //查询一个用户
    public void testfindone(){

        user user = userdao.findbyid(48);
        system.out.println(user);
    }

    @test
    //查询一个用户
    public void testfindbyname(){

        list<user> users = userdao.findbyname("%王%");
        for(user user :users){
            system.out.println(user);
        }
    }
    @test
    //查询一个用户
    public void testfindtotal(){
        int count = userdao.findtotal();
        system.out.println(count);
    }
}

typealiases标签和package标签

<!--使用typealiases配置别名,他只能配置domain中类的别名-->
    <typealiases>
        <!--typealias用于配置别名,type属性指定的是实体类权限定类名 alias属性指定别名,当指定了别命,不再区分大小写-->
        <!--<typealias type="com.itheima.domain.user" alias="user"></typealias>-->
        <!--用于指定配置别名的包,当指定之后,该包下的实体类都会注册别名,并且类名就是别名,不再区分大小写-->
        <package name="com.itheima.domain"></package>
    </typealiases>
<mappers>
    <!--<mapper resource="com/itheima/dao/iuserdao.xml"></mapper>-->
    <!--package标签是用于指定dao接口所在的包,当指定了之后就不需要在写mapper以及resource或者class了-->
    <package name="com.itheima.dao"></package>
</mappers>

mybatis连接池的分类

连接池:我们在实际开发中都会使用连接池,因为他可以减少我们获取连接所消耗的时间

mybatis中的连接池

mybatis连接池提供了3种方式的配置:

配置的位置:主配置文件sqlmapconfig.xml的datasource标签,type属性就是表示采用何种连接池方式

type属性的取值有三种

1.pooled 采用传统的javax.sql.datasource规范中的连接池,mybatis中有针对规范的实现

2.unpooled 采用的获取连接的方式,虽然也实现javax.sql.datasource接口,但是并没有使用池的思想

3.采用服务器提供的jndi技术实现,来获取datasource对象,不同的服务器所能拿到datasource是不一样的,如果不是web或者maven的war工程,是不能使用的(tomcat服务器,采用连接池就是dbcp连接池)