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);
}
}
结果如下: