-- 建立数据库 CREATE DATABASE mybatis; -- 使用数据库 USE mybatis; -- 删除表 DROP TABLE IF EXISTS user; -- 建立表 CREATE TABLE `user` ( `id` int(11) NOT NULL auto_increment, `username` varchar(32) NOT NULL COMMENT '用户名称', `birthday` datetime default NULL COMMENT '生日', `sex` char(1) default NULL COMMENT '性别', `address` varchar(256) default NULL COMMENT '地址', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- 插入数据 insert into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (41,'张三','2019-03-27 18:47:08','男','北京'); insert into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (42,'李四','2019-03-27 18:47:08','男','上海'); insert into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (43,'王五','2019-03-27 18:47:08','男','广州');
File -> New -> Modulejava
Maven -> Module SDK -> Nextmysql
Finishsql
导入坐标数据库
import java.sql.*; public class TestJdbc { public static void main(String args[]) { Connection connection = null; PreparedStatement preparedStatement = null; ResultSet resultSet = null; try { //1. 加载驱动 Class.forName("com.mysql.jdbc.Driver"); //2. 获取链接 String url = "jdbc:mysql://localhost:3306/mybatis"; String username = "root"; String password = "root"; connection = DriverManager.getConnection(url, username, password); //3. 获取预处理对象 String sql = "SELECT * FROM user WHERE id = ?"; preparedStatement = connection.prepareStatement(sql); // 设置参数 preparedStatement.setInt(1,41); // 执行查询 resultSet = preparedStatement.executeQuery(); // 处理结果集 while (resultSet.next()) { System.out.println(resultSet.getString("username")); System.out.println(resultSet.getDate("birthday")); System.out.println(resultSet.getString("sex")); System.out.println(resultSet.getString("address")); } }catch (Exception ex) { ex.printStackTrace(); }finally { try { // 关闭链接,释放资源 if (resultSet != null) { resultSet.close(); } if (preparedStatement != null) { preparedStatement.close(); } if (connection != null) { connection.close(); } }catch (SQLException ex) { ex.printStackTrace(); } } } }
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,而且更名为MyBatis 。
-- 建立数据库 CREATE DATABASE mybatis; -- 使用数据库 USE mybatis; -- 删除表 DROP TABLE IF EXISTS user; -- 建立表 CREATE TABLE `user` ( `id` int(11) NOT NULL auto_increment, `username` varchar(32) NOT NULL COMMENT '用户名称', `birthday` datetime default NULL COMMENT '生日', `sex` char(1) default NULL COMMENT '性别', `address` varchar(256) default NULL COMMENT '地址', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- 插入数据 insert into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (41,'张三','2019-03-27 18:47:08','男','北京'); insert into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (42,'李四','2019-03-27 18:47:08','男','上海'); insert into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (43,'王五','2019-03-27 18:47:08','男','广州');
File -> New -> Moduleapache
Maven -> Module SDK -> Next编程
Finishmybatis
导入坐标架构
import java.io.Serializable; import java.util.Date; public class User implements Serializable { private Integer id; private String username; private Date birthday; private String sex; private String address; public User() { } public User(Integer id, String username, Date birthday, String sex, String address) { this.id = id; this.username = username; this.birthday = birthday; this.sex = sex; this.address = address; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", birthday=" + birthday + ", sex='" + sex + '\'' + ", address='" + address + '\'' + '}'; } }
public interface UserDao { /** * 查询全部用户 * @return */ List<User> findAll(); }
<?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> <!-- 环境,能够配置多个,default:指定采用哪一个环境 --> <environments default="development"> <!-- id:environment的惟一标识 --> <environment id="development"> <!-- 事务管理器,JDBC类型的事务管理器 --> <transactionManager type="JDBC"></transactionManager> <!-- 数据源,池类型的数据源 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <!-- 映射配置文件 --> <mappers> <mapper resource="com/mybatis/dao/UserDao.xml"></mapper> </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="com.mybatis.dao.UserDao"> <select id="findAll" resultType="com.mybatis.domain.User"> SELECT * FROM user; </select> </mapper>
public class MybatisTest { /** * 入门案例测试类 * @param args */ public static void main(String[] args) throws Exception{ //1. 读取配置文件 InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml"); //2. 获取SqlSessionFactoryBuilder对象 SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); //3. 获取SqlSessionFactory对象 SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream); //4. 获取SqlSession对象 SqlSession sqlSession = sqlSessionFactory.openSession(); //5. 获取接口的代理对象 UserDao userDao = sqlSession.getMapper(UserDao.class); //6. 使用代理对象执行方法 List<User> userList = userDao.findAll(); for (User user : userList) { System.out.println(user); } //7. 释放资源 sqlSession.close(); inputStream.close(); } }
User{id=41, username='张三', birthday=Wed Mar 27 18:47:08 CST 2019, sex='男', address='北京'} User{id=42, username='李四', birthday=Wed Mar 27 18:47:08 CST 2019, sex='男', address='上海'} User{id=43, username='王五', birthday=Wed Mar 27 18:47:08 CST 2019, sex='男', address='广州'}
1.准备数据
2.搭建maven工程,导入坐标
3.建立数据表对应的pojo与dao接口
4.建立Mybatis的主配置文件与映射配置文件
5.建立测试类app
File -> New -> Moduledom
Maven -> Module SDK -> Next
Finish
导入坐标
import java.io.Serializable; import java.util.Date; public class User implements Serializable { private Integer id; private String username; private Date birthday; private String sex; private String address; public User() { } public User(Integer id, String username, Date birthday, String sex, String address) { this.id = id; this.username = username; this.birthday = birthday; this.sex = sex; this.address = address; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", birthday=" + birthday + ", sex='" + sex + '\'' + ", address='" + address + '\'' + '}'; } }
import java.io.Serializable; public class QueryVo implements Serializable { private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } @Override public String toString() { return "QueryVo{" + "user=" + user + '}'; } }
public interface UserDao { /** * 查询全部 * @return */ List<User> findAll(); /** * 保存用户 * @param user */ void saveUser(User user); /** * 更新用户 * @param user */ void updateUser(User user); /** * 删除用户 * @param id */ void deleteUser(Integer id); /** * 根据id查询用户 * @param id */ User findById(Integer id); /** * 根据名称模糊查询 * @param username * @return */ List<User> findByUsername(String username); /** * 查询用户的总记录数 * @return */ Integer findTotal(); /** * 根据pojo查询用户 */ List<User> findByQueryVo(QueryVo queryVo); }
<?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> <!-- 环境,能够配置多个,default:指定采用哪一个环境 --> <environments default="development"> <!-- id:environment的惟一标识 --> <environment id="development"> <!-- 事务管理器,JDBC类型的事务管理器 --> <transactionManager type="JDBC"></transactionManager> <!-- 数据源,池类型的数据源 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <!-- 映射配置文件 --> <mappers> <mapper resource="com/mybatis/dao/UserDao.xml"></mapper> </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="com.mybatis.dao.UserDao"> <!-- 查询全部 --> <select id="findAll" resultType="com.mybatis.domain.User"> SELECT * FROM user </select> <!-- 保存用户 --> <insert id="saveUser" parameterType="com.mybatis.domain.User"> INSERT INTO user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address}) </insert> <!-- 更新用户 --> <update id="updateUser" parameterType="com.mybatis.domain.User"> UPDATE user SET username = #{username}, birthday = #{birthday}, sex = #{sex}, address = #{address} WHERE id = #{id} </update> <!-- 删除用户 --> <delete id="deleteUser" parameterType="java.lang.Integer"> DELETE FROM user WHERE id = #{id} <!-- 当只有一个参数时,参数名称能够任意 --> </delete> <!-- 根据id查询用户 --> <select id="findById" parameterType="java.lang.Integer" resultType="com.mybatis.domain.User"> SELECT * FROM user WHERE id = #{id} </select> <!-- 根据名称模糊查询 --> <select id="findByUsername" parameterType="java.lang.String" resultType="com.mybatis.domain.User"> SELECT * FROM user WHERE username LIKE #{%username%} </select> <!-- 查询用户的总记录数 --> <select id="findTotal" resultType="java.lang.Integer"> SELECT COUNT(id) FROM user </select> <!-- 根据pojo查询用户 --> <select id="findByQueryVo" parameterType="com.mybatis.domain.QueryVo" resultType="com.mybatis.domain.User"> SELECT * FROM user WHERE username = #{user.username} </select> </mapper>
public class MybatisTest { private InputStream inputStream; private SqlSessionFactoryBuilder sqlSessionFactoryBuilder; private SqlSessionFactory sqlSessionFactory; private SqlSession sqlSession; private UserDao userDao; @Before public void init() throws Exception{ //1. 读取配置文件 this.inputStream = Resources.getResourceAsStream("SqlMapConfig.xml"); //2. 获取SqlSessionFactoryBuilder this.sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); //3. 获取SqlSessionFactory this.sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream); //4. 获取SqlSession this.sqlSession = sqlSessionFactory.openSession(); //5. 获取接口的代理对象 this.userDao = sqlSession.getMapper(UserDao.class); } @After public void destroy() throws Exception{ //8. 提交事务 sqlSession.commit(); //9. 关闭资源 sqlSession.close(); inputStream.close(); } /** * 查询全部 */ @Test public void testFindAll() throws Exception { List<User> userList = this.userDao.findAll(); for (User user : userList) { System.out.println(user); } } /** * 保存用户 */ @Test public void testSaveUser() throws Exception { //6. 利用代理对象调用接口中的方法 User user = new User(); user.setUsername("找老刘"); user.setBirthday(new Date()); user.setSex("男"); user.setAddress("上海陆家嘴"); this.userDao.saveUser(user); } /** * 更新用户 */ @Test public void testUpdateUser() throws Exception { User user = new User(); user.setId(53); user.setUsername("王五"); user.setBirthday(new Date()); user.setSex("男"); user.setAddress("香格里拉"); userDao.updateUser(user); } /** * 删除用户 */ @Test public void testDeleteUser() throws Exception { userDao.deleteUser(53); } /** * 根据id查询用户 */ @Test public void testFindById() throws Exception { User user = userDao.findById(51); System.out.println(user); } /** * 根据名称模糊查询 */ @Test public void testFindByUsername() throws Exception { List<User> userList = userDao.findByUsername("老王"); for (User user : userList) { System.out.println(user); } } /** * 查询用户的总记录数 */ @Test public void testFindTotal() throws Exception { Integer total = userDao.findTotal(); System.out.println(total); } /** * 根据pojo查询用户 */ @Test public void testFindByQueryVo() throws Exception { User user = new User(); user.setUsername("tom"); QueryVo queryVo = new QueryVo(); queryVo.setUser(user); List<User> userList = userDao.findByQueryVo(queryVo); for (User u : userList) { System.out.println(u); } } }
-- 执行findAll() User{id=41, username='张三', birthday=Wed Mar 27 18:47:08 CST 2019, sex='男', address='北京'} User{id=42, username='李四', birthday=Wed Mar 27 18:47:08 CST 2019, sex='男', address='上海'} User{id=43, username='王五', birthday=Wed Mar 27 18:47:08 CST 2019, sex='男', address='广州'}
MyBatis主配置文件中的properties元素的propertie子元素的value属性的值,便可以直接定义,也能够在主配置文件中定义而后引用,也能够引用外部的properties文件。举例子来讲就是,以下的两个xml的配置效果是同样的。
<?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> <environments default="development"> <environment id="development"> <transactionManager type="jdbc"></transactionManager> <dataSource type="pooled"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/eesy"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/mybatis/dao/UserDao.xml"></mapper> </mappers> </configuration>
<?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> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/eesy"/> <property name="username" value="root"/> <property name="password" value="root"/> </properties> <environments default="development"> <environment id="development"> <transactionManager type="jdbc"></transactionManager> <dataSource type="pooled"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/mybatis/dao/UserDao.xml"></mapper> </mappers> </configuration>
以上两种形式,在开发过程当中通常不会这么用。通常是直接类路径下(在maven工程下就是resources目录下)定义一个properties文件,而后在MyBatis的主配置文件中引用该文件,而后就能够在主配置文件中直接引用。以下所示:
jdbc.driver = com.mysql.jdbc.Driver jdbc.url = jdbc:mysql://localhost:3306/mybatis jdbc.username = root jdbc.password = root
<?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="datasource.properties"></properties> <environments default="development"> <environment id="development"> <transactionManager type="jdbc"></transactionManager> <dataSource type="pooled"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/mybatis/dao/UserDao.xml"></mapper> </mappers> </configuration>
若是属性在不仅一个地方进行了配置,那么 MyBatis 将按照下面的顺序来加载:
在MyBatis的映射配置文件中(也就是接口对应的XxxMapper.xml文件),每当指定一个java类的所属类型时,都须要拼写出该类的全限定类名。例以下面的xml配置所示。
<?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="com.mybatis.dao.UserDao"> <!-- 查询全部 --> <select id="findAll" resultType="com.mybatis.domain.User"> SELECT * FROM user </select> <!-- 保存用户 --> <insert id="saveUser" parameterType="com.mybatis.domain.User"> INSERT INTO user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address}) </insert> </mapper>
如上这样配置存在一个问题,当配置文件少的时候还好,若是配置文件的数量一旦增多,就会致使工做量激增。因此就有了给java类的全限定类名取一个简短的别名,用别名代替全限定类名,减小没必要要的工做量。具体操做以下。
主配置文件中使用typeAliases标签为pojo的全限定类名去一个别名,而后把映射配置文件中pojo的全限定类名替换成别名便可。别名能够任意,且当使用了别名后,别名将不区分大小写。具体配置以下。
主配置文件
<?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> <!-- 注意configuration下的子标签严格区分定义顺序(使用顺序) --> <properties resource="datasource.properties"></properties> <typeAliases> <!-- type:用于指定pojo的全限定类名; alias:用于指定别名 --> <typeAlias type="com.mybatis.domain.User" alias="user"></typeAlias> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="jdbc"></transactionManager> <dataSource type="pooled"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/mybatis/dao/UserDao.xml"></mapper> </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="com.mybatis.dao.UserDao"> <!-- 查询全部 --> <!-- 使用了别名后pojo的别名不区分大小写 --> <select id="findAll" resultType="user"> SELECT * FROM user </select> <!-- 保存用户 --> <insert id="saveUser" parameterType="User"> INSERT INTO user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address}) </insert> </mapper>
以上操做虽然已经能极大的简化咱们的开发,可是,一个项目中不可能只有一两个pojo。因此若是咱们要使用上述的方式指定定义一个项目中全部pojo的话也不现实。typeAliases下除了typeAlias子标签外,还有一个package子标签,该标签的做用是为某个指定的包下全部的pojo一块儿取别名,默认类名即为别名。具体以下所示。
<?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> <!-- 注意configuration下的子标签严格区分定义顺序(使用顺序) --> <properties resource="datasource.properties"></properties> <typeAliases> <!-- type:用于指定pojo的全限定类名; alias:用于指定别名 --> <typeAlias type="com.mybatis.domain.User" alias="user"></typeAlias> <!-- 为com.mybatis.domain子包下的pojo一块儿取别名,别名即为类名 --> <package name="com.mybatis.domain"/> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="jdbc"></transactionManager> <dataSource type="pooled"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/mybatis/dao/UserDao.xml"></mapper> </mappers> </configuration>
<select id="findById" parameterType="java.lang.Integer" resultType="com.mybatis.domain.User"> SELECT * FROM user WHERE id = #{id} </select>
属性说明
<insert id="saveUser" useGeneratedKeys="true" keyColumn="id" keyProperty="id" parameterType="com.mybatis.domain.User"> INSERT INTO user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address}) </insert>
属性说明
<update id="updateUser" parameterType="com.mybatis.domain.User"> UPDATE user SET username = #{username}, birthday = #{birthday}, sex = #{sex}, address = #{address} WHERE id = #{id} </update>
属性说明
<delete id="deleteUser" parameterType="java.lang.Integer"> <!-- 当只有一个参数时,参数名称能够任意 --> DELETE FROM user WHERE id = #{id} </delete>
属性说明