menu

Mybatis的初使用

导包

导包啊(我用的mybatis-3.4.6和mysql-connector-java 5.1.46,log4j的配置 ) 为了更好的可视化MySQL,我推荐一个链接使用Navicat for MySQL https://blog.csdn.net/wypersist/article/details/79834490 在MySQL中新建一个ssm数据库,并且创建了一个customer表,字段如下pojo类所示

编写pojo类

public class Customer {

private Integer id ;//主键字段不应该有的,在数据库中为自增的主键

private  String name;
private String gender;
private String telephone;
private  String address;
这里的字段就是和数据库中的字段要一一对应的。

配置mybatis

这是核心配置文件mybatis-config.xml,相当于总包,装很多映射的 <!DOCTYPE configuration PUBLIC “-//mybatis.org//DTD Config 3.0//EN” “http://mybatis.org/dtd/mybatis-3-config.dtd”>

其中连接的配置 config.properties单独写,以便换数据库的 jdbc.driver = com.mysql.jdbc.Driver jdbc.url = jdbc:mysql://192.168.74.130:3306/ssm?characterEncoding=UTF-8 jdbc.username = root jdbc.password = qaz123

接下来就要写具体实体类的操作实现了 如上面核心配置文件包含的的Customer.xml。。简单说就是映射dao里的接口和SQL语句实现 <!DOCTYPE mapper PUBLIC “-//mybatis.org//DTD Mapper 3.0//EN” “http://mybatis.org/dtd/mybatis-3-mapper.dtd”>

INSERT INTO t_customer (name, gender, telephone, address) VALUES (#{name}, #{gender}, #{telephone}, #{address})

凡是涉及到类名引用的都要使用包名.类(全路径)

写一个测试类验证连接

import dao.CustomerMapper; import domain.Customer; 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 java.io.IOException; import java.io.InputStream;

public class MybatisTest { @Test public void test() throws IOException{ //1.先创建 SqlSessionFactoryBuilder的构造器 SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder(); //加载mybatis核心配置文件 InputStream is = Resources.getResourceAsStream(“resources/mybatis-config.xml”); SqlSessionFactory factory=builder.build(is); //打开sqlSession SqlSession sqlSession=factory.openSession(); //获取mapper接口的对象 CustomerMapper customerMapper =sqlSession.getMapper(CustomerMapper.class); //操作 Customer customer=new Customer(); customer.setName(“liuyan”); customer.setAddress(“wuhanCity”); customer.setGender(“女”); customer.setTelephone(“13256462”); customerMapper.saveCustomer(customer); //提交事务 sqlSession.commit(); //关闭资源 sqlSession.close(); } }

为啥要用mybatis

以前写dao层impl的时候是要实现具体的内容并且返回结果的 package com.sm.dao.impl;

import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Date; import java.util.List;

import com.sm.bean.User; import com.sm.dao.UserDao; import com.sm.util.BaseDao; import com.sm.util.Page;

public class UserDaoImpl implements UserDao { BaseDao bDao=new BaseDao(); @Override public User login(String name, String pwd) { String sql=”select * from smbms_user where userCode=? and userPassword=?”; ResultSet rSet= bDao.query(sql,name,pwd); User user=new User(); try { while (rSet.next()) { user.setId(rSet.getInt(1)); user.setUserCode(rSet.getString(2)); user.setUserName(rSet.getString(3)); user.setUserPassWord(rSet.getString(4)); user.setGender(rSet.getInt(5)); user.setBirthday(rSet.getDate(6)); user.setPhone(rSet.getString(7)); user.setAddress(rSet.getString(8)); user.setUserRole(rSet.getInt(9)); user.setCreatedBy(rSet.getInt(10)); user.setCreationDate(rSet.getDate(11)); user.setModifyBy(rSet.getInt(12)); user.setModifyDate(rSet.getDate(13)); } } catch (SQLException e) { e.printStackTrace(); }

	return user;
}
@Override
public List<User> queryAll(Page page,String userCode,String userRole) {
	String sql=null;
	ResultSet rSet=null;
	List<User> users=new ArrayList<User>();
  if (("".equals(userCode)||userCode==null)&& ("".equals(userRole)||userRole==null)||userRole.equals("0")) {
	  sql="select * from smbms_user limit ?,?";
	  rSet= bDao.query(sql,page.getNowBySql(),page.getCount());
}else if ((!"".equals(userCode)&&userCode!=null)&& ("".equals(userRole)||userRole==null||userRole.equals("0"))) {
	sql="select * from smbms_user where userCode like ? LIMIT ?,?";
rSet=bDao.query(sql, "%"+userCode+"%",page.getNowBySql(),page.getCount());
}else if (("".equals(userCode)||userCode==null)&& (!"".equals(userRole)&&userRole!=null&&!userRole.equals("0"))) {
	sql="select * from smbms_user where userRole =? LIMIT ?,?";
	rSet=bDao.query(sql,userRole,page.getNowBySql(),page.getCount());

}else if ((!"".equals(userCode)&&userCode!=null)&& (!"".equals(userRole)&&userRole!=null&&!userRole.equals("0"))) {
	sql="select * from smbms_user where userCode like ? and userRole =? LIMIT ?,?";
	rSet=bDao.query(sql, "%"+userCode+"%",userRole,page.getNowBySql(),page.getCount());
}
 
	try {
		while (rSet.next()) {
			User user=new User();
			 user.setId(rSet.getInt(1));
			 user.setUserCode(rSet.getString(2));
			 user.setUserName(rSet.getString(3));
			 user.setUserPassWord(rSet.getString(4));
			 user.setGender(rSet.getInt(5));
			user.setBirthday(rSet.getDate(6));
			user.setPhone(rSet.getString(7));
			user.setAddress(rSet.getString(8));
			user.setUserRole(rSet.getInt(9));
			user.setCreatedBy(rSet.getInt(10));
			user.setCreationDate(rSet.getDate(11));
			user.setModifyBy(rSet.getInt(12));
			user.setModifyDate(rSet.getDate(13));
			users.add(user);
		}
	} catch (SQLException e) {
		e.printStackTrace();
	}
	return users;
}
@Override
public int queryByCount(String userCode,String userRole) {
	
	
	
	String sql=null;
	ResultSet rSet=null;
	  if (("".equals(userCode)||userCode==null)&& ("".equals(userRole)||userRole==null)||userRole.equals("0")) {
		  sql="select count(*) from smbms_user ";
		  rSet= bDao.query(sql);
	}else if ((!"".equals(userCode)&&userCode!=null)&& ("".equals(userRole)||userRole==null||userRole.equals("0"))) {
		sql="select count(*) from smbms_user where userCode like ? ";
	rSet=bDao.query(sql, "%"+userCode+"%");
	}else if (("".equals(userCode)||userCode==null)&& (!"".equals(userRole)&&userRole!=null&&!userRole.equals("0"))) {
		sql="select count(*) from smbms_user where userRole =? ";
		rSet=bDao.query(sql,userRole);
	
	}else if ((!"".equals(userCode)&&userCode!=null)&& (!"".equals(userRole)&&userRole!=null&&!userRole.equals("0"))) {
		sql="select count(*) from smbms_user where userCode like ? and userRole =? ";
		rSet=bDao.query(sql, "%"+userCode+"%",userRole);
	}
	  
	int count=0;//代表用户的数量
	 System.out.println("sql==>"+sql);
  	try {
		if (rSet.next()) {
		count=	rSet.getInt(1);
		}
	} catch (SQLException e) {
		e.printStackTrace();
	}
  	
	return count;
}
@Override
public int addUser(User user,int id) {
	String sql="INSERT INTO `smbms_user`(`userCode`,`userName`,`userPassword`,`gender`,`birthday`,`phone`,`address`,`userRole`,`createdBy`,`creationDate`) VALUES (?,?,?,?,?,?,?,?,?,?);";
	int num= bDao.update(sql,user.getUserCode(),user.getUserName(),user.getUserPassWord(),user.getGender(),user.getBirthday(),user.getPhone(),user.getAddress(),user.getUserRole() ,id,new Date());
	
	return num;
}
@Override
public int updateUser(User user) {
	String sql="update smbms_user set userName=? ,gender=? , birthday=? , phone=? , address=?, userRole=?, modifyBy=?, modifyDate=? where id=?";
	int num=bDao.update(sql,user.getUserName(),user.getGender(),user.getBirthday(),user.getPhone(),user.getAddress(),user.getUserRole(),user.getModifyBy(),user.getModifyDate(),user.getId());
	return num;
}
@Override
public int deleteUser(String id) {
	String sql="delete  from smbms_user where id=?";
int num=	bDao.update(sql,id);
	
	
	return num;
}
@Override
public int updatePwd(int id, String pwd) {
	String sql="update smbms_user set userPassword=? where id=?";
	int num=bDao.update(sql,pwd,id);
	return num;
}

} 这就显得结构混乱,Java混杂SQL语句,可读性差。其他的

  1. 易于上手和掌握。

  2. sql写在xml里,便于统一管理和优化。

  3. 解除sql与程序代码的耦合。

  4. 提供映射标签,支持对象与数据库的orm字段关系映射

  5. 提供对象关系映射标签,支持对象关系组建维护

  6. 提供xml标签,支持编写动态sql。 也有不好的
  7. sql工作量很大,尤其是字段多、关联表多时,更是如此。

  8. sql依赖于数据库,导致数据库移植性差。

  9. 由于xml里标签id必须唯一,导致DAO中方法不支持方法重载。

  10. 字段映射标签和对象关系映射标签仅仅是对映射关系的描述,具体实现仍然依赖于sql。(比如配置了一对多Collection标签,如果sql里没有join子表或查询子表的话,查询后返回的对象是不具备对象关系的,即Collection的对象为null)

  11. DAO层过于简单,对象组装的工作量较大。

  12.  不支持级联更新、级联删除。

  13. 编写动态sql时,不方便调试,尤其逻辑复杂时。

8 提供的写动态sql的xml标签功能简单(连struts都比不上),编写动态sql仍然受限,且可读性低。

  1. 若不查询主键字段,容易造成查询出的对象有“覆盖”现象。

  2. 参数的数据类型支持不完善。(如参数为Date类型时,容易报没有get、set方法,需在参数上加@param)

  3. 多参数时,使用不方便,功能不够强大。(目前支持的方法有map、对象、注解@param以及默认采用012索引位的方式)

  4. 缓存使用不当,容易产生脏数据。 总结:

mybatis的优点其实也是mybatis的缺点,正因为mybatis使用简单,数据的可靠性、完整性的瓶颈便更多依赖于程序员对sql的使用水平上了。sql写在xml里,虽然方便了修改、优化和统一浏览,但可读性很低,调试也非常困难,也非常受限,无法像jdbc那样在代码里根据逻辑实现复杂动态sql拼接。mybatis简单看就是提供了字段映射和对象关系映射的jdbc,省去了数据赋值到对象的步骤而已,除此以外并无太多作为,不要把它想象成hibernate那样强大,简单小巧易用上手,方便浏览修改sql就是它最大的优点了。

mybatis适用于小型且程序员能力较低的项目和人群使用,对于中大型项目来说我并不推荐使用,如果觉得hibernate效率低的话(实际上也是使用不当所致,hibernate是实际上是不适用于拥有高负载的工程项目),还不如直接用spring提供的jdbc简单框架(Template),同样支持对象映射。

作者:wangpeng047 来源:CSDN 原文:https://blog.csdn.net/wangpeng047/article/details/17039573 版权声明:本文为博主原创文章,转载请附上博文链接!


还没想好

各种分享

微信搜索号: iris
wechat 微信号:ly.c