SpringJDBC与MyBatis

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

SpringJDBC与MyBatis;实体类属性与数据库表字段名不一致的解决方法;

--------------------------------------------------------------------------------------------------------------------

springjdbc
一.springjdbc是什么?
 - spring框架对jdbc api的封装,使用起来更加简单.比如,不用考虑获得连接与关闭连接等等。

二.如何使用?
step1. 配置DataSource。
step2. 配置JdbcTemplate。
step3. 调用JdbcTemplate提供的方法。

1.    
    
        
        
        
        
        
        
    

2.    
    
        
    

3.
@Repository
public class UserDao {
    @Resource(name="jt")
    private JdbcTemplate jt;
    
    public void save(User user){
        String sql = "INSERT INTO l_user "
                + "VALUES(l_user_seq.nextval,?,? )";
        jt.update(sql,new Object[]{user.getName(),user.getAge()});
    }
    
    /*
     * 需要写一个RowMapper接口的类,该类规定了如何将结果集中的
     * 一条记录转换成相应的java对象(比如User对象)
     */
    public List findAll(){
        List users = new ArrayList();
        String sql = "SELECT *FROM L_USER ";
        users = jt.query(sql,new UserRowMapper());
        return users;
    }
    
    class UserRowMapper implements RowMapper{
        /*
         * rst:结果集;
         * index:记录的下标,从0开始
         * @see org.springframework.jdbc.core.RowMapper#mapRow(java.sql.ResultSet, int)
         */
        public User mapRow(ResultSet rs, int index) throws SQLException {
            User user = new User();
            user.setId(rs.getInt("id"));
            user.setName(rs.getString("name"));
            user.setAge(rs.getInt("age"));
            return user;
        }        
    }
    
    public User findById(int id){
        User user = null;
        String sql = "SELECT *FROM l_user "
                + "WHERE  id=? ";
        user = jt.queryForObject(sql, new Object[]{id},new UserRowMapper());
        return user;
    }
    /*
     * 这样写查询不到数据时不会报异常
     */
    public User findById2(int id){
        User user = null;
        String sql = "SELECT *FROM l_user "
                + "WHERE  id=? ";
        List users = jt.query(sql,new Object[]{id},new UserRowMapper());
        if(users!=null && users.size()>0){
            return users.get(0);
        }
        return user;
    }
    
    public void update(User user){
        String sql = "UPDATE l_user "
                + "SET name=?,age=? WHERE ID=?";
        jt.update(sql,new Object[]{user.getName(),user.getAge(),user.getId()});
    }
    
    public void delete(int id){
        String sql = "DELETE FROM l_user "
                + "WHERE id=?";
        jt.update(sql,new Object[]{id});
    }
    
    /**
     * 获得总的记录数.
     * 建议使用queryForObject方法.
     * 不建议使用queryForInt方法.
     * @return
     */
    public int getTotalRow(){
        String sql = "SELECT COUNT(*)FROM l_user";
        return jt.queryForObject(sql, Integer.class);
    }
}
------------------------------------------------------------------------------------------------------------------------
MyBatis简介
iBatis—>MyBatis

- 作用:对数据库进行操作
JDBC—>JdbcTemplate—>MyBatis

MyBatis是对JDBC技术的封装.
- 封装了获取连接,生成Statement,执行SQL过程
- 封装了SQL参数设置过程(将参数设置到#{xx})
- 封装了将结果集映射成实体对象过程(resultType指定,名称对应)


编程步骤:
SpringJDBC与MyBatis_第1张图片
- 导入mybatis包+数据库驱动包(mybatis-3.3.3.jar  ojdbc14-10.2.0.4.0.jar)
- 添加一个SqlMapConfig.xml主配置文件
- 根据表写实体类/在Mapper.xml配置文件中编写SQL/利用MyBatis调用SQL

SqlMapConfig.xml:
 
                        "http://ibatis.apache.org/dtd/ibatis-3-config.dtd">

    
        
            
            
                                     value="oracle.jdbc.OracleDriver" />
                                     value="jdbc:oracle:thin:@localhost :1521:xe"/>
                
                
            

        

    

    
    
        
    

 

实体类:
public class User implements Serializable{
    private Integer id;
    private String name;
    private Integer age;
    ...get/set方法    
}

在UserMapper.xml配置文件中编写SQL:
 
 "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
 
     
     
     
     
     
     
         INSERT INTO l_user
         (id,name,age)
         VALUES
          
         
         (l_user_seq.nextval,#{name},#{age})
     

     
     
         UPDATE l_user
         SET name=#{name},age=#{age}
         WHERE id=#{id}
     

     
     
         DELETE FROM l_user
         WHERE id=#{id}
     

     
     
     
     
     
     
     
     
     
 

利用MyBatis调用SQL:
一.Util:
public class MyBatisUtil {
    public static SqlSession getSession() throws Exception{
        /*
         * SqlSessionFactoryBuilder
         * SqlSessionFactory
         * SqlSession
         */
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        //加载SqlMapConfig.xml主配置文件
        String conf = "SqlMapConfig.xml";
        Reader reader = Resources.getResourceAsReader(conf);
        
        //SqlSessionFactory
        SqlSessionFactory factory = builder.build(reader);
        
        //SqlSession
        SqlSession session = factory.openSession();
        return session;
    }
}

测试类:
public class TestUser {
    @Test
    //测试获取SqlSession,findById
    public void test1() throws Exception{
        SqlSession session = MyBatisUtil.getSession();
        System.out.println(session);
        //使用SqlSession执行SQL操作
        User user = session.selectOne("findById",2);
        if(user != null){
            System.out.println(user);
            System.out.println(user.getName());
            System.out.println(user.getAge());
        }
        session.close();
    }
    
    @Test
    //测试findAll
    public void test2() throws Exception{
        SqlSession session = MyBatisUtil.getSession();
        List users = session.selectList("findAll");        
        for(User u:users){
            System.out.println(u.getId());
            System.out.println(u.getName());
            System.out.println(u.getAge());
        }
        session.close();
    }
    
    @Test
    //测试添加
    public void test3() throws Exception{
        SqlSession session = MyBatisUtil.getSession();
        User user = new User();
        //user.setId(10);用序列
        user.setName("MySQL");
        user.setAge(20);
        
        //执行insert
        session.insert("saveUser",user);
        //增删改需要手动提交事务
        session.commit();
        session.close();
    }
    
    @Test
    //测试更新
    public void test4() throws Exception{
        SqlSession session = MyBatisUtil.getSession();
        User user = new User();
        user.setId(1);
        user.setName("DAMEN");
        user.setAge(30);
        //返回值为更新的行数
        int rows = session.update("updateUser",user);
        if(rows>=1){
            System.out.println("更新成功!更新了"+rows+"行!");
        }else{
            System.out.println("更新失败!");
        }
        session.commit();
        session.close();
    }
    
    @Test
    //测试删除
    public void test5() throws Exception{
        SqlSession session = MyBatisUtil.getSession();
        int rows = session.delete("deleteUser",22);
        if(rows>=1){
            System.out.println("删除成功!删除了"+rows+"行!");
        }else{
            System.out.println("删除失败!");
        }
        session.commit();
        session.close();
    }
    
    @Test
    //测试模糊查询
    public void test6() throws Exception{
        SqlSession session = MyBatisUtil.getSession();
        List users = session.selectList("findLikeName", "M%");
        if(users!=null){
            for(User u:users){
                System.out.println(u.getId());
                System.out.println(u.getName());
                System.out.println(u.getAge());
            }
        }
        session.close();
    }
    
    @Test
    //测试map查询结果
    public void test7() throws Exception{
        SqlSession session = MyBatisUtil.getSession();
        Map map = session.selectOne("findName",23);
        if(map!=null){
            System.out.println(map);
            //查询出的map中的key为字段名,记录为value
            System.out.println(map.get("ID")+","+map.get("NAME"));
        }                
        session.close();
    }
    
    @Test
    //测试map查询结果
    public void test8() throws Exception{
        SqlSession session = MyBatisUtil.getSession();
        List> maps = session.selectList("findNames");
        if(maps!=null){
            for(Map m:maps){
                //查询出的map中的key为字段名,记录为value
                System.out.println(m.get("ID")+","+m.get("NAME"));
            }        
        }                
        session.close();
    }
    
    @Test
    //测试返回list查询结果
    public void test9() throws Exception{
        SqlSession session = MyBatisUtil.getSession();
        List> maps = session.selectList("findAllUsers");
        if(maps!=null){
            for(Map m:maps){
                //查询出的map中的key为字段名,记录为value
                System.out.println(m.get("ID")+","+m.get("NAME")+","+m.get("AGE"));
            }        
        }                
        session.close();
    }
    
    @Test
    //测试Mapper映射其接口
    public void test10() throws Exception{
        SqlSession session = MyBatisUtil.getSession();
        //根据接口生成实现对象
        UserDAO dao = session.getMapper(UserDAO.class);
        System.out.println(dao.getClass().getName());
        
        List users = dao.findAll();
        if(users!=null){
            for(User u:users){
                System.out.println(u.getId()+","+u.getName()+","+u.getAge());
            }
        }
        session.close();
    }
}
------------------------
Mapper映射器(接口)

MyBatis提供了一个Mapper映射器接口规则,按规则写出的接口,MyBatis框架可以自动生成实现组件对象。
(不再需要自己写dao,只需要写实体类对应的接口即可)

UserDAO接口—》JdbcUserDAO实现类—》生成对象使用
Mapper映射器接口—》生成对象使用

映射器接口接口规则:
- 方法名参考SQL定义的id属性(保持一致)
- 方法参数类型参考SQL定义的parameterType属性(保持一致)
-方法返回类型
     - 增删改:可以是void 或 int
     - 查询:单行结果类型为resultType,多行结果类型为List
     - 将SQL定义文件元素的namespace属性指定为"包名.接口名"

/**
 * Mapper映射器接口:对应UserMapper.xml里的sql语句
 * 方法名--->id属性
 * 参数--->parameterType属性
 * 返回值类型-->增删改void或int;查询参考resultType属性
 *                 查询结果为多个的话返回值为list类型.
 * @author Administrator
 *
 */
public interface UserDAO {
    public User findById(int id);
    public List findAll();
    public int saveUser(User user);
    public int updateUser(User user);
    public int deletdUser(int id);
    public List findLikeName(String name);
    public Map findName(int id);
    public List> findNames();
    public List> findAllUsers();    
}
-----------------------------------------------------------------------------------------------------------
实体类属性与数据库表字段名不一致的解决方法: 
    
    
     
     
      
     
     
         
         
         
     

--------------------------------------------------------------------------------------------------------------------

转载于:https://my.oschina.net/langgege/blog/686230

你可能感兴趣的:(SpringJDBC与MyBatis)