来公司没多久就去培训了2周,最近两周回来做一个日志存储系统,数据库连接方面不是用的是mybatis,它简化了sql语句,使得我们不需要再大量的拼接字符串了。
mybatis上手其实挺简单的,首先需要一个mybatis-config.xml配置文件,在这个配置文件中我们主要配置了数据源信息以及对应的包含sql语句的map映射的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>
<!-- 实体类,简称 -设置别名 -->
<typeAliases>
<!-- <typeAlias alias="User" type="com.tgb.model.User" /> -->
<typeAlias alias="LogHistory" type="com.tgb.model.LogHistory" />
</typeAliases>
<!-- 实体接口映射资源 -->
<!-- <properties resource="db.properties"/> -->
<!-- 配置mybatis数据源和环境 -->
<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://127.0.0.1::3306/db?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<!--
说明:如果xxMapper.xml配置文件放在和xxMapper.java统一目录下,mappers也可以省略,因为org.mybatis.spring.mapper.MapperFactoryBean默认会去查找与xxMapper.java相同目录和名称的xxMapper.xml
-->
<mappers>
<mapper resource="com/tgb/mapper/userMapper.xml" />
</mappers>
</configuration>
事实上,这里也可以通过配置文件来存放数据源信息,例如db.properties配置文件这样写
db.driverClassName=com.mysql.jdbc.Driver
db.url=jdbc:mysql://127.0.0.1::3306/db?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
db.username=root
db.password=root
mybatis-config.xml配置文件就可以这样写:
<properties resource="db.properties"/>
<!-- 配置mybatis数据源和环境 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${db.driverClassName}" />
<property name="url" value="${db.url}" />
<property name="username" value="${db.username}" />
<property name="password" value="${db.password}" />
</dataSource>
</environment>
</environments>
同样,这里也可以配置多个数据源,有个链接“mybatis如何配置使用多个数据源?”,这里是在同一个mybatis-config.xml中配置多个数据源的,同样,我们也可以创建多个mybatis-config.xml来配置数据源,每一个配置文件对应一个数据源及其对应的数据库表结构对象以及map映射文件。
map映射文件即为上面配置文件中的userMapper.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">
<!--
namespace:必须与对应的接口全类名一致
id:必须与对应接口的某个对应的方法名一致
-->
<mapper namespace="com.tgb.mapper.UserMapper">
<insert id="insert2log_khyw_busi_today" parameterType="com.tgb.model.LogHistory">
insert into log_khyw_busi_today
(ID, CREATETIME,IN_VALUE, OUT_VALUE,
BUSI_PART, FUNC_NO, STATUS, IPADDR, MAC, IDNO, MOBILE, HOSTIPADDR,
FUNDID, CUSTID, SYSTEM_PART, CIF_ACCOUNT, EXT1, EXT2, EXT3, EXT4) values
(seq_log_khyw_busi_today.NEXTVAL,
#{createTime,jdbcType=DATE},
#{in_value,jdbcType=VARCHAR},
#{out_value,jdbcType=VARCHAR},
#{busi_part,jdbcType=VARCHAR},
#{func_no,jdbcType=VARCHAR},
#{status,jdbcType=NUMERIC},
#{ipAddr,jdbcType=VARCHAR},
#{mac,jdbcType=VARCHAR},
#{idno,jdbcType=VARCHAR},
#{mobile,jdbcType=VARCHAR},
#{hostIpAddr,jdbcType=VARCHAR},
#{fundid,jdbcType=VARCHAR},
#{custid,jdbcType=VARCHAR},
#{systemPart,jdbcType=VARCHAR},
#{cif_account,jdbcType=VARCHAR},
#{ext1,jdbcType=VARCHAR},
#{ext2,jdbcType=VARCHAR},
#{ext3,jdbcType=VARCHAR},
#{ext4,jdbcType=VARCHAR})
</insert>
<!-- <insert id="insertLogHistory2operate_history" parameterType="java.util.List">
INSERT INTO operate_history(ID, OPERATE_TYPE,DICTIONARY_ID, USER_ID,
UPDATE_CONTENT, CREATE_DATE, CREATE_USER, EXT1, EXT2, EXT3, EXT4, OPERATE_NAME,
EXT5, EXT6, CONTENT, IDNO, MOBILE)
(
<foreach collection="list" index="" item="LogHistory"
separator="union all">
select
#{LogHistory.id}, #{LogHistory.operateType}, #{LogHistory.dictionaryId}, #{LogHistory.userId},
#{LogHistory.updateContent}, #{LogHistory.createDate}, #{LogHistory.createUser}, #{LogHistory.ext1},
#{LogHistory.ext2}, #{LogHistory.ext3}, #{LogHistory.ext4}, #{LogHistory.operateName}, #{LogHistory.ext5},
#{LogHistory.ext6}, #{LogHistory.content}, #{LogHistory.idno}, #{LogHistory.mobile}
from dual
</foreach>
)
</insert> -->
</mapper>
这里要说的有三点:
第一是parameterType对应的是参数类型,这里可以写mybatis-config.xml中的别名,也可以直接写全,即把路径都包含在内;
第二是在sql语句中的jdbcType,是对应数据表字段的类型,这里不写的话,如果插入的为null就会出错,其中number类型对应的是NUMERIC;
第三是namespace中的路径是该UserMapper.xml对应的mapper接口类,也即UserMapper.java,必须对应一直,即在UserMapper.xml中有几个sql方法那么在UserMapper.java中就应该有几个,否则不会起作用,同样方法名跟xml中的id要一致。放代码。
public interface UserMapper {
/**
* 插入日志到log_khyw_busi_today表中
* @param log
* @return
*/
int insert2log_khyw_busi_today(LogHistory log);
}
最后一个非常重要的一点就是SqlSessionFactory,用mybatis需要构建一个session工厂,这个工厂只是是单例模式,也就是一个数据源只能生成一个对象,否则会爆掉数据库连接。放代码:
public class SessionFactoryJK {
private static SqlSessionFactory sessionFactoryJK;
public static SqlSessionFactory getSqlSessionFactory() throws IOException {
String resource = "config/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
if(sessionFactoryJK == null) {
sessionFactoryJK = new SqlSessionFactoryBuilder().build(inputStream);
}
return sessionFactoryJK;
}
}
那么怎么调用呢,最后的代码
SqlSessionFactory sessionFactory = null;
SqlSession session = null;
sessionFactory = SessionFactoryJK.getSqlSessionFactory();
session = sessionFactory.openSession();
UserMapper mapper = session.getMapper(com.tgb.mapper.UserMapper.class);
result = mapper.insert2log_khyw_busi_today(log);
session.commit();
session.close();
恩,简单的mark应该就这些,最后数据库的插入可以用批量的方式,效率会提高一些,同时加上多线程。