victory的博客

长安一片月,万户捣衣声

0%

MyBatis | MyBatis搭建过程

MyBatis搭建过程

1.导入MyBatis框架的jar包、Mysql驱动包、log4j的jar包

myBatis-3.4.1.jar
mysql-connector-java-5.1.37-bin.jar
log4j.jar

2.创建MyBatis的核心(全局)配置文件mybatis-config.xml并配置(如何连接数据库)
3.创建映射文件XxxMapper.xml并配置(如何操作数据库)
4.创建mapper接口,实现两个绑定:
4.1接口全限定名要和映射文件的namespace保持一致
4.2接口中方法名和SQL语句的id保持一致
5.获取MyBatis操作数据库的会话对象SqlSession,通过getMapper()获取接口的动态代理实现类

InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);

6、测试

搭建过程案例

1.项目目录

user表

log4j.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
 
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
 
 <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
   <param name="Encoding" value="UTF-8" />
   <layout class="org.apache.log4j.PatternLayout">
    <param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m  (%F:%L) \n" />
   </layout>
 </appender>
 <logger name="java.sql">
   <level value="debug" />
 </logger>
 <logger name="org.apache.ibatis">
   <level value="info" />
 </logger>
 <root>
   <level value="debug" />
   <appender-ref ref="STDOUT" />
 </root>
</log4j:configuration>

2.导入上图中所示的jar包
3.jdbc.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm
jdbc.username=root
jdbc.password=root

4.mybatis-config.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>
        <property name="jdbc.driver" value="com.mysql.jdbc.Driver"/>
    </properties> -->
    
    <!-- 
        <properties>:设置或引入资源文件
        resource:在类路径下访问资源文件
        url:在网络路径或磁盘路径下访问资源文件
     -->
    <properties resource="jdbc.properties"></properties>
    
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"></setting>
    </settings>
    
    <typeAliases>
        <!-- 
            为类型设置类型别名
            type:Java类型,若只设置type,默认的别名就是类型,且不区分大小写
         -->
         <!-- <typeAlias type="com.atguigu.bean.User" alias="User"/> -->
         
         <package name="com.atguigu.bean"/>
    </typeAliases>

    <!--
        <environments>:设置连接数据库的环境
        default:设置默认使用的数据库环境
     -->
    <environments default="development">
        <!-- 
            <environment>:设置某个具体的数据库环境
            id:数据库环境的唯一标识
         -->
        <environment id="development">
            <!--
                type="JDBC|MANAGED" 
             -->
            <transactionManager type="JDBC" />
            <!--
                type="POOLED|UNPOOLED|JNDI" 
             -->
            <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="UserMapper.xml" />
    </mappers>
</configuration>

5.User.java

package com.atguigu.bean;

public class User {
    private Integer uid;
    private String userName;
    private String password;
    private Integer age;
    private String sex;
    public Integer getUid() {
        return uid;
    }
    public void setUid(Integer uid) {
        this.uid = uid;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    @Override
    public String toString() {
        return "User [uid=" + uid + ", userName=" + userName + ", password=" + password + ", age=" + age + ", sex="
                + sex + "]";
    }
    
}

6.UserMapper.xml(举例:操作数据库中的user表)

<?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.atguigu.mapper.UserMapper">
    <!-- 
        <select>:定义查询语句 
        id:设置SQL语句的唯一标识
        resultType:结果类型,即实体类的全限定名
    -->
    <select id="getUserByUid" resultType="User">
        <!-- 
        当数据库表中的字段与类中的属性名不一样时,可以在查询时指定别名
        select uid,user_name userName,password,age,sex from user where uid = #{id} 
        -->
        
        <!--
         当数据库表中的字段与类中的属性名不一样时,如果不指定别名,需要在核心配置文件mybatis-config.xml中做以下配置:
         <settings>
            <setting name="mapUnderscoreToCamelCase" value="true"></setting>
         </settings>
         
         注:此配置通常不使用,即在开发时将数据库的字段名与类的属性名保持一致
         -->
        select uid,user_name,password,age,sex from user where uid = #{id}
    </select>
</mapper>

7.UserMapper.java(mapper接口)

package com.atguigu.mapper;

import com.atguigu.bean.User;

public interface UserMapper {
    User getUserByUid(String uid);
}

8.TestMybatis.java(测试类)

package com.atguigu.mapper;

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

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;

import com.atguigu.bean.User;

public class TestMybatis {

    @Test
    public void test() throws IOException{
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //getMapper():会通过动态代理动态生成UserMapper的代理实现类
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        //System.out.println(mapper.getClass().getName());
        User user = mapper.getUserByUid("1");
        System.out.println(user);  
    }
}