mybatis 一二事(1) - 简单介绍
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配置都在这个文件里
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 和spring整合后 environments配置将废除-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments> <!-- 配置mapper映射文件 -->
<mappers>
<mapper resource="sqlmap/User.xml"/>
</mappers>
</configuration>
User.xml 这个文件就是正对user实体进行的相关查询,命名同User.java
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace命名空间特殊作用: 如果使用mapper动态代理方法,这里就需要配置mapper接口地址--> <mapper namespace="test">
<!-- 根据用户id查询一条记录(返回单条记录) -->
<!--
select标签表示sql查询,内容会封装到Mapped Statement中。
可以将这个select标签称为一个Statement
id:Statement的id,用于标识select中定义的 sql,id是在同一个命名空间中不允许重复
#{}:表示一个占位符,避免sql注入
parameterType:表示输入参数的类型
resultType:表示输出 结果集单条记录映射的java对象类型,select查询的字段名和resultType中属性名一致,才能映射成功。
#{value}:value表示parameter输入参数的变量,如果输入参数是简单类型,使用#{}占位符,变量名可以使用value或其它的名称 -->
<select id="findUserById" parameterType="int" resultType="com.mybatis001.bean.User"> SELECT * FROM USER WHERE id = #{id} </select> <!-- 查询用户列表(返回list集合) -->
<!--
不管结果集查询一条还是多条,resultType指定结果集单条记录映射的java对象类型
${}:表示sql拼接,相当于sql字符串拼接,无法避免sql注入
${value}:value表示parameter输入参数的变量,如果输入参数是简单类型,使用${}拼接符,变量名必须使用value
${value}直接 将value获取到拼接在sql中,value值不加任何修饰
-->
<select id="findUserList" parameterType="java.lang.String" resultType="com.mybatis001.bean.User" >
select * from user where name like '%${value}%'
</select> <!-- 添加用户
parameterType:如果parameterType指定 是pojo,在#{}中指定 pojo的属性名获取该pojo的属性值
-->
<insert id="insertUser" parameterType="com.mybatis001.bean.User"> <!--
keyProperty:将主键设置到pojo中哪个属性中
order:selectKey中sql执行的时机
resultType:selectKey中sql执行的结果类型
LAST_INSERT_ID:是insert后获取自增主键值
-->
<!-- 这样的写法,在执行后,会再user这个entity中设置id的值 -->
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
select LAST_INSERT_ID()
</selectKey> insert into user(name,age,sex) values(#{name},#{age},#{sex})
</insert> <!-- 根据主键删除用户 --> <delete id="deleteUser" parameterType="int">
delete from user where id=#{id}
</delete> <!-- 根据主键用户更新
更新传入输入参数见容:id和更新的信息
-->
<update id="updateUser" parameterType="com.mybatis001.bean.User">
update user set name=#{name},age=#{age},sex=#{sex} where id=#{id}
</update> </mapper>
User.java
package com.mybatis001.bean; public class User { private int id;
private String name;
private int age;
private String sex; public User() {
super();
} public User(String name, int age, String sex) {
super();
this.name = name;
this.age = age;
this.sex = sex;
} public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
} @Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", age=" + age + ", sex="
+ sex + "]";
} }
UserDao.java
package com.mybatis001.dao; import java.util.List; import com.mybatis001.bean.User; public interface UserDao { public User findUserById(int id) throws Exception; public List<User> findUserList(String name) throws Exception; public Integer insertUser(User user) throws Exception; public void deleteUser(int id) throws Exception; public void updateUser(User user) throws Exception; }
UserDaoImpl.java
package com.mybatis001.dao.impl; import java.util.List; import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory; import com.mybatis001.bean.User;
import com.mybatis001.dao.UserDao; public class UserDaoImpl implements UserDao { // 注入SqlSessionFactory
private SqlSessionFactory sqlSessionFactory; public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
} @Override
public User findUserById(int id) throws Exception { // 根据SqlSessionFactory创建SqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // 通过sqlSession查询用户信息(发起数据库操作)
// 第一个参数statement:指定mapper映射文件中statement的id,指定 时需要前边加上statement所属的命名空间
// 第二个参数parameter,指定 输入参数
// selectOne返回的是单条记录,如果select返回多条记录(list集合),使用selectOne会报错
// 根据映射文件中的resultType指定输出类型
User user = sqlSession.selectOne("test.findUserById", id);
return user;
} @Override
public List<User> findUserList(String name) throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
List<User> userList = sqlSession.selectList("test.findUserList", name);
return userList;
} @Override
public Integer insertUser(User user) throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
int lastUserId = sqlSession.insert("test.insertUser", user); sqlSession.commit();
sqlSession.close();
return lastUserId;
} @Override
public void deleteUser(int id) throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
sqlSession.delete("test.deleteUser", id);
sqlSession.commit();
sqlSession.close();
} @Override
public void updateUser(User user) throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
sqlSession.update("test.updateUser", user);
sqlSession.commit();
sqlSession.close();
} }
测试:
package com.test.mybatis001; import java.io.InputStream;
import java.util.List; import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test; import com.mybatis001.bean.User;
import com.mybatis001.dao.UserDao;
import com.mybatis001.dao.impl.UserDaoImpl; public class UserDaoImplTest { // 会话工厂
private SqlSessionFactory sqlSessionFactory; @Before
public void setUp() throws Exception {
// 加载配置文件
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource); // 根据mytais的配置创建SqlSessionFactory
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} @Test
public void testFindUserById() throws Exception {
UserDao userDao = new UserDaoImpl(sqlSessionFactory);
User user = userDao.findUserById(1001);
// System.out.println(user.toString()); List<User> userList = userDao.findUserList("lee"); if (!userList.isEmpty()) {
for (User u : userList) {
System.out.println(u.toString());
}
}
} @Test
public void insertUser() throws Exception {
UserDao userDao = new UserDaoImpl(sqlSessionFactory); User u1 = new User("nathan.lee.salvatore", 18, "男");
User u2 = new User("nathan", 22, "男");
User u3 = new User("leechenxiang", 20, "男");
User u4 = new User("李晨翔", 19, "男"); userDao.insertUser(u1);
userDao.insertUser(u2);
userDao.insertUser(u3);
userDao.insertUser(u4);
} @Test
public void deleteUser() throws Exception {
UserDao userDao = new UserDaoImpl(sqlSessionFactory);
userDao.deleteUser(1013);
} @Test
public void updateUser() throws Exception {
UserDao userDao = new UserDaoImpl(sqlSessionFactory);
User user = new User("李斯涵", 1, "女");
user.setId(1001);
userDao.updateUser(user);
}
}
最后附上github地址:https://github.com/leechenxiang/mybatis001
mybatis 一二事(1) - 简单介绍的更多相关文章
- Hadoop 一二事(1) - 简单介绍与杂谈
大数据大数据,身边很多朋友都在谈大数据,Big Data!!! 到底是什么,用来干嘛的,也很少有人说得出一二,那今天开始就简单说说这一二事吧 hadoop 的来源:是作者女儿的一个玩具 - 一只黄色的 ...
- nginx 与 tomcat 集群 一二事 (0) - 简单介绍
最近看了nginx以及tomcat的集群,通俗的做一下简单总结吧 nginx 是一个http服务器,是由俄罗斯人发明的,目前主流的服务器,作为负载均衡服务器,性能非常好,最高支持5万个并发连接数,在淘 ...
- nginx 一二事(1) - 简单图片服务器解决方案
最近经常有人问图片上传怎么做,有哪些方案做比较好,也看到过有关于上传图片的做法,但是都不是最好的 今天再这里简单讲一下上传图片以及图片服务器的大致理念 如果是个人项目或者企业小项目,仅仅只有十来号人使 ...
- Mybatis generator生成工具简单介绍
Mybatis generator 其主要的功能就是方便,快捷的创建好Dao,entry,xml 加快了开发速度,使用方面根据其提供的规则配置好就OK 这里还有一个重要的开发场景,开发过程中,对数据 ...
- mybatis 一二事(3) - 多表关联查询
db.properties jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/order jdbc.user ...
- mybatis 一二事(2) - 动态代理
db.properties 单独提取出来的数据库配置,方便以后维护管理 jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhos ...
- [原创]关于mybatis中一级缓存和二级缓存的简单介绍
关于mybatis中一级缓存和二级缓存的简单介绍 mybatis的一级缓存: MyBatis会在表示会话的SqlSession对象中建立一个简单的缓存,将每次查询到的结果结果缓存起来,当下次查询的时候 ...
- 关于mybatis中一级缓存和二级缓存的简单介绍
关于mybatis中一级缓存和二级缓存的简单介绍 mybatis的一级缓存: MyBatis会在表示会话的SqlSession对象中建立一个简单的缓存,将每次查询到的结果结果缓存起来,当下次查询的时候 ...
- iOS开发——UI精选OC篇&UIApplication,UIWindow,UIViewController,UIView(layer)简单介绍
UIApplication,UIWindow,UIViewController,UIView(layer)简单介绍 一:UIApplication:单例(关于单例后面的文章中会详细介绍,你现在只要知道 ...
随机推荐
- 自己的一个js库
https://github.com/sqqihao/nono_framework.git 持续更新,慢慢写着,这样才能成长
- 如何不使用pthread_cancel而杀死线程
http://www.cnblogs.com/no7dw/archive/2012/09/27/2705847.html During the time I use standalone cross ...
- Scalatra文件下载时中文乱码
可以采用Servlet平台的解决方法进行解决: Ok(file.get, Map( "Content-Type" -> (file.contentType.getOrElse ...
- Android的startActivityForResult不起作用
之前startActivityForResult一直用的好好的,今天发现怎么也不起作用.检查后发现有两点影响了. 1.android:launchMode="singleTask" ...
- 解决 /dev/mapper/* 100%
1.查看大文件位置du -sh /* | sort -nr 2.分析,处理文件
- java 图片数据Base64编解码
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import ...
- hdu5246 超级赛亚ACMer
Problem Description 百小度是一个ACMer,也是一个超级赛亚人,每一个ACMer都有一个战斗力.包含百小度. 所谓超级赛亚人的定义,是说假设在对抗中刚好接近极限状态,那就会激发斗志 ...
- yml在线格式转换工具(properties)
分享一个在线properties 转 yml工具,也支持yml转properties, 域名非常简单好记,直接在地址栏里输入toyaml.com,地址:http://toyaml.com/ yml,即 ...
- eclipse cdt Program "make" not found in PATH
eclipse cdt插件,开发c/c++程序,编译时报错Program "make" not found in PATH经查C:\MinGW\bin下确实无make.exe,有m ...
- Lucene使用与优化(转)
原文链接:http://blog.csdn.net/hongfu_/article/details/1933346 本文所使用的Lucene版本较低,年代久远,许多API可能已经变了. 1 lucen ...