导包
导包啊(我用的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”>
凡是涉及到类名引用的都要使用包名.类(全路径)
写一个测试类验证连接
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语句,可读性差。其他的
-
易于上手和掌握。
-
sql写在xml里,便于统一管理和优化。
-
解除sql与程序代码的耦合。
-
提供映射标签,支持对象与数据库的orm字段关系映射
-
提供对象关系映射标签,支持对象关系组建维护
- 提供xml标签,支持编写动态sql。 也有不好的
-
sql工作量很大,尤其是字段多、关联表多时,更是如此。
-
sql依赖于数据库,导致数据库移植性差。
-
由于xml里标签id必须唯一,导致DAO中方法不支持方法重载。
-
字段映射标签和对象关系映射标签仅仅是对映射关系的描述,具体实现仍然依赖于sql。(比如配置了一对多Collection标签,如果sql里没有join子表或查询子表的话,查询后返回的对象是不具备对象关系的,即Collection的对象为null)
-
DAO层过于简单,对象组装的工作量较大。
-
不支持级联更新、级联删除。
- 编写动态sql时,不方便调试,尤其逻辑复杂时。
8 提供的写动态sql的xml标签功能简单(连struts都比不上),编写动态sql仍然受限,且可读性低。
-
若不查询主键字段,容易造成查询出的对象有“覆盖”现象。
-
参数的数据类型支持不完善。(如参数为Date类型时,容易报没有get、set方法,需在参数上加@param)
-
多参数时,使用不方便,功能不够强大。(目前支持的方法有map、对象、注解@param以及默认采用012索引位的方式)
-
缓存使用不当,容易产生脏数据。 总结:
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 版权声明:本文为博主原创文章,转载请附上博文链接!
还没想好
各种分享