Q2) How to avoid in imutable class not to create a new instance if mutable object setter is called within?
Ans) Hint - Use clone of object within the constructor
Q3) How can we avoid performance hit if used synchronize in Singleton class.
Ans ) Hint - use Enum instead of singleton instance creation.
MyBatis eliminates almost all of the JDBC code and manual setting of parameters and retrieval of results.
web.xml
sql-map-config.xml
For Spring Mybatis, there are 3 ways to retrieve the sessions
A. extend SqlSessionDaoSupport
Step 1. Create SqlSessionFactory bean in config file
Step 2. Extend your dao class with SqlSessionDAOSupport and use getSQLSession() which will return SqlSessionTemplate
B. Use SqlSessionTemplate
Step 1. Create template bean
Step 2. user getSqlSession() in dao
C. Using MapperFactoryBean
Step 1. Create DAO interfaces (CustomerMapperInterface.java)
Step 2. Create base mapper object (BaseMapperInterface is a marker interface.)
Step 3. Define object specific mapper
Step 4. Define CustomerMapper.xml
Your queries
Step 5. Use mapper in service implementation class
@Service
public class CustomerService implements CustomerBaseService{
@Autowired
CustomerMapperInterface custMapper;
@Override
public Customer getCustomerById(long empId){
//retrieve from database
Customer cust = custMapper.getCustomerWithId(custId);
return cust;
}
}
ResultMap
Describes how to load your objects from the database result sets. typeHandler="com.aci.data.dao.mybatis.util.StringToBooleanTypeHandler" /> javaType="com.aci.model.Address">
Insert Statements
„h If your database supports auto-generated key fields (e.g. MySQL and SQL Server), then you can simply set useGeneratedKeys="true" and set the keyProperty to the target property
insert into Author (username,password,email,bio,isActive) values
(#{username},#{password},#{email},#{bio}, #{isActive, jdbcType=VARCHAR, typeHandler=com.wm.ping.data.dao.mybatis.util.StringToBooleanTypeHandler})
„h MyBatis has another way to deal with key generation for databases that don't support auto-generated column types, id="insertAuthor"
parameterType="domain.blog.Author"
flushCache="true"
statementType="PREPARED"
keyProperty=""
keyColumn=""
useGeneratedKeys="false"
timeout="20000">
SELECT Author_SEQ.NEXTVAL FROM DUAL
your query
Update Statements id="insertAuthor"
parameterType="domain.blog.Author"
flushCache="true"
statementType="PREPARED"
timeout="20000"> your query
Delete Statements id="insertAuthor"
parameterType="domain.blog.Author"
flushCache="true"
statementType="PREPARED"
timeout="20000"> your query
Reusable SQL fragment id,username,password
select from some_table where id = #{id}
Type Aliases
TypeHandler
public class StringToBooleanTypeHandler implements TypeHandler {
override getResult for ResultSet
override getResult for Callable statements
override setParameter for prepared statements
}
ResultHandlers
Allows you to handle each row as per your requirement.
Extend your class with ResultHandler and override method handleResult(ResultContext rc)
Cache
By default no caching except local session caching.
To enable 2nd level cache add following :
(Here I have added default values for properties, you can change it)
You can also implement custom cache by implementing Cache Interface given by mybatis
Dynamic SQL
¡E if statement
Add field / add where clause etc
¡E choose (when, otherwise)
For multiple if else conditions
¡E trim (where, set)
You can use with to dynamically add conditions
¡K
Also can use with to dynamically include columns to update statement
SELECT id, title, author FROM article WHERE id_category IN
#{category}
Q) How to sort collection on multiple attributes?
A) For classes that don’t implement
comparable interface, or when one needs even more control over ordering based on multiple attributes, a
Comparator interface should be used.
In C we can call printf() method with multiple arguments.
printf("%s", 50);
printf("%d %s %s", 250, "Hello", "World");
Varargs was added in Java 5 and the syntax includes three dots … (also called ellipses). Following is the syntax of vararg method.
publicvoidtestVar(intcount, String... vargs) { }
Notice the dots … in above code. That mark the last argument of the method as variable argument. Also the vararg must be the last argument in the method.
Now let us check simple hello world varargs code.
publicclassHelloWorldVarargs {
publicstaticvoidmain(String args[]) {
test(215, "India", "Delhi");
test(147, "United States", "New York", "California");
}
publicstaticvoidtest(intsome, String... args) {
System.out.print("\n"+ some);
for(String arg: args) {
System.out.print(", "+ arg);
}
}
}
Q) Enhanched for loop?
A) The usual way to step through all the elements of anarrayin order is with a "standard"for loop, for example,
for (int i = 0; i < myArray.length; i++) {
System.out.println(myArray[i]);
}
The so-called enhanced for loop is a simpler way to do this same thing. (The colon in the syntax can be read as "in.")
for (int myValue : myArray) {
System.out.println(myValue);
}
The enhanced for loop was introduced in Java 5 as a simpler way to iterate through all the elements of a Collection (Collections are not covered in these pages). It can also be used for arrays, as in the above example, but this is not the original purpose.
Enhanced for loops are simple but inflexible. They can be used when you wish to step through the elements of the array in first-to-last order, and you do not need to know the index of the current element. In all other cases, the "standard" for loop should be preferred.
Two additional statement types, break and continue, can also control the behavior of enhanced for loops.
Q) Static import?
A) Static imports concurrency utilities in package java.util.concurrent.