design of self-loops and final states in fsm
Your original automaton is fine, it accepts the singleton $\{ab\}$. Here is a pictorial representation:



In the above automaton it's implicit that given a state and a letter for which there is no arrow going out of that state, then the automaton "crashes". If you want to be complete, you can add a dead state that absorbs strings that don't belong in the language. Here is the complete automaton:



If you add self-loops at 1 and/or 2, you will change the language that the automaton accepts. Look at this:



The self-loop at 1 labeled with $b$ changes the language to $\{ab, bab, bbab, bbbab, \dots\}$.