我們在實際開發中,會遇到實體類與數據庫類不匹配的情況,在開發中就會產生各種各樣的錯誤,那么我們應該怎么去解決這一類的錯誤呢?很簡單,下面我們介紹兩種解決方法:
首先我們看一下數據庫和實體類不匹配的情況:
解決辦法1
當我們查詢的時候我們可以在映射文件mapper.xml
中采取取別名的方式:
<select id="findAll" resultMap="cn.com.scitc.domian.User" >
select id as userId,username as userName,birthday as userBirthday,sex as userSex,address as userAddress from user
</select>
<!--配置查詢所有-->
<select id="findAll" resultType="cn.com.scitc.domian.User" >
-- select id as userId,username as userName,birthday as userBirthday,sex as userSex,address as userAddress from user
select * from user;
</select>
<!--save-->
<insert id="saveUser" parameterType="cn.com.scitc.domian.User">
<!-- 配置插入操作后,獲取插入數據的id keyProperty實體類 keyColum是數據庫的值 order什么時候操作-->
<selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER" >
select last_insert_id()
</selectKey>
insert into user (username,birthday,sex,address) values (#{userName},#{userBirthday},#{userSex},#{userAddress});
</insert>
<!--update-->
<update id="updateUser" parameterType="cn.com.scitc.domian.User">
update user set username = #{userName},birthday=#{userBirthday},sex=#{userSex},address=#{userAddress} where id=#{id}
</update>
<!--delete-->
<delete id="deleteUser" parameterType="int">
delete from user where id = #{id}
</delete>
<!--用id 查詢一個 交代清楚返回的結果-->
<select id="findById" parameterType="Integer" resultType="cn.com.scitc.domian.User">
select * from user where id = #{userId}
</select>
<!--username模糊查詢-->
<select id="fingByName" parameterType="string" resultType="cn.com.scitc.domian.User">
select * from user where username like #{userName}
</select>
我們再看看接口和測試類
接口dao中
public interface UserDao {
// 查詢所有
// @Select("select * from user")
List<User> findAll();
// save
void saveUser(User user);
// update
void updateUser(User user);
// delete
void deleteUser(Integer userId);
// 查詢一個
User findById(Integer userId);
// 根據名稱 模糊查詢
List<User> fingByName(String username);
}
實現類:
public class MybatisTest {
// 初始化值
private InputStream in;
private SqlSession sqlSession;
private UserDao userDao;
// 在測試方法執行之前執行
@Before
public void init() throws Exception{
// 讀取文件
in = Resources.getResourceAsStream("mybatis-Config.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
sqlSession = factory.openSession();
userDao = sqlSession.getMapper(UserDao.class);
}
@After
public void destory() throws Exception{
// 提交事務
sqlSession.commit();
// 釋放資源
sqlSession.close();;
in.close();
}
@Test
public void testFindAll() throws Exception{
List<User> users = userDao.findAll();
for (User user : users){
System.out.println("對象有:"+user);
}
}
// saveTest
@Test
public void TestSave() {
User user = new User();
user.setUserName("modify 修改");
user.setUserBirthday(new Date());
System.out.println("保存方法之前"+user);
user.setUserSex("男");
user.setUserAddress("天津");
userDao.saveUser(user);
System.out.println("保存方法之后"+user);
}
// update
@Test
public void TestUpdate() {
User user = new User();
user.setUserId(5);
user.setUserName("aa");
user.setUserBirthday(new Date());
user.setUserSex("男");
user.setUserAddress("德陽");
userDao.updateUser(user);
}
@Test
public void TestDelete(){
userDao.deleteUser(5);
}
// findById
@Test
public void findById(){
User user = userDao.findById(3);
System.out.println(user);
}
//username模糊查詢
@Test
public void TestFindByName(){
List<User> users = userDao.fingByName("%李%");
// List<User> users = userDao.fingByName("李四");
for (User user:users){
System.out.println(user);
}
}
//查詢總記錄數
@Test
public void findTotal(){
int count = userDao.findTotal();
System.out.println(count);
}
//username模糊查詢
@Test
public void TestQuery(){
QueryVo queryVo = new QueryVo();
User user = new User();
user.setUserName("%李%");
queryVo.setUser(user);
List<User> userByVo = userDao.findUserByVo(queryVo);
for (User u:userByVo){
System.out.println(u);
}
}
}
解決辦法2
配置查詢結果的列名和實體類的屬性名對應的關系
依然是映射文件
<!--配置查詢結果的列名 和實體類的屬性名對應的關系-->
<resultMap id="userMap" type="cn.com.scitc.domian.User">
<!--主鍵字段對應名-->
<id property="userId" column="id"></id>
<!--非主鍵字段的對應 property是實體類嚴格區分大小寫 column數據庫字段嚴格按照數據庫字段 -->
<result property="userName" column="username"></result>
<result property="userBirthday" column="birthday"></result>
<result property="userSex" column="sex"></result>
<result property="userAddress" column="address"></result>
</resultMap>
我們在mapper.xml文件中配置這些配置的作用就是與數據庫進行關聯:
=注意
主鍵 :實體類的主鍵id一定要和數據庫的主鍵id寫對
property:是實體類嚴格區分大小寫
column數據庫字段嚴格按照數據庫字段
配置好這些 我們就開始引用。
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace dao權限類名===別名-->
<mapper namespace="cn.com.scitc.dao.UserDao">
<!--配置查詢結果的列名 和實體類的屬性名對應的關系-->
<resultMap id="userMap" type="cn.com.scitc.domian.User">
<!--主鍵字段對應名-->
<id property="userId" column="id"></id>
<!--非主鍵字段的對應 property是實體類嚴格區分大小寫 column數據庫字段嚴格按照數據庫字段 -->
<result property="userName" column="username"></result>
<result property="userBirthday" column="birthday"></result>
<result property="userSex" column="sex"></result>
<result property="userAddress" column="address"></result>
</resultMap>
<!--配置查詢所有-->
<select id="findAll" resultType="userMap" >
-- select id as userId,username as userName,birthday as userBirthday,sex as userSex,address as userAddress from user
select * from user;
</select>
<!--save-->
<insert id="saveUser" parameterType="userMap">
<!-- 配置插入操作后,獲取插入數據的id keyProperty實體類 keyColum是數據庫的值 order什么時候操作-->
<selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER" >
select last_insert_id()
</selectKey>
insert into user (username,birthday,sex,address) values (#{userName},#{userBirthday},#{userSex},#{userAddress});
</insert>
<!--update-->
<update id="updateUser" parameterType="userMap">
update user set username = #{userName},birthday=#{userBirthday},sex=#{userSex},address=#{userAddress} where id=#{id}
</update>
<!--delete-->
<delete id="deleteUser" parameterType="int">
delete from user where id = #{id}
</delete>
<!--用id 查詢一個 交代清楚返回的結果-->
<select id="findById" parameterType="Integer" resultType="userMap">
select * from user where id = #{userId}
</select>
<!--username模糊查詢-->
<select id="fingByName" parameterType="string" resultType="userMap">
select * from user where username like #{userName}
</select>
<!--username模糊查詢 第二種寫法-->
<!--<select id="fingByName" parameterType="string" resultType="cn.com.scitc.domian.User">-->
<!--select *from user where username like '%${value}%'-->
<!--</select>-->
<!--獲取用戶總記錄條數-->
<select id="findTotal" resultType="int">
select count(id) from user
</select>
<!--根據queryVo的條件查詢用戶-->
<select id="findUserByVo" parameterType="cn.com.scitc.domian.QueryVo" resultType="UserMap">
select * from user where username like #{user.userName}
</select>
</mapper>
就是相當於把每一個要執行的sql語句的resultType的參數換成resultMap的值。
最后在進行測試就OK.。