mybatis呢是一个orm数据库框架,非常适合新人学,门槛相对较低
本人呢曾经是先做的hibernate,后接触的mybatis,接触mabatis前我比较抵触,为啥呢,
当时喜欢hibernate的POJO,直接注解实体映射数据库表对象,要增删改造直接get(id),save(entity),delete(entity),update(entity),显得非常方便;
而且又支持hql的查询
但是,久而久之,很多数据库性能方面的问题会暴露出来,你必须直接优化sql语句,那么hibernate的弊端就出现了
虽然mybatis需要手写sql语句,其实也挺不错,字段映射就OK了,多写写sql也是有好处滴
那有的人会问了,什么时候用hibernate,什么时候用mybatis呢?
回答曰:看项目呗,如果项目挺大,那就是mybatis,如果项目相对较小,是个后台管理系统,对数据的查询量不是特别多,那就用hibernate呗
或者干脆每个项目都用mybatis都行啊~!
除此之外,也有部分企业使用的自己开发的orm框架,连数据源都是自己的,那这样当然最好
好吧,废话有点多,咱写代码的还是直接贴码吧:
(头几篇博文不会使用maven,后面的ssm整合会使用maven来进行管理)
工程结构:
asm-3.3.1.jar
cglib-2.2.2.jar
commons-logging-1.1.1.jar
javassist-3.17.1-GA.jar
log4j-1.2.17.jar
log4j-api-2.0-beta9.jar
log4j-core-2.0-beta9.jar
mybatis-3.2.3.jar
mysql-connector-java-5.1.7-bin.jar
slf4j-api-1.7.5.jar
slf4j-log4j12-1.7.5.jar
SqlMapConfig.xml,这个可以理解为连接mybatis和数据库的媒介,以及一些mybatis配置都在这个文件里
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE configuration 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 5 <configuration> 6 <!-- 和spring整合后 environments配置将废除--> 7 <environments default="development"> 8 <environment id="development"> 9 <transactionManager type="JDBC" /> 10 <dataSource type="POOLED"> 11 <property name="driver" value="com.mysql.jdbc.Driver" /> 12 <property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" /> 13 <property name="username" value="root" /> 14 <property name="password" value="root" /> 15 </dataSource> 16 </environment> 17 </environments> 18 19 <!-- 配置mapper映射文件 --> 20 <mappers> 21 <mapper resource="sqlmap/User.xml"/> 22 </mappers> 23 </configuration>
User.xml 这个文件就是正对user实体进行的相关查询,命名同User.java
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <!-- namespace命名空间特殊作用: 如果使用mapper动态代理方法,这里就需要配置mapper接口地址--> 6 7 <mapper namespace="test"> 8 <!-- 根据用户id查询一条记录(返回单条记录) --> 9 <!-- 10 select标签表示sql查询,内容会封装到Mapped Statement中。 11 可以将这个select标签称为一个Statement 12 id:Statement的id,用于标识select中定义的 sql,id是在同一个命名空间中不允许重复 13 #{}:表示一个占位符,避免sql注入 14 parameterType:表示输入参数的类型 15 resultType:表示输出 结果集单条记录映射的java对象类型,select查询的字段名和resultType中属性名一致,才能映射成功。 16 #{value}:value表示parameter输入参数的变量,如果输入参数是简单类型,使用#{}占位符,变量名可以使用value或其它的名称 17 18 --> 19 <select id="findUserById" parameterType="int" resultType="com.mybatis001.bean.User"> 20 21 SELECT * FROM USER WHERE id = #{id} 22 23 </select> 24 25 26 <!-- 查询用户列表(返回list集合) --> 27 <!-- 28 不管结果集查询一条还是多条,resultType指定结果集单条记录映射的java对象类型 29 ${}:表示sql拼接,相当于sql字符串拼接,无法避免sql注入 30 ${value}:value表示parameter输入参数的变量,如果输入参数是简单类型,使用${}拼接符,变量名必须使用value 31 ${value}直接 将value获取到拼接在sql中,value值不加任何修饰 32 --> 33 <select id="findUserList" parameterType="java.lang.String" resultType="com.mybatis001.bean.User" > 34 select * from user where name like '%${value}%' 35 </select> 36 37 38 <!-- 添加用户 39 parameterType:如果parameterType指定 是pojo,在#{}中指定 pojo的属性名获取该pojo的属性值 40 --> 41 <insert id="insertUser" parameterType="com.mybatis001.bean.User"> 42 43 <!-- 44 keyProperty:将主键设置到pojo中哪个属性中 45 order:selectKey中sql执行的时机 46 resultType:selectKey中sql执行的结果类型 47 LAST_INSERT_ID:是insert后获取自增主键值 48 --> 49 <!-- 这样的写法,在执行后,会再user这个entity中设置id的值 --> 50 <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer"> 51 select LAST_INSERT_ID() 52 </selectKey> 53 54 insert into user(name,age,sex) values(#{name},#{age},#{sex}) 55 </insert> 56 57 <!-- 根据主键删除用户 --> 58 59 <delete id="deleteUser" parameterType="int"> 60 delete from user where id=#{id} 61 </delete> 62 63 <!-- 根据主键用户更新 64 更新传入输入参数见容:id和更新的信息 65 --> 66 <update id="updateUser" parameterType="com.mybatis001.bean.User"> 67 update user set name=#{name},age=#{age},sex=#{sex} where id=#{id} 68 </update> 69 70 71 </mapper>
User.java
1 package com.mybatis001.bean; 2 3 public class User { 4 5 private int id; 6 private String name; 7 private int age; 8 private String sex; 9 10 public User() { 11 super(); 12 } 13 14 public User(String name, int age, String sex) { 15 super(); 16 this.name = name; 17 this.age = age; 18 this.sex = sex; 19 } 20 21 public int getId() { 22 return id; 23 } 24 public void setId(int id) { 25 this.id = id; 26 } 27 public String getName() { 28 return name; 29 } 30 public void setName(String name) { 31 this.name = name; 32 } 33 public int getAge() { 34 return age; 35 } 36 public void setAge(int age) { 37 this.age = age; 38 } 39 public String getSex() { 40 return sex; 41 } 42 public void setSex(String sex) { 43 this.sex = sex; 44 } 45 46 @Override 47 public String toString() { 48 return "User [id=" + id + ", name=" + name + ", age=" + age + ", sex=" 49 + sex + "]"; 50 } 51 52 }
UserDao.java
1 package com.mybatis001.dao; 2 3 import java.util.List; 4 5 import com.mybatis001.bean.User; 6 7 public interface UserDao { 8 9 public User findUserById(int id) throws Exception; 10 11 public List<User> findUserList(String name) throws Exception; 12 13 public Integer insertUser(User user) throws Exception; 14 15 public void deleteUser(int id) throws Exception; 16 17 public void updateUser(User user) throws Exception; 18 19 }
UserDaoImpl.java
1 package com.mybatis001.dao.impl; 2 3 import java.util.List; 4 5 import org.apache.ibatis.session.SqlSession; 6 import org.apache.ibatis.session.SqlSessionFactory; 7 8 import com.mybatis001.bean.User; 9 import com.mybatis001.dao.UserDao; 10 11 public class UserDaoImpl implements UserDao { 12 13 // 注入SqlSessionFactory 14 private SqlSessionFactory sqlSessionFactory; 15 16 public UserDaoImpl(SqlSessionFactory sqlSessionFactory) { 17 this.sqlSessionFactory = sqlSessionFactory; 18 } 19 20 @Override 21 public User findUserById(int id) throws Exception { 22 23 // 根据SqlSessionFactory创建SqlSession 24 25 SqlSession sqlSession = sqlSessionFactory.openSession(); 26 27 // 通过sqlSession查询用户信息(发起数据库操作) 28 // 第一个参数statement:指定mapper映射文件中statement的id,指定 时需要前边加上statement所属的命名空间 29 // 第二个参数parameter,指定 输入参数 30 // selectOne返回的是单条记录,如果select返回多条记录(list集合),使用selectOne会报错 31 // 根据映射文件中的resultType指定输出类型 32 User user = sqlSession.selectOne("test.findUserById", id); 33 return user; 34 } 35 36 @Override 37 public List<User> findUserList(String name) throws Exception { 38 SqlSession sqlSession = sqlSessionFactory.openSession(); 39 List<User> userList = sqlSession.selectList("test.findUserList", name); 40 return userList; 41 } 42 43 @Override 44 public Integer insertUser(User user) throws Exception { 45 SqlSession sqlSession = sqlSessionFactory.openSession(); 46 int lastUserId = sqlSession.insert("test.insertUser", user); 47 48 sqlSession.commit(); 49 sqlSession.close(); 50 return lastUserId; 51 } 52 53 @Override 54 public void deleteUser(int id) throws Exception { 55 SqlSession sqlSession = sqlSessionFactory.openSession(); 56 sqlSession.delete("test.deleteUser", id); 57 sqlSession.commit(); 58 sqlSession.close(); 59 } 60 61 @Override 62 public void updateUser(User user) throws Exception { 63 SqlSession sqlSession = sqlSessionFactory.openSession(); 64 sqlSession.update("test.updateUser", user); 65 sqlSession.commit(); 66 sqlSession.close(); 67 } 68 69 }
测试:
1 package com.test.mybatis001; 2 3 4 import java.io.InputStream; 5 import java.util.List; 6 7 import org.apache.ibatis.io.Resources; 8 import org.apache.ibatis.session.SqlSessionFactory; 9 import org.apache.ibatis.session.SqlSessionFactoryBuilder; 10 import org.junit.Before; 11 import org.junit.Test; 12 13 import com.mybatis001.bean.User; 14 import com.mybatis001.dao.UserDao; 15 import com.mybatis001.dao.impl.UserDaoImpl; 16 17 public class UserDaoImplTest { 18 19 // 会话工厂 20 private SqlSessionFactory sqlSessionFactory; 21 22 @Before 23 public void setUp() throws Exception { 24 // 加载配置文件 25 String resource = "SqlMapConfig.xml"; 26 InputStream inputStream = Resources.getResourceAsStream(resource); 27 28 // 根据mytais的配置创建SqlSessionFactory 29 sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 30 } 31 32 @Test 33 public void testFindUserById() throws Exception { 34 UserDao userDao = new UserDaoImpl(sqlSessionFactory); 35 User user = userDao.findUserById(1001); 36 // System.out.println(user.toString()); 37 38 List<User> userList = userDao.findUserList("lee"); 39 40 if (!userList.isEmpty()) { 41 for (User u : userList) { 42 System.out.println(u.toString()); 43 } 44 } 45 } 46 47 @Test 48 public void insertUser() throws Exception { 49 UserDao userDao = new UserDaoImpl(sqlSessionFactory); 50 51 User u1 = new User("nathan.lee.salvatore", 18, "男"); 52 User u2 = new User("nathan", 22, "男"); 53 User u3 = new User("leechenxiang", 20, "男"); 54 User u4 = new User("李晨翔", 19, "男"); 55 56 userDao.insertUser(u1); 57 userDao.insertUser(u2); 58 userDao.insertUser(u3); 59 userDao.insertUser(u4); 60 } 61 62 @Test 63 public void deleteUser() throws Exception { 64 UserDao userDao = new UserDaoImpl(sqlSessionFactory); 65 userDao.deleteUser(1013); 66 } 67 68 @Test 69 public void updateUser() throws Exception { 70 UserDao userDao = new UserDaoImpl(sqlSessionFactory); 71 User user = new User("李斯涵", 1, "女"); 72 user.setId(1001); 73 userDao.updateUser(user); 74 } 75 }
最后附上github地址:https://github.com/leechenxiang/mybatis001