mybatis的简单使用和demo

mybatis的简单使用和demo

demo 这个是简单demo的 码云地址 https://git.oschina.net/yuhaifei/Mybatis_demo.git
1.导入jar包

使用的jar包包括jdbc的jar

2.配置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>

    <typeAliases> 
        <!-- 定义单个pojo类别名
        type:类的全路劲名称
        alias:别名
         -->
<!--        <typeAlias type="cn.itheima.pojo.User" alias="user"/> -->

        <!-- 使用包扫描的方式批量定义别名 
        定以后别名等于类名,不区分大小写,但是建议按照java命名规则来,首字母小写,以后每个单词的首字母大写
        -->
        <package name="cn.itheima.pojo"/>
    </typeAliases>

    <!-- 和spring整合后 environments配置将废除-->
    <environments default="development">
        <environment id="development">
        <!-- 使用jdbc事务管理-->
        <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="User.xml"/>

        <!-- 
        使用class属性引入接口的全路径名称:
        使用规则:
            1. 接口的名称和映射文件名称除扩展名外要完全相同
            2. 接口和映射文件要放在同一个目录下
         -->
<!--        <mapper class="cn.itheima.mapper.UserMapper"/> -->

        <!-- 使用包扫描的方式批量引入Mapper接口 
                使用规则:
                1. 接口的名称和映射文件名称除扩展名外要完全相同
                2. 接口和映射文件要放在同一个目录下
        -->

    </mappers>
</configuration>

3.java 文件 做mode文件
这里写图片描述

package mode;

import java.sql.Date;

public class User {
    private int id;
    private String username;// 用户姓名
    private String sex;// 性别
    private Date birthday;// 生日
    private String address;// 地址


    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    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 + ", username=" + username + ", sex=" + sex
                + ", birthday=" + birthday + ", address=" + address + "]";
    }
}

3.1 还要配置,User.xml文件,这个很关键,这个是把spl语句配置在这个文件里

<?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">
<!-- namespace:命名空间,做sql隔离 -->
<mapper namespace="test">

    <!-- 
    id:sql语句唯一标识
    parameterType:指定传入参数类型
    resultType:返回结果集类型
    #{}占位符:起到占位作用,如果传入的是基本类型(string,long,double,int,boolean,float等),那么#{}中的变量名称可以随意写.
     -->
    <select id="findUserById" parameterType="java.lang.Integer" resultType="mode.User">
        select * from user where id=#{id}
    </select>

</mapper>

4.测试代码 这个很关键
这里写图片描述

package mybatis_demo_01;

import java.io.InputStream;

import mode.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.Test;

public class UserTest {
    //有时候,@Test这个注解没法出现,要全写
    @Test
    public void testData() throws Exception{

        String resource= "SqlMapConfig.xml";
        //通过流将核心配置文件读取进来
        InputStream config= Resources.getResourceAsStream(resource);
        通过核心配置文件输入流来创建会话工厂
        SqlSessionFactory factory= new SqlSessionFactoryBuilder().build(config);
        //通过工厂创建回话
        SqlSession openSession = factory.openSession();
        //只查询一条数据,(第一个参数:所调用的sql语句= namespace+.+sql的ID,参数)
        User user = openSession.selectOne("test.findUserById", 1);
        System.out.println(user);
    }

}

5。数据库的样子
数据库结构


在查询数据回来是list的时候。xml文件配,以及使用
1.user.xml配置

<!-- 
        如果返回结果为集合,可以调用selectList方法,这个方法返回的结果就是一个集合,所以映射文件中应该配置成集合泛型的类型
        ${}拼接符:字符串原样拼接,如果传入的参数是基本类型(string,long,double,int,boolean,float等),那么${}中的变量名称必须是value
        防止sql注入,只能在like的时候使用
        ${} 拼接符  value
     -->
    <select id="findUserByUsername" parameterType="String" resultType="mode.User">
        SELECT * from user a WHERE a.username LIKE '%${value}%'
    </select>

2.java文件测试

    /**
     * 根据username查询数据
     * @throws Exception
     */
    @Test
    public void testSelectUserName() throws Exception{

        String resource = "SqlMapConfig.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession openSession = factory.openSession();
        List<User> selectList = openSession.selectList("test.findUserByUsername", "王五");
        System.out.println(selectList);
    }

5.添加数据
5.1 在user.xml文件中,添加

    <!-- 
    添加数据
    (#{username},#{birthday},#{sex},#{address}) 必须是user里面的参数
     -->
    <insert id="insertUser" parameterType="mode.User" >
    <!-- 执行 select LAST_INSERT_ID()数据库函数,返回自增的主键
        keyProperty:将返回的主键放入传入参数的Id中保存.
        order:当前函数相对于insert语句的执行顺序,在insert前执行是before,在insert后执行是AFTER
        resultType:id的类型,也就是keyproperties中属性的类型
        -->
        <selectKey keyProperty="id" order="AFTER" resultType="int" > 
            select LAST_INSERT_ID()
        </selectKey>

        INSERT INTO user  (username,birthday,sex,address) VALUES (#{username},#{birthday},#{sex},#{address})
    </insert>

5.2 java中测试

public class UserAddTest {

    @Test
    public void instarUserData() throws Exception{

        String resource = "SqlMapConfig.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession openSession = factory.openSession();
        //List<User> selectList = openSession.selectList("test.insertUser", "王五");
        User user = new User();
        user.setUsername("XXX");
        user.setSex("1");
        user.setAddress("常州");
        user.setBirthday(new Date());
        System.out.println("///"+user.getId());
        openSession.insert("test.insertUser", user);
        System.out.println("///"+user.getId());
    }
}

5.3 添加uuid,id主键不是int型

需要增加通过select uuid()得到uuid值

<insert  id="insertUser" parameterType="cn.itcast.mybatis.po.User">
<selectKey resultType="java.lang.String" order="BEFORE" 
keyProperty="id">
select uuid()
</selectKey>
insert into user(id,username,birthday,sex,address) 
         values(#{id},#{username},#{birthday},#{sex},#{address})
</insert>
注意这里使用的order是“BEFORE”

6 删除数据 和 修改数据 在user.xml文件和Test文件中

<delete id="delectUser" parameterType="int" >
        DELETE  FROM user   WHERE id = #{id}
    </delete>

    <update id= "updateUser" parameterType="mode.User" >
        update user set username=#{username} where id=#{id}
    </update>

java测试代码


    /**
     * 删除
     * @throws Exception
     */
    @Test
    public void delectUserData() throws Exception{

        String resource = "SqlMapConfig.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession openSession = factory.openSession();
        openSession.delete("test.delectUser", 24);
        openSession.commit();
    }


    @Test
    /**
     * 修改
     * @throws Exception
     */
    public void updateUserData() throws Exception{

        /*
        String resource = "SqlMapConfig.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession openSession = factory.openSession();
        User user = new User();
        user.setId(10);
        user.setUsername("yyyyyyyyyyyyy");
        openSession.update("test.updateUser", user);
        openSession.commit();
        */
        UserDaoImp userDaoImp = new UserDaoImp();
        userDaoImp.updateUser();
    }

7 dao编程使用
dao.java

package dao;

public interface UserDao {

    public void updateUser();
}

daoImpl.java

package dao;

import java.io.IOException;
import java.io.InputStream;

import mode.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;

public class UserDaoImp implements UserDao{

     private static SqlSessionFactory factory;
     public static SqlSessionFactory getFactory() {

         if (null == factory) {

                String resource = "SqlMapConfig.xml";
                InputStream inputStream;
                try {
                    inputStream = Resources.getResourceAsStream(resource);
                    SqlSessionFactory newfactory = new SqlSessionFactoryBuilder().build(inputStream);
                    return newfactory;
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
            return factory;
    }
     public static void setFactory(SqlSessionFactory factory) {
        UserDaoImp.factory = factory;
    }


    public UserDaoImp() {

    }


    @Override
    public void updateUser() {
        // TODO Auto-generated method stub
        SqlSession openSession = getFactory().openSession();
        User user = new User();
        user.setId(10);
        user.setUsername("aaaaaaaaaaaa");
        openSession.update("test.updateUser", user);
        openSession.commit();

    }

}

1.mybatis中动态代理,最大优势不写过多的java代码
切记,xml文件和java接口文件必须在一个目录里面
切记,xml文件和java接口文件必须在一个目录里面

2.配置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="mapper.UserMapper">

    <select id="selectUser" parameterType="int" resultType="mode.User">
        select * from user where id=#{id}   
    </select>

    <select id="selectLikeUser" parameterType="String" resultType="mode.User">
        SELECT * from user a where a.username like '%${value}%'
    </select>
    <insert id="insertUser" parameterType="mode.User" >
        <selectKey order="AFTER" resultType="int" keyProperty="id">
            select LAST_INSERT_ID()
        </selectKey>
        INSERT INTO user  (username,birthday,sex,address) VALUES (#{username},#{birthday},#{sex},#{address})
    </insert>
</mapper>

3.java 接口,方法名必须要和xml里面的id一样

package mapper;

import java.util.List;

import mode.User;

public interface UserMapper {
    public User selectUser(int id);

    public List<User> selectLikeUser(String name);
}

4.测试java方法,与前面的方法一样

package mybatis_demo_01;

import java.io.InputStream;
import java.util.Date;
import java.util.List;

import javax.persistence.Basic;

import mapper.UserMapper;
import mode.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.Before;
import org.junit.Test;

public class UserTestMapper {

    private SqlSessionFactory factory;

    //这个是测试的时候先启动
    @Before
    public void setUp() throws Exception{
        String resource = "SqlMapConfig.xml";
        //通过流将核心配置文件读取进来
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //通过核心配置文件输入流来创建会话工厂
        factory = new SqlSessionFactoryBuilder().build(inputStream);
    }

        @Test
    public void selectUser(){

        /* 
         * 第一查询
        SqlSession openSession = factory.openSession();
        UserMapper mapper = openSession.getMapper(UserMapper.class);
        User selectUser = mapper.selectUser(22);
        System.out.println(selectUser.getUsername());


        //模糊查询
         SqlSession openSession = factory.openSession();
         UserMapper mapper = openSession.getMapper(UserMapper.class);
         List<User> selectLikeUser = mapper.selectLikeUser("王");
         for (User user : selectLikeUser) {
            System.out.println(user.getUsername());
        }
        */

         SqlSession openSession = factory.openSession();
         UserMapper mapper = openSession.getMapper(UserMapper.class);
         User user = new User();
         user.setSex("男");
         user.setUsername("XXX");
         user.setBirthday(new Date());
         user.setAddress("常州");
         int insertUser = mapper.insertUser(user);
         System.out.println(insertUser);

         //必须要这个
         openSession.commit();
    }
}

在myBatis中一些关键字的使用

<?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="mapper.UserMapper">

        <!-- 封装sql条件,封装后可以重用. 
    id:是这个sql条件的唯一标识 -->
    <sql id="user_where">
    <!-- where标签作用:
                会自动向sql语句中添加where关键字
                会去掉第一个条件的and关键字
             -->
            <where>
            <if test="username != null and username != '' ">
                and username like '%${username}%'
            </if>
            <if test="sex != null and sex != ''">
                and sex = #{sex}
            </if>
        </where>
    </sql>

    <select id="selectUser" parameterType="int" resultType="mode.User">
        select * from user where id=#{id}   
    </select>

    <select id="selectLikeUser" parameterType="String" resultType="mode.User">
        SELECT * from user a where a.username like '%${value}%'
    </select>

    <insert id="insertUser" parameterType="mode.User" >
        <selectKey order="AFTER" resultType="int" keyProperty="id">
            select LAST_INSERT_ID()
        </selectKey>
        INSERT INTO user  (username,birthday,sex,address) VALUES (#{username},#{birthday},#{sex},#{address})
    </insert>

    <!--  where 和 if foreach 关键字的使用 -->
    <select id="selectLikeAndWhereUser" parameterType="vo.ViewBean" resultType="mode.User">

        select * from user
        <include refid="user_where"></include>
    </select>

    <select id="selectInUser" parameterType="vo.ViewBean" resultType="mode.User">
        select * from user
        <where>
            <if test="ids != null">
            <!-- 
                foreach:循环传入的集合参数
                collection:传入的集合的变量名称
                item:每次循环将循环出的数据放入这个变量中
                open:循环开始拼接的字符串
                close:循环结束拼接的字符串
                separator:循环中拼接的分隔符
                 -->
                <foreach collection="ids" item="id" open="id in(" separator="," close=")">
                    #{id}
                </foreach>
            </if>
        </where>
    </select>

</mapper>

2.在SqlMapConfig.xml中配置log4j输出文件

<?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>

    <!-- 配置log4j 会出现一定的错误  http://www.cnblogs.com/zipon/p/7081978.html  解决问题地址 -->  
    <settings>  
        <setting name="logImpl" value="STDOUT_LOGGING"/>  
    </settings>  

    <typeAliases> 
        <!-- 定义单个pojo类别名
        type:类的全路劲名称
        alias:别名
         -->
<!--        <typeAlias type="cn.itheima.pojo.User" alias="user"/> -->

        <!-- 使用包扫描的方式批量定义别名 
        定以后别名等于类名,不区分大小写,但是建议按照java命名规则来,首字母小写,以后每个单词的首字母大写
        -->
        <package name="modo"/>
    </typeAliases>

    <!-- 和spring整合后 environments配置将废除-->
    <environments default="development">
        <environment id="development">
        <!-- 使用jdbc事务管理-->
        <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="User.xml"/>
        <mapper class="mapper.UserMapper"/>
        <!-- 
        使用class属性引入接口的全路径名称:
        使用规则:
            1. 接口的名称和映射文件名称除扩展名外要完全相同
            2. 接口和映射文件要放在同一个目录下
         -->
<!--        <mapper class="cn.itheima.mapper.UserMapper"/> -->

        <!-- 使用包扫描的方式批量引入Mapper接口 
                使用规则:
                1. 接口的名称和映射文件名称除扩展名外要完全相同
                2. 接口和映射文件要放在同一个目录下
        -->

    </mappers>



</configuration>

3.java 代码中测试(必须在接口java文件中配置,与id相同的方法)


        SqlSession openSession = factory.openSession();
        UserMapper mapper = openSession.getMapper(UserMapper.class);
        User user = new User();
        user.setUsername("小");
        List<User> selectLikeAndWhereUser = mapper.selectLikeAndWhereUser(user);
        for (User user2 : selectLikeAndWhereUser) {
            System.out.println(user2.getUsername() + "-----------------------");
        }



        SqlSession openSession = factory.openSession();
        UserMapper mapper = openSession.getMapper(UserMapper.class);
        List<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(10);
        ViewBean viewBean = new ViewBean();
        viewBean.setIds(list);
        List<User> selectInUser = mapper.selectInUser(viewBean);
        for (User usr : selectInUser) {
            System.out.println(usr.getUsername());
        }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值