Mybatis接口代理CURD

目录

 

Mybatis

mybatis接口代理的模式开发

基于接口实现CRUD

mybatis多个参数处理

#{}和${} 区别

主键值的返回操作


Mybatis

mybatis接口代理的模式开发

1. 创建maven工程

<dependencies>
        <!--mybatis的核心依赖-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.6</version>
        </dependency>
        <!--mysql的驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        <!--日志-->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.12.1</version>
        </dependency>
</dependencies>
<build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
        </resources>
    </build>

 

2. 编写核心配置文件

<?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>
    <!--mybatis环境  defult="" 模式 development,worker-->
    <environments default="development">
        <!--environment标签中的id属性的值必需和environments标签中的default属性的值一致-->
        <environment id="development">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql:///803mbatis01"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
</configuration>

3. 创建表

CREATE TABLE `person` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(30) COLLATE utf8_bin DEFAULT NULL,
  `gender` varchar(6) COLLATE utf8_bin DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `birthday` date DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_bin

4.创建实体类

5. 定义一个接口,在接口中声明对person对象的增、删、改、查的方法

public interface PersonDao {

    /**
     *  打/**+回车
     *  对Person对象进行保存
     * @param person 要保存的person对象
     */
    public void savePerson(Person person);


}

6. 写接口的映射文件

Namespace的值为接口的完全限定名

Id 为接口中所声明的方法的名子,如果接口中的方法有输入参数,parameterType来描述接口中方法的类型

7. 接口的映射文件一定要在mybatis的核心配置文件中进行注册

<mappers>
        <mapper resource="cn/offcn/dao/PersonDaoMapper.xml"></mapper>
 </mappers>

8. 测试

public class PersonTest {

    public static void addPerson()throws Exception{
        //1.获取mybatis核心配置文件的输入流
        InputStream inputStream=Resources.getResourceAsStream("SqlMapperConfig.xml");
        //2. 创建一个SqlSessionFacgtory对象
        SqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);
        //3. 获取session
        SqlSession session=sqlSessionFactory.openSession();
        //4.获取PersonDao接口的代理对象
        PersonDao personDao=session.getMapper(PersonDao.class);
        Person person=new Person("崔逸阳","男",20,new Date());
        personDao.savePerson(person);
        //5. 提交事务
        session.commit();
        //6. 关闭session
        session.close();
    }
    public static void main(String[] args)throws Exception {
        addPerson();
    }
}

基于接口实现CRUD

接口:

public interface PersonDao {

    /**
     *  打/**+回车
     *  对Person对象进行保存
     * @param person 要保存的person对象
     */
    public void savePerson(Person person);

    /**
     * 根据id查询person对象
     * @param id   查询的条件id为主键
     * @return    person对象
     */
    public Person getPersonById(Integer id);
    /**
     * 根据id删除指定的person对象
     * @param id    主键
     */
    public void deletePersonById(Integer id);

     /**
     * 根据id来更新person对象
     * @param person  要更新person对象
     */
    public void updatePerson(Person person);

}

映射文件:

<mapper namespace="cn.offcn.dao.PersonDao">

    <insert id="savePerson" parameterType="Person">
        insert into person (name,gender,age,birthday) values(#{name},#{gender},#{age},#{birthday})
    </insert>

    <select id="getPersonById" parameterType="java.lang.Integer" resultType="Person">
        select * from person where id=#{id}
</select>

 <select id="getPersons" resultType="Person">
           select * from person
 </select>

<delete id="deletePersonById" parameterType="java.lang.Integer">
           delete from person where id=#{id}
    </delete>

    <update id="updatePerson" parameterType="Person">
        update person set name=#{name},gender=#{gender},age=#{age},birthday=#{birthday}
        where id=#{id}
    </update>
</mapper>

parameterType表示参数的类型,如果是基本数据类型,可以直接写,对于封装类对象类型还可以写成 java.lang.xxxx

resultType 表示该方法的返回类型。

测试:

@Test
    public void testGetPersonById(){

        SqlSession session= MyBatisUtils.getSession();
        PersonDao personDao = session.getMapper(PersonDao.class);
        Person person=personDao.getPersonById(4);
        System.out.println(person);
        session.commit();
        MyBatisUtils.close(session);
}

@Test
    public void testGetPersons(){

        SqlSession session= MyBatisUtils.getSession();
        PersonDao personDao = session.getMapper(PersonDao.class);
        List<Person> personList=personDao.getPersons();
        for (Person person : personList) {
            System.out.println(person);
        }

        session.commit();
        MyBatisUtils.close(session);
    }

  @Test
    public void testDeletePersonById(){

        SqlSession session= MyBatisUtils.getSession();
        PersonDao personDao = session.getMapper(PersonDao.class);
        personDao.deletePersonById(2);
        session.commit();
        MyBatisUtils.close(session);
    }

 @Test
    public void testUpdatePerson() throws Exception{

        SqlSession session= MyBatisUtils.getSession();
        PersonDao personDao = session.getMapper(PersonDao.class);
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
        Date birthday=sdf.parse("1991-10-10");
        Person person=new Person("王小五","男",30,birthday);
        person.setId(5);
        personDao.updatePerson(person);
        session.commit();
        MyBatisUtils.close(session);
    }

 

mybatis多个参数处理

1. 如果一个接口所定义的方法的参数有多个,此时在映射文件中不需要写parameterType属性,在对应的sql语句中,可以使用下标来取参的值。

Mybatis 3.40以上版本argXXX

Mybatis 3.40以下版本

2. 如果一个接口所定义的方法的参数有多个,此时在映射文件中不需要写parameterType属性,在对应的sql语句中,可以使用别名的方式进行参数引用。

多参数的简化:

  1. 可以参数封装到实体类中
    public List<Person> getPersonByGenderAndAage(Person person);
  2. 可以把多个数据封装到Map集合中

 

#{}和${} 区别

#{}是不能写到字符串中的,如果写到字符串表达字串内容一部分。Mybatis是无法给这个占位符赋值。

${}是可以写到字符串中的,表达取${}中表描述的字段的值。

#{} 占位符使用jdbc的预编译处理,可以有防止sql注入。

${}表示取字符的值,有sql注入的可能。

主键值的返回操作

获取自增主键的值的方式有两种

  1. 设置useGeneratedKeys="true" keyProperty="id"

     useGeneratedKeys=”true”,表示当向表中记录一条记录时,会自动取出主键值。

       keyProperty 表示取出的主键值,要赋给实体类的哪些属性

  2. 通过selectKey标签取自增主键值

    Select last_insert_id() 使用mysql的内函数取最后生成主键的值。

    keyColumn :  表过取哪一列的值。

    KeyProperty:将取出的主键值赋给实体类哪个属性

    resultType: 主键的类型

    Order: 执行sql之前取值 before,还是执行sql之后取值 after。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值