mybatis参考网址:http://www.mybatis.org/mybati...html
Github源码地址:https://github.com/mybatis/my...java
MyBatis 是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis 避免了几乎全部的 JDBC代码和手动设置参数以及获取结果集,它可使用简单的XML或注解来配置和映射SQL信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。mysql
对象-关系映射(OBJECT/RELATIONALMAPPING,简称ORM),是随着面向对象的软件开发方法发展而产生的。用来把对象模型表示的对象映射到基于SQL 的关系模型数据库结构中去。这样,咱们在具体的操做实体对象的时候,就不须要再去和复杂的 SQL 语句打交道,只需简单的操做实体对象的属性和方法 。ORM 技术是在对象和关系之间提供了一条桥梁,前台的对象型数据和数据库中的关系型的数据经过这个桥梁来相互转化。git
对比项 | Mybatis | Hibernate |
---|---|---|
市场占有率 | 高 | 高 |
适合的行业 | 互联网 电商 项目 | 传统的(ERP CRM OA) |
性能 | 高 | 低 |
Sql灵活性 | 高 | 低 |
学习门槛 | 低 | 高 |
Sql配置文件 | 全局配置文件、映射文件 | 全局配置文件、映射文件 |
ORM | 半自动化 | 彻底的自动化 |
数据库无关性 | 低 | 高 |
一、根据用户id查询一个用户信息github
二、根据用户名称模糊查询用户信息列表sql
三、添加用户数据库
<dependencies> <!-- mybatis依赖 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency> <!-- mysql依赖 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.35</version> </dependency> <!-- 单元测试 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies>
<?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> <properties resource="db.properties"></properties> <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="${db.driver}" /> <property name="url" value="${db.url}" /> <property name="username" value="${db.username}" /> <property name="password" value="${db.password}" /> </dataSource> </environment> </environments> <mappers> <mapper resource="UserMapper.xml" /> </mappers> </configuration>
<?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"> <mapper namespace="test"> </mapper>
public class User { private int id; private String username; private Date birthday; private String sex; private String address; // getter\setter方法 }
<!-- 根据id获取用户信息 --> <select id="findUserById" parameterType="int" resultType="com.kkb.mybatis.po.User"> select * from user where id = #{id} </select> <!-- 根据名称模糊查询用户列表 --> <select id="findUserByUsername" parameterType="java.lang.String" resultType="com.kkb.mybatis.po.User"> select * from user where username like '%${value}%' </select>
配置说明:apache
- parameterType:定义输入参数的Java类型, - resultType:定义结果映射类型。 - #{}:至关于JDBC中的?占位符 - #{id}表示使用preparedstatement设置占位符号并将输入变量id传到sql。 - ${value}:取出参数名为value的值。将${value}占位符替换。 注意:若是是取简单数量类型的参数,括号中的参数名称必须为value
public interface UserDao { public User findUserById(int id) throws Exception; public List<User> findUsersByName(String name) throws Exception; }
public class UserDaoImpl implements UserDao { //注入SqlSessionFactory public UserDaoImpl(SqlSessionFactory sqlSessionFactory){ this. sqlSessionFactory = sqlSessionFactory; } private SqlSessionFactory sqlSessionFactory; @Override public User findUserById(int id) throws Exception { SqlSession session = sqlSessionFactory.openSession(); User user = null; try { //经过sqlsession调用selectOne方法获取一条结果集 //参数1:指定定义的statement的id,参数2:指定向statement中传递的参数 user = session.selectOne("test.findUserById", id); System.out.println(user); } finally{ session.close(); } return user; } @Override public List<User> findUsersByName(String name) throws Exception { SqlSession session = sqlSessionFactory.openSession(); List<User> users = null; try { users = session.selectList("test.findUsersByName", name); System.out.println(users); } finally{ session.close(); } return users; } }
public class MybatisTest { private SqlSessionFactory sqlSessionFactory; @Before public void init() throws Exception { SqlSessionFactoryBuilder sessionFactoryBuilder = new SqlSessionFactoryBuilder(); InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml"); sqlSessionFactory = sessionFactoryBuilder.build(inputStream); } @Test public void testFindUserById() { UserDao userDao = new UserDaoImpl(sqlSessionFactory); User user = userDao.findUserById(22); System.out.println(user); } @Test public void testFindUsersByName() { UserDao userDao = new UserDaoImpl(sqlSessionFactory); List<User> users = userDao.findUsersByName("老郭"); System.out.println(users); } }
#{} :至关于JDBC SQL语句中的占位符? (PreparedStatement) ${} : 至关于JDBC SQL语句中的链接符合 + (Statement)
#{} : 进行输入映射的时候,会对参数进行类型解析(若是是String类型,那么SQL语句会自动加上’’) ${} :进行输入映射的时候,将参数原样输出到SQL语句中
#{} : 若是进行简单类型(String、Date、8种基本类型的包装类)的输入映射时,#{}中参数名称能够任意 ${} : 若是进行简单类型(String、Date、8种基本类型的包装类)的输入映射时,${}中参数名称必须是value
${} :存在SQL注入问题 ,使用OR 1=1 关键字将查询条件忽略
#{}:是经过反射获取数据的---StaticSqlSource session
${}:是经过OGNL表达式会随着对象的嵌套而相应的发生层级变化 --DynamicSqlSourcemybatis
<!-- 添加用户 --> <insert id="insertUser" parameterType="com.kkb.mybatis.po.User"> insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address}) </insert>
public interface UserDao { public void insertUser(User user) throws Exception; }
public class UserDaoImpl implements UserDao { //注入SqlSessionFactory public UserDaoImpl(SqlSessionFactory sqlSessionFactory){ this. sqlSessionFactory = sqlSessionFactory; } private SqlSessionFactory sqlSessionFactory; @Override Public void insertUser(User user) throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); try { sqlSession.insert("test.insertUser", user); sqlSession.commit(); } finally{ session.close(); } } }
@Override Public void insertUser(User user) throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); try { sqlSession.insert("insertUser", user); sqlSession.commit(); } finally{ session.close(); } }
<insert id="insertUser" parameterType="com.kkb.mybatis.po.User"> <!-- selectKey将主键返回,须要再返回 --> <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer"> select LAST_INSERT_ID() </selectKey> insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address}); </insert>
添加selectKey标签实现主键返回。