2019独角兽企业重金招聘Python工程师标准>>>
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
List
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
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指定,名称对应)
编程步骤:
- 导入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">
实体类:
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
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
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
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
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
public int saveUser(User user);
public int updateUser(User user);
public int deletdUser(int id);
public List
public Map
public List
public List
}
-----------------------------------------------------------------------------------------------------------
实体类属性与数据库表字段名不一致的解决方法:
--------------------------------------------------------------------------------------------------------------------