MyBatis的基本使用

MyBatis是一个轻量级的ORM库,使用MyBatis可以方便的将POJO类存储到数据库中或者将数据库的数据转换成POJO类,不同于Hibernate等库,MyBatis推荐使用XML配置中书写SQL语句的方式来转换数据,这样极大的提高了灵活性。下面使用一个简单的例子来说明MyBatis的使用。


1.添加类库

使用MyBatis需要使用的类库非常少,一个就是MyBatis的核心库,一个就是数据库的驱动库,这里我们使用mybatis-3.4.4.jar和mysql-connector-java-5.1.38.jar.

2 创建数据库表

我们的需要创建一个城市的数据库表,表的字段包括id,城市名称,所属国家,省份,精度,纬度,表结构如下:

表结构

3.配置MyBatis的配置文件

在工程的SRC目录下,也可以是在其他目录下,创建一个config.xml的配置文件,这个文件是描述了访问数据库的基本配置和对POJO类操作的映射文件,配置如下图所示:

<?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>
    <typeAliases>
        <typeAlias alias="City" type="com.app.heweather.City"/>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/weather_db"/>
                <property name="username" value="root"/>
                <property name="password" value="111111"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="city.xml"/>
    </mappers>
</configuration>

在Environment标签中描述了数据库访问的基本信息,在mapper标签中则指定了对特定的POJO对象操作的XML描述文件,这里对应的是city.xml文件

4.配置city.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="com.app.heweather.CityMapper">

    <insert id="insertAllCity" parameterType="com.app.heweather.City" useGeneratedKeys="false">
        insert into tb_city (id, city, cntv, province, lat, lon) values
       <foreach collection="list" item="item" index="index" separator=",">
             (#{item.id}, #{item.city}, #{item.cntv}, #{item.province}, #{item.latitude}, #{item.longitude})
       </foreach>
    </insert>
</mapper>

这个文件代表了所有数据库的操作,namespace表示这个方法的命名空间,id表示方法的名字,parameterType表示参数的类型,而在insert标签内部则是sql执行语句,这里使用了一个foreach标签表示批量插入,后续说明。该配置的都ok,那么我们在代码中应该怎么使用呢,接着看下面的。

5.构建SQLSession类

我们所有的SQL执行动作都是在SQLSession中执行的,那么构建SQLSession就是我们需要完成的动作。

public class BasicOperator {

    protected static SqlSessionFactory factory;
    protected static Reader reader;

    static{
        try{
            reader = Resources.getResourceAsReader("config.xml");
            factory = new SqlSessionFactoryBuilder().build(reader);
        }catch (Exception e){
            e.printStackTrace();
        }


    }
}
public class CityOperator extends BasicOperator{
    private static CityOperator co = new CityOperator();

    public CityOperator(){

    }

    public static CityOperator getInstance(){
        return co;
    }

    public void insertAllCity(List<City> allCities){
        SqlSession session = factory.openSession();
        int count;
        try{
           count = session.insert("com.app.heweather.CityMapper.insertAllCity", allCities);
           System.out.println(count);
           session.commit();
        }
        catch (Exception e){
            e.printStackTrace();
        }

    }

}

代码也比较清晰,首先使用SQLSessionFactoryBuild类构建一个SQLSessionFactory类,使用SQLSessionFactory类的openSession方法创建一个SQLSession,调用SQLSession的insert方法,实现数据的插入,这个insert的第一个参数,也就是我们刚才在city.xml中定义的方法名字,使用命名空间+方法名的书写,第二个参数则是List的类型

6.调用

public class WeatherToDb {

    public static void main(String[] args) throws Exception{
        URL url = new URL("https://cdn.heweather.com/china-city-list.json");
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        InputStream ins = connection.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(ins));
        StringBuffer buffer = new StringBuffer();
        String lines = null;
        while((lines = reader.readLine()) != null){
            buffer.append(lines);
        }
        reader.close();
        String result = buffer.toString();
        Gson gson = new Gson();
        List<City> cities = gson.fromJson(result,new TypeToken<List<City>>(){}.getType());
        CityOperator.getInstance().insertAllCity(cities);
    }
}

结果如下:

返回结果

posted @ 2017-05-30 23:03  豌豆豆  阅读(94)  评论(0编辑  收藏  举报