MyBatis
什么是MyBatis?
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
MyBatis的使用
1、用maven导入相关包
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency> //mybatis包
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.27</version>
</dependency>//mysql包
2、配置mybatis全局文件,以及在创建映射后关联映射文件
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd"> //文档标签规则dtd文档
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="MySql的URL"/>
<property name="username" value="账号"/>
<property name="password" value="密码"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/sxt/pojo/userMapper.xml"/>//关联映射文件
</mappers>
</configuration>
3、创建对应映射,即写sql语句
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sxt.pojo.userMapper">
<insert id="adduser" parameterType="com.sxt.pojo.User">
insert into mybatis(name,password) values(#{name},#{password}) //数据库插入语句
</insert>
</mapper>
4、测试
//1、加载配置文件
InputStream in = Resources.getResourceAsStream("mybatis-cfg.xml");
//2、获取SqlSessionFactory对象
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(in);
//3、通过SqlSessionFactory对象获取SqlSession对象
SqlSession ss=factory.openSession();
//4、通过session对象的API来执行操作
User user=new User();
user.setName("张三");
user.setPassword("123");
int insert = ss.insert("com.sxt.pojo.userMapper.adduser", user); //映射中配置的信息
//因为自动提交默认是关闭的,所以这里需要手动提交
ss.commit();
System.out.println(insert);//打印结果
使用的优化
在上面的代码中,有很多重复的地方,所以我们可以封装起来,还有一些我们可以使用动态代理来得到,这样就可以做到一些代码的简化
1、创建一个工具类DbUtils
public class DbUtils {
private static SqlSessionFactory factory;
public static SqlSessionFactory getSessionFactory(){
if (factory==null) {
try {
InputStream in=Resources.getResourceAsStream("mybatis-cfg.xml");
return new SqlSessionFactoryBuilder().build(in);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return factory;
}
}
2、创建一个接口
public interface MyBatisDao {
public int adduser(User user);
}
3、测试代码
public static void main(String[] args) {
MyBatisDao md=(MyBatisDao) Proxy.newProxyInstance
(Test2.class.getClassLoader(), new Class[]{MyBatisDao.class}, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
System.out.println("方法名:"+method.getName());
System.out.println("接口全路径:"+MyBatisDao.class.getName());
String methodName=method.getName();
String namespace=MyBatisDao.class.getName()+"."+methodName;
SqlSession session = DbUtils.getSessionFactory().openSession(true);
if (methodName.contains("add")) {
return session.insert(namespace,args[0]);
}
return null;
}
});
User user=new User();
user.setName("周5");
user.setPassword("12110");
md.adduser(user);
}
4、注意事项
这里的xml配置文件必须和接口放在同一包下,而且还与接口名同一名称。如果在查询方法时遇到错误,就将配置改成 < select id=“ID” parameterType=“java.util.Map” resultType=“java.util.Map” > 试一下。
我们还可以在全局配置文件中给别名
<typeAliases>
<typeAlias type="com.sxt.pojo.User" alias="user"/>
//大量情况下可以给个包路径
<package name="com.sxt.pojo"/>
</typeAliases>
当我们在配置文件中使用到com.sxt.pojo.User时可以用别名user代替
存贮集合
存贮集合时我们需要用到类型转换,我们也可以使用系统提供的转换器,也可以自定义一个转换器。
1、创建
创建一个类继承BaseTypeHandler<List < String > >,然后添加注解
@MappedJdbcTypes(JdbcType.VARCHAR)
@MappedTypes(List.class)
这是两个类型处理器注解
2、代码
在setNonNullParameter方法中写代码
@Override
public void setNonNullParameter
(PreparedStatement ps, int i, List<String> list, JdbcType jdbcType)
throws SQLException {
// TODO Auto-generated method stub
if (list!=null && list.size()>0) {
StringBuilder sbu=new StringBuilder();
for (String msg : list) {
sbu.append(msg+";");
}
ps.setString(i, sbu.toString() );
}
}
在全局配置文件中添加配置
<typeHandlers>
<typeHandler handler="com.sxt.typehandler.ListToVarcharHandler"/>
</typeHandlers>
测试代码
public static void main(String[] args) {
SqlSession session =DbUtils.getSessionFactory().openSession(true);
User user=new User();
user.setName("周5");
user.setPassword("12110");
user.setGames(Arrays.asList("ab","dc","bs"));
MyBatisDao mapper = session.getMapper(MyBatisDao.class);
System.out.println(mapper+"mapper");
mapper.adduser(user);
}
数据库存贮样例
取出存贮的集合信息
在ListToVarcharHandler类中的两个方法
@Override
public List<String> getNullableResult(ResultSet rs, String columnName) throws SQLException {
// TODO Auto-generated method stub
String msg=rs.getString(columnName);
if (msg!=null&&!"".equals("msg")) {
return Arrays.asList(msg.split(";"));
}
return null;
}
@Override
public List<String> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
// TODO Auto-generated method stub
String msg=rs.getString(columnIndex);
if (msg!=null&&!"".equals("msg")) {
return Arrays.asList(msg.split(";"));
}
return null;
}
测试
SqlSession session =DbUtils.getSessionFactory().openSession(true);
MyBatisDao md = session.getMapper(MyBatisDao.class);
List<User> list=md.query();
for (User user : list) {
System.out.println(user);
}
利用这种方式我们也能实现数据的插入和查询。
log4j
在程序的运行的过程中为了便于查询sql的输出,需要引入log4j,使用以后它会打印SQL语句
导入依赖
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
// maven坐标
创建一个File文档
然后再创建的File文档中添加代码
log4j.rootCategory=debug, stdout , R //debug是级别 stdout和R是日志的输出方式
log4j.appender.stdout=org.apache.log4j.ConsoleAppender ///将日志输出到控制台
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout //输出的布局
log4j.appender.stdout.layout.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n //输出的内容格式
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender //按天将日志信息输入进文件
log4j.appender.R.File=C:\\tools\\logs\\dpb.log //输出的目录
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n